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 相关文章推荐
JS input 数字验证代码
Jul 30 Javascript
jquery 3D球状导航的文章分类
Jul 06 Javascript
javascript 触发HTML元素绑定的函数
Sep 11 Javascript
js下判断 iframe 是否加载完成的完美方法
Oct 26 Javascript
javascript鼠标滑动评分控件完整实例
May 13 Javascript
JavaScript+html5 canvas绘制的圆弧荡秋千效果完整实例
Jan 26 Javascript
easyui下拉框动态级联加载的示例代码
Nov 29 Javascript
angularjs实现柱状图动态加载的示例
Dec 11 Javascript
9种使用Chrome Firefox 自带调试工具调试javascript技巧
Dec 22 Javascript
Vue之封装公用变量以及实现方式
Jul 31 Javascript
js实现批量删除功能
Aug 27 Javascript
Node.js实现断点续传
Jun 23 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
SSI指令
2006/11/25 PHP
hessian 在PHP中的使用介绍
2010/12/13 PHP
ThinkPHP3.2.2的插件控制器功能简述
2014/07/09 PHP
php获取发送给用户的header信息的方法
2015/03/16 PHP
smarty循环嵌套用法示例分析
2016/07/19 PHP
JavaScript 私有成员分析
2009/01/13 Javascript
网页右键ie不支持event.preventDefault和event.returnValue (需要加window)
2013/02/22 Javascript
IE8的JavaScript点击事件(onclick)不兼容的解决方法
2013/11/22 Javascript
express的中间件basicAuth详解
2014/12/04 Javascript
node.js中的fs.utimes方法使用说明
2014/12/15 Javascript
原生javascript实现DIV拖拽并计算重复面积
2015/01/02 Javascript
jquery easyui datagrid实现增加,修改,删除方法总结
2016/05/25 Javascript
xtemplate node.js 的使用方法实例解析
2016/08/22 Javascript
ReactNative页面跳转实例代码
2016/09/27 Javascript
微信小程序 UI与容器组件总结
2017/02/21 Javascript
electron demo项目npm install安装失败的解决方法
2018/02/06 Javascript
Vue递归组件+Vuex开发树形组件Tree--递归组件的简单实现
2019/04/01 Javascript
详解在React-Native中持久化redux数据
2019/05/22 Javascript
从0搭建vue-cli4脚手架
2020/06/17 Javascript
Python中格式化format()方法详解
2017/04/01 Python
Python调用C# Com dll组件实战教程
2017/10/12 Python
Python的numpy库中将矩阵转换为列表等函数的方法
2018/04/04 Python
详解python while 函数及while和for的区别
2018/09/07 Python
浅谈python图片处理Image和skimage的区别
2019/08/04 Python
Python运行DLL文件的方法
2020/01/17 Python
Python优秀开源项目Rich源码解析的流程分析
2020/07/06 Python
Pycharm调试程序技巧小结
2020/08/08 Python
Python类的继承super相关原理解析
2020/10/22 Python
Python 获取异常(Exception)信息的几种方法
2020/12/29 Python
Columbia Sportswear法国官网:全球户外品牌
2020/09/25 全球购物
马云北大演讲完整版:真心话,什么才是阿里的核心竞争力?
2014/04/04 职场文书
2015年安全生产目标责任书
2015/01/29 职场文书
工程部部长岗位职责
2015/02/12 职场文书
校长一岗双责责任书
2015/05/09 职场文书
2015小学师德工作总结
2015/07/21 职场文书
js中Object.create实例用法详解
2021/10/05 Javascript