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 相关文章推荐
JQuery this 和 $(this) 的区别
Aug 23 Javascript
javascript 实用的文字链提示框效果
Jun 30 Javascript
一个简单的瀑布流效果(主体形式自写)
May 27 Javascript
js opener的使用详解
Jan 11 Javascript
JavaScript 事件绑定及深入
Apr 13 Javascript
javascript实现页面刷新时自动清空表单并选中的方法
Jul 18 Javascript
快速掌握Node.js环境的安装与运行方法
Feb 16 Javascript
JavaScript学习笔记整理_关于表达式和语句
Sep 19 Javascript
js时间戳与日期格式之间转换详解
Dec 11 Javascript
javascript trie前缀树的示例
Jan 29 Javascript
Vue服务器渲染Nuxt学习笔记
Jan 31 Javascript
生成无限制的微信小程序码的示例代码
Sep 20 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
第一个无线电台是由谁发明的
2021/03/01 无线电
什么是短波收听SWL
2021/03/01 无线电
php中inlcude()性能对比详解
2012/09/16 PHP
php实现微信支付之退款功能
2018/05/30 PHP
IE与firefox之jquery用法区别
2008/10/03 Javascript
js获取提交的字符串的字节数
2009/02/09 Javascript
js面向对象 多种创建对象方法小结
2012/05/21 Javascript
Eclipse下jQuery文件报错出现错误提示红叉
2014/01/13 Javascript
调试代码导致IE出错的避免方法
2014/04/04 Javascript
jQuery中extend函数的实现原理详解
2015/02/03 Javascript
js控制页面的全屏展示和退出全屏显示的方法
2015/03/10 Javascript
基于javascript实现动态时钟效果
2020/08/18 Javascript
JS实现Select的option上下移动的方法
2016/03/01 Javascript
nodejs中使用HTTP分块响应和定时器示例代码
2017/03/19 NodeJs
jQuery Json数据格式排版高亮插件json-viewer.js使用方法详解
2017/06/12 jQuery
vue2.0 父组件给子组件传递数据的方法
2018/01/15 Javascript
微信小程序动态添加view组件的实例代码
2019/05/23 Javascript
layui实现数据表格table分页功能(ajax异步)
2019/07/27 Javascript
微信小程序云开发如何实现数据库自动备份实现
2019/08/16 Javascript
JS对象属性的检测与获取操作实例分析
2020/03/17 Javascript
小程序实现可拖动的悬浮按钮
2020/09/07 Javascript
python3实现ftp服务功能(客户端)
2017/03/24 Python
对numpy 数组和矩阵的乘法的进一步理解
2018/04/04 Python
python实现一个简单的ping工具方法
2019/01/31 Python
Python3 使用pillow库生成随机验证码
2019/08/26 Python
浅析python 定时拆分备份 nginx 日志的方法
2020/04/27 Python
HTML5 video 上传预览图片视频如何设置、预览视频某秒的海报帧
2018/08/28 HTML / CSS
WoolOvers澳洲官方网站:英国针织服装公司
2018/05/13 全球购物
自荐信不宜过于夸大
2013/11/06 职场文书
大学生开西餐厅创业计划书
2014/02/01 职场文书
《老王》教学反思
2014/02/23 职场文书
竞选大队委员演讲稿
2014/04/28 职场文书
张家口市高新区党工委群众路线教育实践活动整改方案
2014/10/25 职场文书
施工员岗位职责
2015/02/10 职场文书
教师廉政准则心得体会
2016/01/20 职场文书
Java处理延时任务的常用几种解决方案
2022/06/01 Java/Android