前端如何压缩图片质量

  • 开篇语
  • 惊人,后端竟对前端提出这样的要求
  • 常用的压缩方法
  • Canvas压缩图片的重要知识点
  • demo下载

开篇语

在我的博客,“生活”这模块里,经常需要上传图片。这些图片一般都是我用手机拍摄的,图片质量一般在2-5M左右。所以,我会在图片上传后,使用tinypng接口进行图片压缩。这样,显示的图片会在几百KB左右,点击大图预览才会加载原图。

惊人,后端竟对前端提出这样的要求

就在前两个月,在团队项目里。甲方提出了一个需求,要求对上传的图片进行压缩。在我的思维逻辑里,压缩工作是在图片上传后,后端去进行处理的。
经过小组的讨论分析,后端想要把图片质量压缩的工作放在前端去进行处理,这样可以减少请求时间,客户体验感会更好。当时的有点懵逼,前端还能去处理图片的压缩?

常用的压缩方法

  1. 图片上传到阿里云或者七牛云,云端会压缩图片;
  2. 后端对图片尺寸大小进行压缩,比如tinypng等接口,都可以完成,但压缩时间很久;
  3. 前端用Canvas作为媒介压缩图片;

显然团队的项目更适用于第三种方法。而且网上一大堆相关的资料。

Canvas压缩图片的重要知识点

  • file对象转成Data URL
  • 使用canvas对图片进行缩放,从而达到压缩质量的目的;
  • canvas元素所展示的图片再次转换成Data URL
  • 最后把Data URL转成blob

详细代码解释如下:

function compress (file,callback) {var reader = new FileReader();// 将file 对象转成 Data URLreader.readAsDataURL(file);reader.onload = function(e) {// 新建一个img 标签(还没嵌入DOM节点)var image = new Image();image.src = e.target.result;image.onload = function() {// canvas.getContext 进行宽高的改变,从而达到压缩质量的目的var canvas      = document.createElement('canvas'), context     = canvas.getContext('2d');imageWidth  = 300,  // 压缩质量宽度imageHeight = 300,  // 压缩质量高度compactData = '';canvas.width  = imageWidth;canvas.height = imageHeight;context.drawImage(image, 0, 0, imageWidth, imageHeight);// 将canvas 元素所展示的图片再次转换成 Data URL// 到这已经压缩完成了compactData = canvas.toDataURL(file.type);// 最后把Data URL 转成 blobvar byteString, mimeString, u8arr, blob;if ( compactData.split(",")[0].indexOf("compactData") >= 0 ) {byteString = atob(compactData.split(",")[1]); } else{ byteString = unescape(compactData.split(",")[1]); }mimeString = compactData .split(",")[0] .split(":")[1] .split(";")[0]; u8arr      = new Uint8Array(byteString.length); for ( var i = 0; i < byteString.length; i++ ) { u8arr[i] = byteString.charCodeAt(i); } blob = new Blob([u8arr], { type: mimeString });   // 返回原file 对象、压缩后的file 对象、压缩后的 Data URLcallback && callback(file, blob, compactData);};};
};

在上述样例中,主要是经历了图片 -->canvas缩放压缩 --> 图片的过程。在图片压缩完成后,看个人所需,可以做不同的处理。例如将压缩后的图片显示在页面,作为略缩图,或者直接上传压缩图片。

但要注意的是,上传图片必须是blob对象,所以在压缩后,必须转换成blob对象才能进行上传。转换blob对象的方法好几种,原生的canvas也提供转换blob的方法。有兴趣可以去了解。

demo下载

  • 前端压缩图片样例资源下载
  • 样例地址:www.qiuzhipeng.com/resource/demo/compress.html)

