Vue使用mixins实现压缩图片代码


Posted in Javascript onMarch 14, 2018

本文介绍了Vue使用mixins实现压缩图片代码,分享给大家,具体如下:

图片压缩

创建mixins image-compress.js

export default {

 methods: {
  /**
   * 检查并压缩图片大小
   */
  checkAndHandleCompression(file) {

   return new Promise((resolve, reject) => {

    this.imgBase64(file, (image, canvas) => {
     let maxSize = 2 * 1024; // 2M (单位KB)
     let fileSize = file.size / 1024; // 图片大小 (单位KB)

     let uploadSrc, uploadFile;
     if (fileSize > maxSize) { // 如果图片大小大于maxSize,进行压缩
      uploadSrc = canvas.toDataURL(file.type, maxSize / fileSize);
      uploadFile = this.convertBase64UrlToFile(uploadSrc, file.name); // 转成file文件
     } else {
      uploadSrc = image.src;
      uploadFile = file;
     }

     let compressedSize = uploadFile.size / 1024;// 压缩后图片大小 (单位KB)
     // 判断图片大小是否小于maxSize,如果大于则继续压缩至小于为止
     if (compressedSize.toFixed(2) > maxSize) {
      this.checkAndHandleUpload(uploadFile);
     } else {
      let fileOptions = {uploadSrc, uploadFile};
      resolve(fileOptions);
     }
    });

   });

  },

  /**
   * 将图片转化为base64
   */
  imgBase64(file, callback) {
   // 看支持不支持FileReader
   if (!file || !window.FileReader) return;
   // 创建一个 Image 对象
   let image = new Image();
   // 绑定 load 事件处理器,加载完成后执行
   image.onload = function () {
    // 创建 canvas DOM 对象
    let canvas = document.createElement('canvas');
    // 返回一个用于在画布上绘图的环境, '2d' 指定了您想要在画布上绘制的类型
    let ctx = canvas.getContext('2d');
    // 如果高度超标 // 参数,最大高度
    let MAX_HEIGHT = 3000;
    if (image.height > MAX_HEIGHT) {
     // 宽度等比例缩放 *=
     image.width *= MAX_HEIGHT / image.height;
     image.height = MAX_HEIGHT;
    }
    // 获取 canvas的 2d 环境对象,
    // 可以理解Context是管理员,canvas是房子
    ctx.clearRect(0, 0, canvas.width, canvas.height);
    // 重置canvas宽高
    canvas.width = image.width;
    canvas.height = image.height;
    // 将图像绘制到canvas上
    ctx.drawImage(image, 0, 0, image.width, image.height);

    callback(image, canvas);

   };
   if (/^image/.test(file.type)) {
    // 创建一个reader
    let reader = new FileReader();
    // 将图片将转成 base64 格式
    reader.readAsDataURL(file);
    // 读取成功后的回调
    reader.onload = function () {
     // 设置src属性,浏览器会自动加载。
     // 记住必须先绑定事件,才能设置src属性,否则会出同步问题。
     image.src = this.result;
    };
   }
  },

  /**
   * 把Base64转换成file文件
   */
  convertBase64UrlToFile(dataurl, filename) {
   let arr = dataurl.split(','),
    mime = arr[0].match(/:(.*?);/)[1],
    bstr = atob(arr[1]), n = bstr.length,
    u8arr = new Uint8Array(n);
   while (n--) {
    u8arr[n] = bstr.charCodeAt(n);
   }
   return new File([u8arr], filename, {type: mime});
  }

 }
};

example

<template>
  ...
</template>
<script>
 import imageUploadMixins from '@/mixins/image-compress'; 
 export default { 
  mixins: [imageUploadMixins],  
  ...  
  methods:{
    handleUploadImage(e){
      let file = e.target.files[0];
      this.checkAndHandleCompression(file).then( fileOptions => {
        // let {uploadSrc, uploadFile} = fileOptions;
        
        // 压缩完成使用 uploadSrc, uploadFile
        
        ...
        
      });
    }
  }
   ...  
 }
</script>
<style>
  ...
