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 相关文章推荐
jquery实现每个数字上都带进度条的幻灯片
Feb 20 Javascript
一个不错的js html页面倒计时可精确到秒
Oct 22 Javascript
JS基于面向对象实现的拖拽库实例
Sep 24 Javascript
基于原生JS实现图片裁剪
Aug 01 Javascript
vue2.0构建单页应用最佳实战
Apr 01 Javascript
js 毫秒转天时分秒的实例
Nov 17 Javascript
javascript用rem来做响应式开发
Jan 13 Javascript
vue实现裁切图片同时实现放大、缩小、旋转功能
Mar 02 Javascript
vue最简单的前后端交互示例详解
Oct 11 Javascript
es6基础学习之解构赋值
Dec 10 Javascript
浅谈express.js框架中间件(middleware)
Apr 07 Javascript
使用Vue父子组件通信实现todolist的功能示例代码
Apr 11 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 session处理的定制
2009/03/16 PHP
php抽象方法和抽象类实例分析
2016/12/07 PHP
PHP 并发场景的几种解决方案
2019/06/14 PHP
Smarty模板变量与调节器实例详解
2019/07/20 PHP
php连接sftp的作用以及实例代码
2019/09/23 PHP
php设计模式之策略模式实例分析【星际争霸游戏案例】
2020/03/26 PHP
文本框获得焦点和失去焦点的判断代码
2012/03/18 Javascript
JavaScript 封装一个tab效果源码分享
2015/09/15 Javascript
常用js,css文件统一加载方法(推荐) 并在加载之后调用回调函数
2016/09/23 Javascript
利用jQuery来动态为属性添加或者删除属性的简单方法
2016/12/02 Javascript
vue中七牛插件使用的实例代码
2017/07/28 Javascript
vue element-ui 绑定@keyup事件无效的解决方法
2018/03/09 Javascript
JavaScript ES6箭头函数使用指南
2018/12/30 Javascript
微信小程序实现的一键拨号功能示例
2019/04/24 Javascript
学习RxJS之JavaScript框架Cycle.js
2019/06/17 Javascript
浅谈layui数据表格判断问题(加入表单元素),设置单元格样式
2019/10/26 Javascript
解决ele ui 表格表头太长问题的实现
2019/11/13 Javascript
Nodejs在局域网配置https访问的实现方法
2020/10/17 NodeJs
python socket网络编程步骤详解(socket套接字使用)
2013/12/06 Python
浅谈python数据类型及类型转换
2017/12/18 Python
python简易远程控制单线程版
2018/06/20 Python
python读写csv文件实例代码
2019/07/05 Python
python进程的状态、创建及使用方法详解
2019/12/06 Python
Python实现密码薄文件读写操作
2019/12/16 Python
出门问问全球官方商城:Tichome音箱和TicWatch智能手表
2017/12/02 全球购物
波兰家居和花园家具专家:4Home
2019/05/26 全球购物
Derek Rose官网:英国高档睡衣、家居服和内衣品牌
2020/01/18 全球购物
大学生个人总结的自我评价
2013/10/05 职场文书
我的网上商城创业计划书
2013/12/26 职场文书
简历自我评价模版
2014/01/31 职场文书
2015年世界环境日活动总结
2015/02/11 职场文书
建国大业观后感
2015/06/01 职场文书
MySql开发之自动同步表结构
2021/05/28 MySQL
html5调用摄像头截图功能
2022/01/18 Javascript
vue+elementUI实现表格列的显示与隐藏
2022/04/13 Vue.js
python中redis包操作数据库的教程
2022/04/19 Python