vue中实现图片压缩 file文件的方法


Posted in Javascript onMay 28, 2020

项目中遇到上传图片需要在前端进行图片压缩,将我的实现思路记录一下。(我已经拿到上传的file文件的前提下)

先创建一个公用的js,这里我的是api.js,里面封装一些常用的方法

vue中实现图片压缩 file文件的方法

将图片压缩的方法写到这个公用的js(api.js)中

//base64转码(压缩完成后的图片为base64编码,这个方法可以将base64编码转回file文件)
function dataURLtoFile(dataurl) {
  var 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], { type: mime });

}
//压缩图片
function compressImg(file){
  var src;
  var files;
  var fileSize = parseFloat(parseInt(file['size'])/1024/1024).toFixed(2);
  var read = new FileReader();
  read.readAsDataURL(file);
  return new Promise(function(resolve, reject){
   read.onload = function (e) {
     var img = new Image();
     img.src = e.target.result;
     img.onload = function(){
       //默认按比例压缩
       var w = this.width,
         h = this.height;
       //生成canvas
       var canvas = document.createElement('canvas');
       var ctx = canvas.getContext('2d');
       var base64;
       // 创建属性节点
       canvas.setAttribute("width", w);
       canvas.setAttribute("height", h);
       ctx.drawImage(this, 0, 0, w, h);
       if(fileSize<1){
         //如果图片小于一兆 那么不执行压缩操作
         base64 = canvas.toDataURL(file['type'], 1);
       }else if(fileSize>1&&fileSize<2){
         //如果图片大于1M并且小于2M 那么压缩0.5
         base64 = canvas.toDataURL(file['type'], 0.5);
       }else{
         //如果图片超过2m 那么压缩0.2
         base64 = canvas.toDataURL(file['type'], 0.2);
       }
       // 回调函数返回file的值(将base64编码转成file)
       files = dataURLtoFile(base64); //如果后台接收类型为base64的话这一步可以省略
       
       resolve(files)
     };
   };
  })
};

//结尾处将该方法暴露出来供外部调用
export default {	
 compressImg,
}

在main.js中引入公用js(api.js)

import api from './http/api.js' //这里注意自己的路径
Vue.prototype.$api = api  //注册为全局变量

接下来在需要的地方调用我们的公用方法

this.$api.compressImg()//调用

我的调用方法
图片压缩的方法为异步执行 使用async await 解决异步问题(需要等压缩完成后)

//上传前压缩图片
   async beforeRead(file){//async await 解决异步问题,
    var formData = new FormData();//创建新的form
    if(file.length){   //file.length为真的时候说明是多图上传  要循环多图将file对象放进form中
     for(let i=0;i<file.length;i++){
      var f = await this.$api.compressImg(file[i]) //await只能放在async函数里 await会等待异步方法的返回值拿到以后在执行后面的方法
     formData.set('file'+i,f)
     }
    }else{
     let f = await this.$api.compressImg(file)
     formData.set('file0',f)
    }
   }

然后将formData传给后台,生成图片的线上地址就OK了!

总结

到此这篇关于vue中实现图片压缩 file文件的方法的文章就介绍到这了,更多相关vue图片压缩内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
表单提交前触发函数返回true表单才会提交
Mar 11 Javascript
js中的cookie的读写操作示例详解
Apr 17 Javascript
JavaScript中匿名、命名函数的性能测试
Sep 04 Javascript
jQuery实现最简单的切换图效果【可兼容IE6、火狐、谷歌、opera等】
Sep 04 Javascript
EasyUI学习之DataGird分页显示数据
Dec 29 Javascript
jQuery插件HighCharts实现的2D面积图效果示例【附demo源码下载】
Mar 15 Javascript
Angular 2父子组件数据传递之局部变量获取子组件其他成员
Jul 04 Javascript
基于webpack 实用配置方法总结
Sep 28 Javascript
js原生实现移动端手指滑动轮播图效果的示例
Jan 02 Javascript
jQuery实现获取form表单内容及绑定数据到form表单操作分析
Jul 03 jQuery
Vue组件内部实现一个双向数据绑定的实例代码
Apr 04 Javascript
详解如何模拟实现node中的Events模块(通俗易懂版)
Apr 15 Javascript
详解Vue 数据更新了但页面没有更新的 7 种情况汇总及延伸总结
May 28 #Javascript
Vue实现附件上传功能
May 28 #Javascript
如何使用Javascript中的this关键字
May 28 #Javascript
简单了解JavaScript arguement原理及作用
May 28 #Javascript
如何使用JavaScript检测空闲的浏览器选项卡
May 28 #Javascript
js实现轮播图特效
May 28 #Javascript
JS写滑稽笑脸运动效果
May 28 #Javascript
You might like
php实现有趣的人品测试程序实例
2015/06/08 PHP
PHP之密码加密的几种方式
2015/07/29 PHP
javascript得到当前页的来路即前一页地址的方法
2014/02/18 Javascript
js库Modernizr的介绍和使用
2015/05/07 Javascript
jQuery事件绑定on()、bind()与delegate() 方法详解
2015/06/03 Javascript
JS动态改变浏览器标题的方法
2016/04/06 Javascript
JavaScript遍历求解数独问题的主要思路小结
2016/06/12 Javascript
js编写简单的聊天室功能
2017/08/17 Javascript
五步轻松实现JavaScript HTML时钟效果
2020/03/25 Javascript
JavaScript实现职责链模式概述
2018/01/25 Javascript
Vue 页面状态保持页面间数据传输的一种方法(推荐)
2018/11/01 Javascript
Nodejs技巧之Exceljs表格操作用法示例
2019/11/06 NodeJs
JS document对象简单用法完整示例
2020/01/14 Javascript
如何基于js判断浏览器版本
2020/02/20 Javascript
Python实现的检测web服务器健康状况的小程序
2014/09/17 Python
Linux下编译安装MySQL-Python教程
2015/02/02 Python
在Python的Django框架中使用通用视图的方法
2015/07/21 Python
用python制作游戏外挂
2018/01/04 Python
python实现一行输入多个值和一行输出多个值的例子
2019/07/16 Python
安装Pycharm2019以及配置anconda教程的方法步骤
2019/11/11 Python
Python如何实现小程序 无限求和平均
2020/02/18 Python
keras中epoch,batch,loss,val_loss用法说明
2020/07/02 Python
python利用后缀表达式实现计算器功能
2021/02/22 Python
使用CSS Grid布局实现网格的流动
2014/12/30 HTML / CSS
html5 video标签屏蔽右键视频另存为的js代码
2013/11/12 HTML / CSS
英国领先的大码时装品牌之一:Elvi
2018/08/26 全球购物
巴西独家产品和现场演示购物网站:Shoptime
2019/07/11 全球购物
简单说下OSPF的操作过程
2014/08/13 面试题
品学兼优的大学生自我评价
2013/09/20 职场文书
体现团队精神的口号
2014/06/06 职场文书
美术专业自荐信
2014/07/07 职场文书
工程索赔意向书
2014/08/30 职场文书
护士工作失误检讨书
2014/09/14 职场文书
公路局群众路线教育实践活动第一阶段工作汇报
2014/10/25 职场文书
新婚姻法离婚协议书范文
2014/11/30 职场文书
CSS元素定位之通过元素的标签或者元素的id、class属性定位详解
2022/09/23 HTML / CSS