</style>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript编程起步(第四课)
Feb 27 Javascript
javascript 全等号运算符使用说明
May 31 Javascript
js调用图片隐藏&amp;显示实现代码
Sep 13 Javascript
jQuery中[attribute]选择器用法实例
Dec 31 Javascript
JS模拟Dialog弹出浮动框效果代码
Oct 16 Javascript
深入分析jQuery的ready函数是如何工作的(工作原理)
Dec 17 Javascript
jQuery中判断对象是否存在的方法汇总
Feb 24 Javascript
javascript的 {} 语句块详解
Feb 27 Javascript
BootStrap中Tab页签切换实例代码
May 30 Javascript
JavaScript模块化之使用requireJS按需加载
Apr 12 Javascript
ES6扩展运算符用法实例分析
Oct 31 Javascript
快速解决angularJS中用post方法时后台拿不到值的问题
Aug 14 Javascript
vue2.0模拟锚点的实例
Mar 14 #Javascript
vue的mixins属性详解
Mar 14 #Javascript
vue2.0路由切换后页面滚动位置不变BUG的解决方法
Mar 14 #Javascript
react中fetch之cors跨域请求的实现方法
Mar 14 #Javascript
解决vue项目报错webpackJsonp is not defined问题
Mar 14 #Javascript
create-react-app构建项目慢的解决方法
Mar 14 #Javascript
解决vue2.0动态绑定图片src属性值初始化时报错的问题
Mar 14 #Javascript
You might like
PHP实现Socket服务器的代码
2008/04/03 PHP
php魔术方法与魔术变量、内置方法与内置变量的深入分析
2013/06/03 PHP
PHP实现的MongoDB数据库操作类分享
2014/05/12 PHP
浅谈PHP拦截器之__set()与__get()的理解与使用方法
2016/10/18 PHP
php断点续传之文件分割合并详解
2016/12/13 PHP
Laravel 的数据库迁移的方法
2017/07/31 PHP
php ActiveMQ的安装与使用方法图文教程
2020/02/23 PHP
json简单介绍
2008/06/10 Javascript
Javascript hasOwnProperty 方法 &amp; in 关键字
2008/11/26 Javascript
javascript图像处理—仿射变换深度理解
2013/01/16 Javascript
JS操作数据库的实例代码
2013/10/17 Javascript
javascript中创建对象的几种方法总结
2013/11/01 Javascript
jQuery.event兼容各浏览器的event详细解析
2013/12/18 Javascript
javascript 寻找错误方法整理
2014/06/15 Javascript
基于vue.js轮播组件vue-awesome-swiper实现轮播图
2017/03/17 Javascript
JavaScript原型继承_动力节点Java学院整理
2017/06/30 Javascript
JavaScript中使用参数个数实现重载功能
2017/09/01 Javascript
[00:55]2015国际邀请赛中国区预选赛5月23日——28日约战上海
2015/05/25 DOTA
Python中的数学运算操作符使用进阶
2016/06/20 Python
Python深入06——python的内存管理详解
2016/12/07 Python
用Python实现KNN分类算法
2017/12/22 Python
tensorflow TFRecords文件的生成和读取的方法
2018/02/06 Python
Python使用Dijkstra算法实现求解图中最短路径距离问题详解
2018/05/16 Python
Python图像处理模块ndimage用法实例分析
2019/09/05 Python
python生成器/yield协程/gevent写简单的图片下载器功能示例
2019/10/28 Python
python利用xlsxwriter模块 操作 Excel
2020/10/14 Python
HTML5 visibilityState属性详细介绍和使用实例
2014/05/03 HTML / CSS
手把手教你实现一个canvas智绘画板的方法
2019/03/04 HTML / CSS
园长自我鉴定
2013/10/06 职场文书
临床医师专业个人自我评价
2014/01/08 职场文书
党的群众路线教育实践活动个人承诺书
2014/05/22 职场文书
精神文明建设标语
2014/06/16 职场文书
2014年办公室文秘工作总结
2014/12/09 职场文书
教师个人总结范文
2015/02/11 职场文书
风之谷观后感
2015/06/11 职场文书
pytest配置文件pytest.ini的详细使用
2021/04/17 Python