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 相关文章推荐
Wordpress ThickBox 点击图片显示下一张图的修改方法
Dec 11 Javascript
如何使用json在前后台进行数据传输实例介绍
Apr 11 Javascript
JavaScript打印iframe内容示例代码
Aug 20 Javascript
javascript将相对路径转绝对路径示例
Mar 14 Javascript
gameboy网页闯关游戏(riddle webgame)--仿微信聊天的前端页面设计和难点
Feb 21 Javascript
JS实现随页面滚动显示/隐藏窗口固定位置元素
Feb 26 Javascript
概述如何实现一个简单的浏览器端js模块加载器
Dec 07 Javascript
jQuery插件HighCharts绘制2D柱状图、折线图的组合双轴图效果示例【附demo源码下载】
Mar 09 Javascript
vue.js中v-on:textInput无法执行事件问题的解决过程
Jul 12 Javascript
ajax+node+request爬取网络图片的实例(宅男福利)
Aug 28 Javascript
vue.js 实现评价五角星组件的实例代码
Aug 13 Javascript
解决IOS端微信H5页面软键盘弹起后页面下方留白的问题
Jun 05 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
写一个用户在线显示的程序
2006/10/09 PHP
一步一步学习PHP(5) 类和对象
2010/02/16 PHP
PHP 杂谈《重构-改善既有代码的设计》之四 简化条件表达式
2012/04/09 PHP
探讨Hessian在PHP中的使用分析
2013/06/13 PHP
深入extjs与php参数交互的详解
2013/06/25 PHP
ueditor 1.2.6 使用方法说明
2013/07/24 PHP
php常用字符串String函数实例总结【转换,替换,计算,截取,加密】
2016/12/07 PHP
HTML TO JavaScript 转换
2006/06/26 Javascript
[原创]后缀就扩展名为js的文件是什么文件
2007/12/06 Javascript
js 自定义的联动下拉框
2010/02/07 Javascript
jquery判断checkbox(复选框)是否被选中的代码
2010/10/20 Javascript
showModalDialog在谷歌浏览器下会返回Null的解决方法
2013/11/27 Javascript
node.js操作mongoDB数据库示例分享
2014/11/26 Javascript
javascript 动态修改css样式方法汇总(四种方法)
2015/08/27 Javascript
node.js学习之断言assert的使用示例
2017/09/28 Javascript
使用js实现将后台传入的json数据放在前台显示
2018/08/06 Javascript
vue使用Font Awesome的方法步骤
2019/02/26 Javascript
使用Node.js实现一个多人游戏服务器引擎
2019/03/13 Javascript
深入了解JavaScript词法作用域
2020/07/29 Javascript
jquery自定义组件实例详解
2020/12/31 jQuery
python 多线程实现检测服务器在线情况
2015/11/25 Python
Python实现在线音乐播放器
2017/03/03 Python
python去除扩展名的实例讲解
2018/04/23 Python
在python中pandas的series合并方法
2018/11/12 Python
Pyside2中嵌入Matplotlib的绘图的实现
2021/02/22 Python
css3 pointer-events 介绍详解
2017/09/18 HTML / CSS
欧洲顶级的童装奢侈品购物网站:Bambini Fashion(面向全球)
2018/04/24 全球购物
C++:memset ,memcpy和strcpy的根本区别
2013/04/27 面试题
小学后勤管理制度
2014/01/14 职场文书
运动会演讲稿
2014/05/07 职场文书
英语四级考试作弊检讨书
2014/09/29 职场文书
2014年机关后勤工作总结
2014/12/16 职场文书
副总经理岗位职责范本
2015/04/08 职场文书
2015年节能降耗工作总结
2015/05/22 职场文书
公司联欢会主持词
2015/07/04 职场文书
TensorFlow中tf.batch_matmul()的用法
2021/06/02 Python