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 相关文章推荐
一个页面元素appendchild追加到另一个页面元素的问题
Jan 27 Javascript
js+html+css实现鼠标移动div实例
Jan 30 Javascript
js简单实现点击左右运动的方法
Apr 10 Javascript
c#程序员对TypeScript的认识过程
Jun 19 Javascript
使用JavaScript脚本无法直接改变Asp.net中Checkbox控件的Enable属性的解决方法
Sep 16 Javascript
easy ui datagrid 从编辑框中获取值的方法
Feb 22 Javascript
jQuery Pagination分页插件使用方法详解
Feb 28 Javascript
JS运动特效之任意值添加运动的方法分析
Jan 24 Javascript
微信小程序实现的一键拨号功能示例
Apr 24 Javascript
jquery UI实现autocomplete在获取焦点时得到显示列表功能示例
Jun 04 jQuery
vue中nextTick用法实例
Sep 11 Javascript
详解Vue.js3.0 组件是如何渲染为DOM的
Nov 10 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
Yii2使用小技巧之通过 Composer 添加 FontAwesome 字体资源
2014/06/22 PHP
php防止恶意刷新与刷票的方法
2014/11/21 PHP
PHP模板引擎Smarty中变量的使用方法示例
2016/04/11 PHP
Laravel框架路由设置与使用示例
2018/06/12 PHP
jQuery插件animateSlide制作多点滑动幻灯片
2015/06/11 Javascript
纯javascript实现的小游戏《Flappy Pig》实例
2015/07/27 Javascript
Bootstrap 网格系统布局详解
2017/03/19 Javascript
在Vue组件上动态添加和删除属性方法
2018/02/23 Javascript
vue基于viewer实现的图片查看器功能
2019/04/12 Javascript
微信小程序select下拉框实现效果
2019/05/15 Javascript
详解微信小程序支付流程与梳理
2019/07/16 Javascript
微信小程序实现上传图片裁剪图片过程解析
2019/08/22 Javascript
Vue.js的模板语法详解
2020/02/16 Javascript
vue实现按钮切换图片
2021/01/20 Vue.js
[02:13] 完美世界DOTA2联赛PWL DAY5集锦
2020/11/03 DOTA
详解Python中with语句的用法
2015/04/15 Python
Python Queue模块详细介绍及实例
2016/12/27 Python
python机器学习实战之最近邻kNN分类器
2017/12/20 Python
解决Pycharm下面出现No R interpreter defined的问题
2018/10/29 Python
python实现转圈打印矩阵
2019/03/02 Python
python用for循环求和的方法总结
2019/07/08 Python
Django文件存储 自己定制存储系统解析
2019/08/02 Python
运用PyTorch动手搭建一个共享单车预测器
2019/08/06 Python
python+selenium select下拉选择框定位处理方法
2019/08/24 Python
python global和nonlocal用法解析
2020/02/03 Python
使用IPython或Spyder将省略号表示的内容完整输出
2020/04/20 Python
Python基于内置函数type创建新类型
2020/10/22 Python
学习新党章思想汇报
2014/01/09 职场文书
领导失职检讨书
2014/02/24 职场文书
安全生产网格化管理实施方案
2014/03/01 职场文书
学校四风对照检查材料
2014/08/28 职场文书
教育实践活动对照检查材料
2014/09/23 职场文书
党建工作整改措施
2014/10/28 职场文书
2015年平安创建工作总结
2015/04/29 职场文书
退休欢送会致辞
2015/07/31 职场文书
关于企业的执行力标语大全
2020/01/06 职场文书