前端如何压缩图片质量相关推荐

  1. 前端图片压缩上传(纯js的质量压缩,非长宽压缩)

    前端图片压缩上传(纯js的质量压缩,非长宽压缩) 此demo为大于1M对图片进行压缩上传 若小于1M则原图上传,可以根据自己实际需求更改. demo源码如下: <!DOCTYPE html> ...

  2. 前端图片压缩上传(压缩篇)

    为什么说这是一篇比较适合小白的前端图片压缩文章呢?因为我也是一个刚工作半年的前端小白,最近接到了一个前端图片压缩上传的任务,通过各种百度博客完成了这项任务,但是任务完成后对各种技术细节却还不是特别理解 ...

  3. vant框架上传组件---上传身份证两面图片需求并且压缩图片质量,非压缩长宽——商城项目

    场景 1.vant框架上传组件-上传身份证两面图片需求并且压缩图片质量,非压缩长宽--商城项目 2.压缩图片质量大小-- 3.压缩逻辑因为是正反两面单独压缩执行,所以我这里使用 Promise.all ...

  4. 前端实现压缩图片的功能(vue-element)

    前言: 随着现在手机像素,拍照功能越来越好,随之而来的是本地图片越来越大,那么如何更好的将本地图片上传到后端接口呢?这是后台管理系统常见的场景和头疼的问题,这里分享下个人的方法. 实现效果: 如下图所 ...

  5. JS前端图片压缩上传

    JS前端图片压缩上传重点知识 最近在做一个手机端的图片上传,写了一个比较符合自己要求的方法,可供参考 在做这个功能模块时,我遇到了以下问题,都花费了大量时间: 1. 不知道怎么压缩图片,(代码和方法) ...

  6. 前端资源压缩合并maven插件之wro4j

    前端资源压缩合并maven插件之wro4j 原文写于 2014-05-14 https://github.com/kuitos/kuitos.github.io/issues/5 参考文章:前端性能优 ...

  7. 移动前端—图片压缩上传实践

    在做移动端图片上传的时候,用户传的都是手机本地图片,而本地图片一般都相对比较大,拿iphone6来说,平时拍很多图片都是一两M的,如果直接这样上传,那图片就太大了,如果用户用的是移动流量,完全把图片上 ...

  8. 前端js压缩图片:compressionjs的使用

    compressionjs <!DOCTYPE html> <html lang="zh"><head><title>前端图片压缩 ...

  9. 图片纯前端JS压缩的实现

    一.功能体验 先看demo:使用canvas在前端压缩图片并上传demo 如下截图: 点击文件选择框,我们不妨选一张尺寸比较大的图片,例如下面这种2M多的钓鱼收获照: 于是图片歘歘歘地传上去了: 此时 ...

  10. android压缩图片质量,Android 图片质量压缩有关问题

    Android 图片质量压缩问题 本帖最后由 u013064347 于 2014-01-13 10:22:47 编辑 网上看到一个图片质量压缩法,传入1M以内图片能正常压缩,但是传入2M多的图片就报内 ...

最新文章

  1. 《Cell》新发现!“第二大脑”的反击
  2. 【PC工具】更新github下载加速器,github项目辅助下载工具,github高速下载
  3. php数组常用函数汇总
  4. CF1472(div3):总结
  5. rm删除文件显示:Operation not permitted
  6. USB移动硬盘使用中的怪现象
  7. Huber Loss function
  8. python数据类型、if判断语句
  9. 十步叫你如何无损修复硬盘锁(mbr病毒)
  10. 计算机技术在材料成型工业中的应用,计算机在材料成型应用摘要.ppt
  11. zookeeper源码分析一:源码环境搭建
  12. 非线性思维 -- 大前研一
  13. 阿里云oss使用cdn,节省oss下行流量
  14. 带你用selenium IDE的录制第一个自动化测试脚本
  15. win10更改IP地址遇错(出现了一个意外情况,不能完成你的更改)
  16. 解决不安装VC运行库(VC2005,VC2008),程序运行出错的方法。
  17. 无线网卡抓包小记--我的无线网卡终于能抓包了
  18. 武汉理工大学计算机专业强化,2020年武汉理工大学计算机改考408
  19. 圣诞歌曲汇总-27首
  20. Glide加载图片框架(仅获取BitMap)

热门文章

  1. python 卡方检验批量筛选_用python进行列联表卡方检验
  2. mac 连接android手机调试,mac连接华为手机,无法真机调试。
  3. 将腾讯云的云服务器迁移至轻量云服务器Ubuntu
  4. PHP制作QQ微信支付宝三合一收款码
  5. FRM-18108和FRM-10102解决方法
  6. Linux命令总结大全,包含所有linux命令
  7. matlab中的小于等于,ps中如何画出小于等于符号
  8. 学硕与专硕 计算机,2019计算机考研选学硕还是专硕?
  9. 关于word的标题处小黑点的去除
  10. uniapp项目 App端实现微信登录、QQ登录