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查找父节点的简单方法
Jun 28 Javascript
javascript 混合的构造函数和原型方式,动态原型方式
Dec 07 Javascript
jQuery随机切换图片的小例子
Apr 18 Javascript
js仿百度贴吧验证码特效实例代码
Jan 16 Javascript
关于Javascript加载执行优化的研究报告
Dec 16 Javascript
js实现浮动在网页右侧的简洁QQ在线客服代码
Sep 04 Javascript
使用jQuery Rotare实现微信大转盘抽奖功能
Jun 20 Javascript
使用Curl命令查看请求响应时间方法
Nov 04 Javascript
JavaScript中document.referrer的用法详解
Jul 04 Javascript
vue动态删除从数据库倒入列表的某一条方法
Sep 29 Javascript
纯javascript实现选择框的全选与反选功能
Apr 08 Javascript
JavaScript实现轮播图片完整代码
Mar 07 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
SONY ICF-F10中波修复记
2021/03/02 无线电
PHP中常用的输出函数总结
2014/09/22 PHP
使用PHP接受文件并获得其后缀名的方法
2015/08/05 PHP
php求今天、昨天、明天时间戳的简单实现方法
2016/07/28 PHP
php5对象复制、clone、浅复制与深复制实例详解
2019/08/14 PHP
基于jquery DOM写的类似微博发布的效果
2012/10/20 Javascript
Js中的onblur和onfocus事件应用介绍
2013/08/27 Javascript
javascript eval(func())使用示例
2013/12/05 Javascript
javascript操纵OGNL标签示例代码
2014/06/16 Javascript
JS实现点击文字对应DIV层不停闪动效果的方法
2015/03/02 Javascript
JavaScript中的子窗口与父窗口的互相调用问题
2017/02/08 Javascript
jquery请求servlet实现ajax异步请求的示例
2017/06/03 jQuery
微信小程序使用image组件显示图片的方法【附源码下载】
2017/12/08 Javascript
vue cli 全面解析
2018/02/28 Javascript
Vue+Mock.js模拟登录和表格的增删改查功能
2018/07/26 Javascript
微信小程序实现多选删除列表数据功能示例
2019/01/15 Javascript
[03:07]【DOTA2亚洲邀请赛】我们,梦开始的地方
2017/03/07 DOTA
深入理解Python中命名空间的查找规则LEGB
2015/08/06 Python
浅谈Python 递归算法指归
2019/08/22 Python
python支持多线程的爬虫实例
2019/12/21 Python
Pycharm如何导入python文件及解决报错问题
2020/05/10 Python
CSS3中使用RGBA设置透明度的示例
2015/08/04 HTML / CSS
AmazeUI框架搭建的方法步骤(图文)
2020/08/17 HTML / CSS
德国游戏机商店:Konsolenkost
2019/12/08 全球购物
万代美国官网:PREMIUM BANDAI USA
2020/09/11 全球购物
造价工程师个人求职信
2013/09/21 职场文书
新学期红领巾广播稿
2014/01/14 职场文书
演讲稿格式范文
2014/05/19 职场文书
简易离婚协议书范本
2014/10/24 职场文书
小学生学习保证书
2015/02/26 职场文书
酒桌上的祝酒词
2015/08/12 职场文书
社区志愿者服务心得体会
2016/01/22 职场文书
2016年先进班集体事迹材料
2016/02/26 职场文书
2019年中学生的思想品德评语集锦
2019/12/19 职场文书
redis requires ruby version2.2.2的解决方案
2021/07/15 Redis
JS前端轻量fabric.js系列物体基类
2022/08/05 Javascript