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 相关文章推荐
jQuery-Tools-overlay 使用介绍
Jul 14 Javascript
一个简单的网站访问JS计数器 刷新1次加1次访问
Sep 20 Javascript
JS判断不同分辨率调用不同的CSS样式文件实现思路及测试代码
Jan 23 Javascript
jQuery中 delegate使用的问题
Jul 03 Javascript
JavaScript中的数据类型转换方法小结
Oct 26 Javascript
JS判断图片是否加载完成方法汇总(最新版)
May 13 Javascript
JS实现回到页面顶部动画效果的简单实例
May 24 Javascript
jQuery实现的无限级下拉菜单功能示例
Sep 12 Javascript
js将table的每个td的内容自动赋值给其title属性的方法
Oct 13 Javascript
微信小程序-消息提示框实例
Nov 24 Javascript
jquery实现简单实用的轮播器
May 23 jQuery
vue项目中微信登录的实现操作
Sep 08 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 set_magic_quotes_runtime() 函数过时解决方法
2010/07/08 PHP
PHP empty函数报错解决办法
2014/03/06 PHP
PHP IDE PHPStorm配置支持友好Laravel代码提示方法
2015/05/12 PHP
由php中字符offset特征造成的绕过漏洞详解
2017/07/07 PHP
Java/JS获取flash高宽的具体方法
2013/12/27 Javascript
原生js实现移动开发轮播图、相册滑动特效
2015/04/17 Javascript
3kb jQuery代码搞定各种树形选择的实现方法
2016/06/10 Javascript
jquery插件uploadify多图上传功能实现代码
2016/08/12 Javascript
浅谈JavaScript 中有关时间对象的方法
2016/08/15 Javascript
jquery拖动改变div大小
2017/07/04 jQuery
微信小程序之电影影评小程序制作代码
2017/08/03 Javascript
解决在vue+webpack开发中出现两个或多个菜单公用一个组件问题
2017/11/28 Javascript
select2 ajax 设置默认值,初始值的方法
2018/08/09 Javascript
浅谈angularJs函数的使用方法(大小写转换,拷贝,扩充对象)
2018/10/08 Javascript
JavaScript中的this/call/apply/bind的使用及区别
2020/03/06 Javascript
python访问抓取网页常用命令总结
2017/04/11 Python
fastcgi文件读取漏洞之python扫描脚本
2017/04/23 Python
Python常用时间操作总结【取得当前时间、时间函数、应用等】
2017/05/11 Python
Python学习_几种存取xls/xlsx文件的方法总结
2018/05/03 Python
使用pip发布Python程序的方法步骤
2018/10/11 Python
Django网络框架之创建虚拟开发环境操作示例
2019/06/06 Python
深入了解Python枚举类型的相关知识
2019/07/09 Python
用python写一个带有gui界面的密码生成器
2020/11/06 Python
python分布式爬虫中消息队列知识点详解
2020/11/26 Python
详解基于Facecognition+Opencv快速搭建人脸识别及跟踪应用
2021/01/21 Python
EQVVS官网:设计师男装和女装
2018/10/24 全球购物
美国修容界大佬创建的个人美妆品牌:Kevyn Aucoin Beauty
2018/12/12 全球购物
prAna官网:瑜伽、旅行和冒险服装
2019/03/10 全球购物
莫斯科购买书籍网站:Book24
2020/01/12 全球购物
Java程序员面试90题
2013/10/19 面试题
小学安全汇报材料
2014/08/14 职场文书
党员批评与自我批评(5篇)
2014/09/23 职场文书
介绍信的格式
2015/01/30 职场文书
经营目标责任书
2015/05/08 职场文书
AI:如何训练机器学习的模型
2021/04/16 Python
Python+DeOldify实现老照片上色功能
2022/06/21 Python