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 相关文章推荐
鼠标移动到一张图片时变为另一张图片
Dec 05 Javascript
判断用户的在线状态 onbeforeunload事件
Mar 05 Javascript
jQuery中Dom的基本操作小结
Jan 23 Javascript
JavaScript清空数组元素的两种方法简单比较
Jul 10 Javascript
javascript实现类似于新浪微博搜索框弹出效果的方法
Jul 27 Javascript
JavaScript结合Bootstrap仿微信后台多图文界面管理
Jul 22 Javascript
js修改onclick动作的四种方法(推荐)
Aug 18 Javascript
浅谈JavaScript事件绑定的常用方法及其优缺点分析
Nov 01 Javascript
Node.js开发教程之基于OnceIO框架实现文件上传和验证功能
Nov 30 Javascript
AngularJS中scope的绑定策略实例分析
Oct 30 Javascript
vue 防止页面加载时看到花括号的解决操作
Nov 09 Javascript
vue中echarts的用法及与elementui-select的协同绑定操作
Nov 17 Vue.js
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进程之间实现共享内存的方法
2014/06/13 PHP
使用PHP生成图片的缩略图的方法
2015/08/18 PHP
php批量转换文件夹下所有文件编码的函数类
2017/08/06 PHP
JavaScript中获取元素索引的函数
2010/09/10 Javascript
JS 表单验证大全
2011/11/23 Javascript
纯JS实现五子棋游戏兼容各浏览器(附源码)
2013/04/24 Javascript
javascript使用appendChild追加节点实例
2015/01/12 Javascript
jquery实现的横向二级导航效果代码
2015/08/26 Javascript
window.onerror()的用法与实例分析
2016/01/27 Javascript
用JS生成UUID的方法实例
2016/03/30 Javascript
对象转换为原始值的实现方法
2016/06/06 Javascript
教你一步步用jQyery实现轮播器
2016/12/18 Javascript
基于JS实现网页中的选项卡(两种方法)
2017/06/16 Javascript
深入浅析Node.js单线程模型
2017/07/10 Javascript
bootstrap是什么_动力节点Java学院整理
2017/07/14 Javascript
Vue调试神器vue-devtools安装方法
2017/12/12 Javascript
vue-cli3脚手架的配置及使用教程
2018/08/28 Javascript
简单了解vue中父子组件如何相互传递值(基础向)
2019/07/12 Javascript
Python中的并发编程实例
2014/07/07 Python
使用Python将数组的元素导出到变量中(unpacking)
2016/10/27 Python
Python实现将不规范的英文名字首字母大写
2016/11/15 Python
Python交互环境下实现输入代码
2018/06/22 Python
python数据结构之线性表的顺序存储结构
2018/09/28 Python
使用Python调取任意数字资产钱包余额功能
2019/08/15 Python
详谈tensorflow gfile文件的用法
2020/02/05 Python
基于css3实现漂亮便签样式
2013/03/18 HTML / CSS
春秋航空官方网站:Spring Airlines
2017/09/27 全球购物
如何选择使用结构还是类
2014/05/30 面试题
医学生个人求职信范文
2013/09/24 职场文书
单位领导证婚词
2014/01/14 职场文书
主持人婚宴答谢词
2014/01/28 职场文书
2014社区三八妇女节活动方案
2014/03/30 职场文书
大学生精神文明先进个人事迹材料
2014/05/02 职场文书
2015年园林绿化工作总结
2015/05/23 职场文书
舞出我人生观后感
2015/06/16 职场文书
感恩教师主题班会
2015/08/12 职场文书