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 相关文章推荐
Javascript玩转继承(二)
May 08 Javascript
JsRender for index循环索引用法详解
Oct 31 Javascript
解决jquery实现的radio重新选中的问题
Jul 03 Javascript
jquery if条件语句的写法
May 19 Javascript
有关jQuery中parent()和siblings()的小问题
Jun 01 Javascript
JS实现iframe自适应高度的方法(兼容IE与FireFox)
Jun 24 Javascript
详解Vue.js 2.0 如何使用axios
Apr 21 Javascript
swiper.js插件实现pc端文本上下滑动功能示例
Dec 03 Javascript
Vue中JS动画与Velocity.js的结合使用
Feb 13 Javascript
Vue匿名插槽与作用域插槽的合并和覆盖行为
Apr 22 Javascript
微信小程序使用字体图标的方法
May 23 Javascript
JavaScript实现简单计时器
Jun 22 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
php2html php生成静态页函数
2008/12/08 PHP
php curl模拟post请求和提交多维数组的示例代码
2015/11/19 PHP
初学JavaScript第二章
2008/09/30 Javascript
基于jquery1.4.2的仿flash超炫焦点图播放效果
2010/04/20 Javascript
jQuery初学:find()方法及children方法的区别分析
2011/01/31 Javascript
JavaScript中发布/订阅模式的简单实例
2014/11/05 Javascript
详解JavaScript中的客户端消息框架设计原理
2015/06/24 Javascript
bootstrap快速制作后台界面
2016/12/05 Javascript
Angularjs在360兼容模式下取数据缓存问题的解决办法
2017/06/22 Javascript
webpack打包并将文件加载到指定的位置方法
2018/02/22 Javascript
微信小程序之swiper轮播图中的图片自适应高度的方法
2018/04/23 Javascript
Angular7.2.7路由使用初体验
2019/03/01 Javascript
使用 vue 实例更好的监听事件及vue实例的方法
2019/04/22 Javascript
如何在微信小程序中存setStorage
2019/12/13 Javascript
JS实现导航栏楼层特效
2020/01/01 Javascript
vue.js实现照片放大功能
2020/06/23 Javascript
浅谈vant组件Picker 选择器选单选问题
2020/11/04 Javascript
[48:48]VGJ.T vs Liquid 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
Python模块学习 datetime介绍
2012/08/27 Python
python+selenium开发环境搭建图文教程
2017/08/11 Python
Python3多线程爬虫实例讲解代码
2018/01/05 Python
浅谈python配置与使用OpenCV踩的一些坑
2018/04/02 Python
python3解析库BeautifulSoup4的安装配置与基本用法
2018/06/26 Python
Python wxpython模块响应鼠标拖动事件操作示例
2018/08/23 Python
python登录WeChat 实现自动回复实例详解
2019/05/28 Python
Python学习笔记之字符串和字符串方法实例详解
2019/08/22 Python
关于多元线性回归分析——Python&amp;SPSS
2020/02/24 Python
利用keras使用神经网络预测销量操作
2020/07/07 Python
Python 图片处理库exifread详解
2021/02/25 Python
NFL欧洲商店(德国):NFL Europe Shop DE
2018/11/03 全球购物
草莓网官网:StrawberryNET
2019/08/21 全球购物
文科生自我鉴定
2014/02/15 职场文书
2014年学习雷锋活动总结
2014/03/01 职场文书
超市活动计划书
2014/04/24 职场文书
基层党员干部四风问题整改方向和措施
2014/09/25 职场文书
2019学子的答谢词范本!
2019/07/05 职场文书