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 相关文章推荐
XMLHTTPRequest的属性和方法简介
Nov 23 Javascript
jQuery EasyUI API 中文文档 - Panel面板
Sep 30 Javascript
ASP.NET中AJAX 调用实例代码
May 03 Javascript
浅析IE10兼容性问题(frameset的cols属性)
Jan 03 Javascript
文本框文本自动补全效果示例分享
Jan 19 Javascript
jquery操作复选框(checkbox)的12个小技巧总结
Feb 04 Javascript
node.js中的http.request.end方法使用说明
Dec 10 Javascript
bootstrap快速制作后台界面
Dec 05 Javascript
js css3实现图片拖拽效果
Mar 04 Javascript
JavaScript自定义文本框光标
Mar 05 Javascript
JS实现字符串翻转的方法分析
Aug 31 Javascript
微信小程序JS加载esmap地图的实例详解
Sep 04 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
Smarty模板快速入门
2007/01/04 PHP
php面向对象全攻略 (十六) 对象的串行化
2009/09/30 PHP
PHP通过iconv将字符串从GBK转换为UTF8字符集
2011/07/18 PHP
PHP命名空间(Namespace)简明教程
2014/06/11 PHP
LBS blog sql注射漏洞[All version]-官方已有补丁
2007/08/26 Javascript
node.js中的http.response.writeHead方法使用说明
2014/12/14 Javascript
jQuery实现菜单式图片滑动切换
2015/03/14 Javascript
javascript格式化日期时间方法汇总
2015/06/19 Javascript
详解JavaScript函数
2015/12/01 Javascript
理解javascript正则表达式
2016/03/08 Javascript
jquery动态添加文本并获取值的方法
2016/10/12 Javascript
Webpack 4.x搭建react开发环境的方法步骤
2018/08/15 Javascript
vue 自定义提示框(Toast)组件的实现代码
2018/08/17 Javascript
Bootstrap table 实现树形表格联动选中联动取消功能
2019/09/30 Javascript
Vue中ref和$refs的介绍以及使用方法示例
2021/01/11 Vue.js
[01:07:57]DOTA2-DPC中国联赛 正赛 Ehome vs Magma BO3 第二场 1月19日
2021/03/11 DOTA
Python中3种内建数据结构:列表、元组和字典
2014/11/30 Python
python实现简单点对点(p2p)聊天
2017/09/13 Python
python字典操作实例详解
2017/11/16 Python
Python爬虫 bilibili视频弹幕提取过程详解
2019/07/31 Python
Python-jenkins 获取job构建信息方式
2020/05/12 Python
健身场所或家用健身设备:Life Fitness
2017/11/01 全球购物
出门问问全球官方商城:Tichome音箱和TicWatch智能手表
2017/12/02 全球购物
德国购买踏板车网站:Microscooter
2019/10/14 全球购物
财务管理专业毕业生求职信范文
2013/09/21 职场文书
总经理职责范文
2013/11/08 职场文书
《挑山工》的教学反思
2014/02/16 职场文书
师德师风个人整改措施
2014/10/27 职场文书
小学体育跳绳课教学反思
2016/02/16 职场文书
送给小学生的暑假礼物!小学生必背99首古诗
2019/07/02 职场文书
2019年健身俱乐部的创业计划书
2019/08/26 职场文书
为什么在foreach循环中JAVA集合不能添加或删除元素
2021/06/11 Java/Android
nginx配置虚拟主机的详细步骤
2021/07/21 Servers
Python编程根据字典列表相同键的值进行合并
2021/10/05 Python
使用MybatisPlus打印sql语句
2022/04/22 SQL Server