Vue实现剪切板图片压缩功能


Posted in Javascript onFebruary 04, 2020

监听剪切板粘贴事件,读取剪切板中的图片文件,转成base64通过img标签显示出来,此时可能会存在剪切板中图片过大,产生上传速度慢问题,接下来就跟大家分享下如何将base64图片进行压缩。先跟大家展示下最终实现的效果:

Vue实现剪切板图片压缩功能

实现思路

  • 监听剪切板粘贴事件
  • 从事件回调中获取clipboardData中的image对象声明一个变量接收该对象
  • 使用reader.readAsDataURL方法加载clipboardData中的image对象
  • 在reader.onload回调中获取图片base64码
  • 创建Image对象,赋值图片base64码至当前对象的src属性
  • 调用Image对象的onload函数,获取图片宽高等信息
  • 声明canvas画布宽高分别为当前图片宽高除以缩放比例的值
  • 使用drawImage方法绘制当前图片

实现过程

本篇文章主要讲解剪切板图片压缩的实现,效果图中如何将剪切板的图片插入可编辑div以及如何发送,请移步我的另一篇文章: Vue解析剪切板图片并实现发送功能

监听剪切板粘贴事件: 实现图片粘贴

const that = this;
  document.body.addEventListener('paste', function (event) {
    that.$fullScreenLoading.show("读取图片中");
    // 获取当前输入框内的文字
    const oldText = that.$refs.msgInputContainer.textContent;
    // 读取图片
    let items = event.clipboardData && event.clipboardData.items;
    let file = null;
    if (items && items.length) {
      // 检索剪切板items
      for (let i = 0; i < items.length; i++) {
        if (items[i].type.indexOf('image') !== -1) {
          file = items[i].getAsFile();
          break;
        }
      }
    }
    // 预览图片
    const reader = new FileReader();
    reader.onload = function(event) {
      // 图片内容
      const imgContent = event.target.result;
      // 创建img标签
      let img = document.createElement('img');//创建一个img
      // 获取当前base64图片信息,计算当前图片宽高以及压缩比例
      let imgObj = new Image();
      let imgWidth = "";
      let imgHeight = "";
      let scale = 1;
      imgObj.src = imgContent;
      imgObj.onload = function() {
        // 计算img宽高
        if(this.width<400){
          imgWidth = this.width;
          imgHeight = this.height;
        }else{
          // 输入框图片显示缩小10倍
          imgWidth = this.width/10;
          imgHeight = this.height/10;
          // 图片宽度大于1920,图片压缩5倍
          if(this.width>1920){
            // 真实比例缩小5倍
            scale = 5;
          }
        }
        // 设置可编辑div中图片宽高
        img.width = imgWidth;
        img.height = imgHeight;
        // 压缩图片,渲染页面
        that.compressPic(imgContent,scale,function (newBlob,newBase) {
          // 删除可编辑div中的图片名称
          that.$refs.msgInputContainer.textContent = oldText;
          img.src = newBase; //设置链接
          // 图片渲染
          that.$refs.msgInputContainer.append(img);
          that.$fullScreenLoading.hide();
        });
      };
    };
    reader.readAsDataURL(file);
  });

实现base64图片压缩函数

// 参数: base64地址,压缩比例,回调函数(返回压缩后图片的blob和base64)
  compressPic:function(base64, scale, callback){
    const that = this;
    let _img = new Image();
    _img.src = base64;
    _img.onload = function() {
      let _canvas = document.createElement("canvas");
      let w = this.width / scale;
      let h = this.height / scale;
      _canvas.setAttribute("width", w);
      _canvas.setAttribute("height", h);
      _canvas.getContext("2d").drawImage(this, 0, 0, w, h);
      let base64 = _canvas.toDataURL("image/jpeg");
      // 当canvas对象的原型中没有toBlob方法的时候,手动添加该方法
      if (!HTMLCanvasElement.prototype.toBlob) {
        Object.defineProperty(HTMLCanvasElement.prototype, 'toBlob', {
          value: function (callback, type, quality) {
            let binStr = atob(this.toDataURL(type, quality).split(',')[1]),
              len = binStr.length,
              arr = new Uint8Array(len);
            for (let i = 0; i < len; i++) {
              arr[i] = binStr.charCodeAt(i);
            }
            callback(new Blob([arr], {type: type || 'image/png'}));
          }
        });
      }else{
        _canvas.toBlob(function(blob) {
          if(blob.size > 1024*1024){
            that.compressPic(base64, scale, callback);
          }else{
            callback(blob, base64);
          }
        }, "image/jpeg");
      }
    }
  }

