由于图片压缩中使用了大量异步操作,这里使用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//生成canvaslet 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
}

基于canvas的图片压缩函数实现相关推荐

  1. 基于canvas的图片剪裁工具

    工具下载地址:https://github.com/zforler/clip 直接再浏览器中打开index.html即可(基于canvas的图片操作,在谷歌浏览器中会受到同源策略的限制,放到服务容器里 ...

  2. JS前端基于canvas给图片添加水印,并下载带有水印的图片

    基于canvas给图片添加水印 实现效果图 图片添加水印的步骤 1.获取图片路径,将图片转换为canvas 2.canvas画布上绘制文字水印 3.水印绘制完成后,将canvas转换为图片格式 4.水 ...

  3. 前端实现可绘制的canvas画布_JS前端基于canvas给图片添加水印

    前两天给个人网站添加了一个小功能,就是在文章编辑上传图片的时候自动给图片加上水印.给网页图片添加水印是个常见的功能,也是互联网内容作者保护自己版权的方法之一.本文简单记录一下借助canvas在前端实现 ...

  4. 基于Canvas 实现图片转点阵图

    要实现什么 同事想做一张世界地图的背景图,但是网上找的图片都太low了.他想用那种密集的点阵组成的世界地图.作为程序员,想法当然是通过图片处理,识别像素点,然后生成新的图片. 目标是这样的: 实现思路 ...

  5. 基于canvas实现波浪式绘制图片

    写在最前 本次的分享是一个基于canvas的更新图片特效实现.其中主要涉及canvas中getImageData().putImageData().toDataURL()方法的使用.效果请看下面. 欢 ...

  6. html 图片剪裁控件,h5图像裁剪(基于canvas)插件Image-Clip

    插件描述:支持旋转,预览,裁剪框选择,压缩比例设置等 Image-Clip 图像的裁剪压缩 功能包括:canvas绘制图片 裁剪框选择裁剪大小 旋转功能 放大镜(方便旋转) 裁剪功能 缩放.压缩功能( ...

  7. 飞机大战HTML5游戏源码,基于Canvas制作的网页版飞机大战游戏+飞机大战手机端

    简介: 飞机大战HTML5游戏源码是一款基于Canvas制作的网页版飞机大战游戏,画质精美的飞机大战手机端游戏源码 网盘下载地址: http://kekewangLuo.net/W1S2LQcqAT2 ...

  8. canvas换图时候会闪烁_基于Canvas实现的高斯模糊(上)「JS篇」

    作者:iNahoo 转发链接:https://mp.weixin.qq.com/s/5TxPjznpEBku_ybSMBdnfw 目录 基于Canvas实现的高斯模糊(上)「JS篇」本篇 基于Canv ...

  9. 基于canvas+uniapp的9宫格拼图游戏组件

    基于 canvas+uniapp 的 9 宫格拼图游戏 涉及到的 canvas 基础知识 创建画布 <canvas id="'c1'"></canvas> ...

最新文章

  1. csharp DataTable and DataGridView delete a Row
  2. oracle 创建数据库 表空间 用户 授权和toad导入导出数据库
  3. jvm学习笔记(二)
  4. jvm调优:使用jconsole监控Jboss
  5. 吴恩达《机器学习》学习笔记四——单变量线性回归(梯度下降法)代码
  6. 教你如何快速入门python_如何快速入门python
  7. mysql跳过安全_Navicat连接MySQL数据库
  8. Parcel极速零配置Web应用打包工具
  9. OAuth2.0_授权服务配置_三项内容_Spring Security OAuth2.0认证授权---springcloud工作笔记141
  10. PETS:伯克利大神Sergey Levine指导的概率集成轨迹采样算法
  11. 测试用例方法--等价类划分法
  12. 姜成转载:站群的操作方法
  13. 找不到服务器或应用项目,word中文档时提示“找不到服务器应用程序、源文件或项目”有...-office软件找不到word文档,officewo...
  14. 【IoT】NFC APDU 使用基础浅析
  15. 概率与数理统计学习总结四---连续型随机变量及其概率密度
  16. docker Docs
  17. 用java web start来发布jbpm(三)
  18. Linux中国微信,「Linux 中国」2018 微信文章排行榜 | Linux 中国
  19. 自媒体人都在用这 5个素材网站
  20. 关于AOP 的切点的作用范围详解(一)

热门文章

  1. Python文件夹与文件的操作
  2. 【mongoDB】 备份
  3. android Json处理换行符
  4. Java并发编程—自旋锁CLHLock原理
  5. 如何实现不安装xpoedinstall激活xposed模块
  6. 2019牛客暑期多校训练营(第八场)G Gemstones(模拟)
  7. 关于Struts2的通配方法、转发重定向
  8. Spring MVC(三)--控制器接受普通请求参数
  9. oracle11gR2静默安装
  10. 使用requireJS的shim參数,完毕jquery插件的载入