内容简介:基本思路是:先将file数据读取为DataUrl类型的数据,再将DataUrl绘制到canvas,通过canvas的apitoDataURL转换为base64数据并压缩数据,最后再将base64数据转换为blob数据类型,再上传到服务器。整个流程就完成了。下面是具体的实现方式。
由于图片压缩中使用了大量异步操作,这里使用es7 async 语法处理异步问题
基本思路是:先将file数据读取为DataUrl类型的数据,再将DataUrl绘制到canvas,
通过canvas的apitoDataURL转换为base64数据并压缩数据,最后再将base64数据转换
为blob数据类型,再上传到服务器。整个流程就完成了。下面是具体的实现方式。
1.读取file转换为DataUrl
async function fileLoad(file){ return new Promise((resolve)=>{ let ready = new FileReader(); /*开始读取指定的Blob对象或File对象中的内容. 当读取操作完成时, readyState属性的值会成为DONE,如果设置了onloadend事件处理程序, 则调用之.同时,result属性中将包含一个data: URL格式的字符串以表 示所读取文件的内容.*/ ready.readAsDataURL(file); ready.onload = function () { resolve(this.result); } }) }
2.将数据绘制到canvas上,压缩数据
async function canvasDataURL(path, obj) { return new Promise((resolve)=>{ let img = new Image(); img.src = path; img.onload = function () { let that = this; // 默认按比例压缩 let w = that.width, h = that.height, scale = w / h; w = obj.width || w; h = obj.height || (w / scale); let quality = 0.7; // 默认图片质量为0.7 //生成canvas let canvas = document.createElement('canvas'); let ctx = canvas.getContext('2d'); // 创建属性节点 let anw = document.createAttribute("width"); anw.nodeValue = w; let anh = document.createAttribute("height"); anh.nodeValue = h; canvas.setAttributeNode(anw); canvas.setAttributeNode(anh); ctx.drawImage(that, 0, 0, w, h); // 图像质量 if (obj.quality && obj.quality <= 1 && obj.quality > 0) { quality = obj.quality; } // quality值越小,所绘制出的图像越模糊 let base64 = canvas.toDataURL('image/jpeg', quality); // 回调函数返回base64的值 resolve(base64); } }); }
3.将bas64转换为blob
async function convertBase64UrlToBlob(urlData) { return new Promise((resolve)=>{ let arr = urlData.split(','), mime = arr[0].match(/:(.*?);/)[1], bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n); while (n--) { u8arr[n] = bstr.charCodeAt(n); } let blob = new Blob([u8arr], {type: mime}); resolve(blob); }) }
4.最后实现压缩方法
/** * 三个参数 * file:一个是文件(类型是图片格式), * w:配置对象 * photoCompress() */ async function photoCompress(file, w) { let re = await fileLoad(file); let base64 = await canvasDataURL(re, w); let blob = await convertBase64UrlToBlob(base64); return new Promise((resolve)=>{ resolve(blob); }) }
5.使用方法
async function upload(file) { let form = new FormData(); let fileData = await photoCompress(file, { quality: 0.5 }); form.append('pictrue',fileData,file.name); // 上传form }
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 只需一个损失函数、一个超参数即可压缩BERT,MSRA提出模型压缩新方法
- golang压缩和解压缩zip文件
- bitcoin:压缩公钥与未压缩公钥
- 一句话轻松实现压缩图片和文件压缩
- 基于Node.js实现压缩和解压缩的方法
- 一种 JNI 方法实现图片压缩,压缩率极高
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Java核心技术及面试指南
金华、胡书敏、周国华、吴倍敏 / 北京大学出版社 / 2018-9-1 / 59.00
本书根据大多数软件公司对高级开发的普遍标准,为在Java 方面零基础和开发经验在3 年以下的初级程序员提供了升级到高级工程师的路径,并以项目开发和面试为导向,精准地讲述升级必备的技能要点。具体来讲,本书围绕项目常用技术点,重新梳理了基本语法点、面向对象思想、集合对象、异常处理、数据库操作、JDBC、IO 操作、反射和多线程等知识点。 此外,本书还提到了对项目开发很有帮助的“设计模式”和“虚拟......一起来看看 《Java核心技术及面试指南》 这本书的介绍吧!