上述代码github地址: chat-system

总结

以上所述是小编给大家介绍的Vue实现剪切板图片压缩功能,希望对大家有所帮助!

Javascript 相关文章推荐
Dojo之路:如何利用Dojo实现Drag and Drop效果
Apr 10 Javascript
JavaScript中String和StringBuffer的速度之争
Apr 01 Javascript
JS仿flash上传头像效果实现代码
Jul 18 Javascript
一个简单的js树形菜单
Dec 09 Javascript
使用jQuery内容过滤选择器选择元素实例讲解
Apr 18 Javascript
浅析JavaScript中的常用算法与函数
Nov 21 Javascript
利用Keydown事件阻止用户输入实现代码
Mar 11 Javascript
JavaScript中一个奇葩的IE浏览器判断方法
Apr 16 Javascript
微信小程序按钮点击跳转页面详解
May 06 Javascript
Vue formData实现图片上传
Aug 20 Javascript
vue自定义树状结构图的实现方法
Oct 18 Javascript
VUE前端从后台请求过来的数据进行转换数据结构操作
Nov 11 Javascript
Vue中keep-alive组件作用详解
Feb 04 #Javascript
WEB前端性能优化的7大手段详解
Feb 04 #Javascript
JavaScript对象属性操作实例解析
Feb 04 #Javascript
JavaScript this使用方法图解
Feb 04 #Javascript
解决微信小程序scroll-view组件无横向滚动的问题
Feb 04 #Javascript
JavaScript原型继承和原型链原理详解
Feb 04 #Javascript
JavaScript单线程和任务队列原理解析
Feb 04 #Javascript
You might like
十天学会php之第一天
2006/10/09 PHP
解析thinkphp import 文件内容变量失效的问题
2013/06/20 PHP
使用PHP把HTML生成PDF文件的几个开源项目介绍
2014/11/17 PHP
php基于mcrypt_encrypt和mcrypt_decrypt实现字符串加密解密的方法
2016/07/12 PHP
PHP时间日期增减操作示例【date strtotime实现加一天、加一月等操作】
2018/12/21 PHP
javascript实现动态增加删除表格行(兼容IE/FF)
2007/04/02 Javascript
基于jQuery试卷自动排版系统
2010/07/18 Javascript
JavaScript 操作table,可以新增行和列并且隔一行换背景色代码分享
2013/07/05 Javascript
JavaScript DOM节点添加示例
2014/07/16 Javascript
javascript数组去重的方法汇总
2015/04/14 Javascript
js点击按钮实现带遮罩层的弹出视频效果
2015/12/19 Javascript
JavaScript用构造函数如何获取变量的类型名
2016/12/23 Javascript
jQuery层级选择器实例代码
2017/02/06 Javascript
jQuery源码解读之extend()与工具方法、实例方法详解
2017/03/30 jQuery
原生js封装的ajax方法示例
2018/08/02 Javascript
JS中的防抖与节流及作用详解
2019/04/01 Javascript
使用 vue 实现灭霸打响指英雄消失的效果附demo
2019/05/06 Javascript
详解jQuery中的prop()使用方法
2020/01/05 jQuery
celery4+django2定时任务的实现代码
2018/12/23 Python
使用TensorFlow实现二分类的方法示例
2019/02/05 Python
pytorch 状态字典:state_dict使用详解
2020/01/17 Python
Python制作简易版小工具之计算天数的实现思路
2020/02/13 Python
python爬虫学习笔记之pyquery模块基本用法详解
2020/04/09 Python
Pytorch mask-rcnn 实现细节分享
2020/06/24 Python
使用Python将xmind脑图转成excel用例的实现代码(一)
2020/10/12 Python
用纯CSS3实现网页中常见的小箭头
2017/10/16 HTML / CSS
澳大利亚首屈一指的在线购物目的地:Kogan.com
2017/02/02 全球购物
新锐科技Java程序员面试题
2016/07/25 面试题
办公室副主任职责范本
2014/03/08 职场文书
中等生评语大全
2014/05/04 职场文书
银行爱岗敬业演讲稿
2014/05/05 职场文书
学院党的群众路线教育实践活动整改方案
2014/10/04 职场文书
地方课程教学计划
2015/01/19 职场文书
护士节慰问信
2015/02/15 职场文书
十个Python自动化常用操作,即拿即用
2021/05/10 Python
Vue鼠标滚轮滚动切换路由效果的实现方法
2021/08/04 Vue.js