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 相关文章推荐
select标记美化--JS式插件、后期加载
Apr 01 Javascript
jquery获取焦点和失去焦点事件代码
Apr 21 Javascript
js 中将多个逗号替换为一个逗号的代码
Jun 07 Javascript
js propertychange和oninput事件
Sep 28 Javascript
js绘制圆形和矩形的方法
Aug 05 Javascript
JS基于ocanvas插件实现的简单画板效果代码(附demo源码下载)
Apr 05 Javascript
深入理解JQuery循环绑定事件
Jun 02 Javascript
javascript表达式和运算符详解
Feb 07 Javascript
JS高仿抛物线加入购物车特效实现代码
Feb 20 Javascript
Node.js 使用AngularJS的方法示例
May 11 Javascript
jQuery中$原理实例分析
Aug 13 jQuery
JS实现根据数组对象的某一属性排序操作示例
Jan 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中substr()函数参数说明及用法实例
2014/11/15 PHP
[原创]图片分页查看
2006/08/28 Javascript
写的htc的数据表格
2007/01/20 Javascript
dojo 之基础篇(二)之从服务器读取数据
2007/03/24 Javascript
javascript各浏览器中option元素的表现差异
2011/04/07 Javascript
jquery解决图片路径不存在执行替换路径
2013/02/06 Javascript
jQuery+css实现百度百科的页面导航效果
2014/12/16 Javascript
js时钟翻牌效果实现代码分享
2020/07/31 Javascript
jQuery中iframe的操作(点击按钮新增窗口)
2016/04/20 Javascript
Javascript随机标签云代码实例
2016/06/21 Javascript
JS中Attr的用法详解
2017/10/09 Javascript
什么是Vue.js框架 为什么选择它?
2017/10/17 Javascript
Vue中的scoped实现原理及穿透方法
2018/05/15 Javascript
vue-router命名路由和编程式路由传参讲解
2019/01/19 Javascript
如何从头实现一个node.js的koa框架
2019/06/17 Javascript
[01:01:13]2018DOTA2亚洲邀请赛 4.5 淘汰赛 Mineski vs VG 第三场
2018/04/06 DOTA
[55:48]VGJ.S vs TNC Supermajor 败者组 BO3 第二场 6.6
2018/06/07 DOTA
在Linux系统上部署Apache+Python+Django+MySQL环境
2015/12/24 Python
Python 变量类型详解
2018/10/10 Python
python读取目录下所有的jpg文件,并显示第一张图片的示例
2019/06/13 Python
从列表或字典创建Pandas的DataFrame对象的方法
2019/07/06 Python
selenium 多窗口切换的实现(windows)
2020/01/18 Python
使用K.function()调试keras操作
2020/06/17 Python
Expected conditions模块使用方法汇总代码解析
2020/08/13 Python
Python try except finally资源回收的实现
2021/01/25 Python
电子专业毕业生自我鉴定
2014/01/22 职场文书
环境卫生倡议书
2014/08/29 职场文书
学习礼仪心得体会
2014/09/01 职场文书
涉及车辆房产分割的离婚协议书范文
2014/10/12 职场文书
2014年学生会生活部工作总结
2014/11/07 职场文书
平凡的世界读书笔记
2015/06/25 职场文书
2015秋季运动会通讯稿
2015/07/18 职场文书
2016读书月活动心得体会
2016/01/14 职场文书
解决Maven项目中 Invalid bound statement 无效的绑定问题
2021/06/15 Java/Android
Java实战之课程信息管理系统的实现
2022/04/01 Java/Android
js基于div丝滑实现贝塞尔曲线
2022/09/23 Javascript