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 相关文章推荐
不错的asp中显示新闻的功能
Oct 13 Javascript
电子商务网站上的常用的js放大镜效果
Dec 08 Javascript
子页向父页传值示例
Nov 27 Javascript
JS获取鼠标位置距浏览器窗口距离的方法示例
Apr 11 Javascript
总结js中的一些兼容性易错的问题
Dec 18 Javascript
vue中v-model的应用及使用详解
Jun 27 Javascript
vue 地图可视化 maptalks 篇实例代码详解
May 21 Javascript
20道JS原理题助你面试一臂之力(必看)
Jul 22 Javascript
layui实现数据表格table分页功能(ajax异步)
Jul 27 Javascript
js 实现watch监听数据变化的代码
Oct 13 Javascript
vue 导航锚点_点击平滑滚动,导航栏对应变化详解
Aug 10 Javascript
关于element-ui表单中限制输入纯数字的解决方式
Sep 08 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
《被神捡到的男人》动画化计划进行中!
2020/03/06 日漫
十天学会php之第一天
2006/10/09 PHP
php 获取SWF动画截图示例代码
2014/02/10 PHP
PHP使用PDO调用mssql存储过程的方法示例
2017/10/07 PHP
jquery DOM操作 基于命令改变页面
2010/05/06 Javascript
基于jquery的划词搜索实现(备忘)
2010/09/14 Javascript
放弃用你的InnerHTML来输出HTML吧 jQuery Tmpl不详细讲解
2013/04/20 Javascript
第一次接触神奇的Bootstrap导航条
2016/08/09 Javascript
js实现固定宽高滑动轮播图效果
2017/01/13 Javascript
基于vue2.0+vuex+localStorage开发的本地记事本示例
2017/02/28 Javascript
javascript编程实现栈的方法详解【经典数据结构】
2017/04/11 Javascript
基于BootStrap的文本编辑器组件Summernote
2017/10/27 Javascript
javascript sort()对数组中的元素进行排序详解
2019/10/13 Javascript
Vue.js实现可编辑的表格
2019/12/11 Javascript
js实现无缝轮播图插件封装
2020/07/31 Javascript
使用python装饰器验证配置文件示例
2014/02/24 Python
Python实现的检测网站挂马程序
2014/11/30 Python
Python简单日志处理类分享
2015/02/14 Python
python 实时遍历日志文件
2016/04/12 Python
Python工厂函数用法实例分析
2018/05/14 Python
python3中函数参数的四种简单用法
2018/07/09 Python
Appium+Python自动化测试之运行App程序示例
2019/01/23 Python
python使用pymongo操作mongo的完整步骤
2019/04/13 Python
关于tf.TFRecordReader()函数的用法解析
2020/02/17 Python
python多进程使用函数封装实例
2020/05/02 Python
英国领先的NHS批准的在线药店:Pharmacy2U
2017/01/06 全球购物
Hotels.com拉丁美洲:从豪华酒店到经济型酒店的预定优惠和折扣
2019/12/09 全球购物
思想汇报格式
2014/01/05 职场文书
楼面部长岗位职责范本
2014/02/14 职场文书
如何写一份好的英文求职信
2014/03/19 职场文书
企业仓管员岗位职责
2014/06/15 职场文书
我的中国梦演讲稿500字
2014/08/19 职场文书
先进事迹演讲稿
2014/09/01 职场文书
廉政承诺书
2015/01/19 职场文书
劳动模范获奖感言
2015/07/31 职场文书
教你用Python matplotlib库制作简单的动画
2021/06/11 Python