一、功能体验

先看demo:使用canvas在前端压缩图片并上传demo

如下截图:

点击文件选择框,我们不妨选一张尺寸比较大的图片,例如下面这种2M多的钓鱼收获照:

于是图片歘歘歘地传上去了:

此时我们点击最终上传完毕的图片地址,会发现原来2M多3000多像素宽的图片被限制为400像素宽了:

保存到本地会发现图片尺寸已经变成只有70K了:

以上就是图片前端压缩并上传demo的完整演示。

二、实现原理

要想使用JS实现图片的压缩效果,原理其实很简单,核心API就是使用canvasdrawImage()方法。

Canvas本质上就是一张位图,而drawImage()方法可以把一张大大的图片绘制在小小的Canvas画布上,不久等同于图片尺寸压缩了?

对于本案例的压缩,使用的5个参数的API方法:

context.drawImage(img, dx, dy, dWidth, dHeight);复制代码

各参数具体含义可以参见“Canvas API中文文档-drawImage”,这里不展开。

举例:
一张图片(假设图片对象是img)的原始尺寸是4000*3000,现在需要把尺寸限制为400*300大小,很简单,原理如下代码示意:

var canvas = document.createElement('canvas');
var context = canvas.getContext('2d');
canvas.width = 400;
canvas.height = 300;
// 核心JS就这个
context.drawImage(img,0,0,400,300);复制代码

把大图片画在一张小画布上,压缩就这么实现了,是不是简单的有点超乎想象。

三、如果想要上传或下载?

如果想要上传图片或者下载图片,可以使用canvas.toDataURL()或者canvas.toBlob()方法先进行转换。

1. canvas.toDataURL()

语法如下:

canvas.toDataURL(mimeType, qualityArgument)复制代码

可以把画布转换成base64格式信息图像信息,纯字符的图片表示法。

其中:
mimeType表示canvas导出来的base64图片的类型,默认是png格式,也即是默认值是'image/png',我们也可以指定为jpg格式'image/jpeg'或者webp等格式。file对象中的file.type就是文件的mimeType类型,在转换时候正好可以直接拿来用(如果有file对象)。
qualityArgument表示导出的图片质量,只要导出为jpgwebp格式的时候此参数才有效果,默认值是0.92,是一个比较合理的图片质量输出参数,通常情况下,我们无需再设定。

更多关于toDataURL()方法的信息可以参见“Canvas API中文文档-toDataURL()”。

2. canvas.toBlob()方法

语法如下:

canvas.toBlob(callback, mimeType, qualityArgument)复制代码

可以把画布转换成Blob文件,通常用在文件上传中,因为是二进制的,对后端更加友好。

toDataURL()方法相比,toBlob()方法是异步的,因此多了个callback参数,这个callback回调方法默认的第一个参数就是转换好的blob文件信息,本文一开始的demo案例中的文件上传就是将canvas图片转换成二进制的blob文件,然后再ajax上传的,代码如下:

// canvas转为blob并上传
canvas.toBlob(function (blob) {// 图片ajax上传var xhr = new XMLHttpRequest();// 开始上传xhr.open("POST", 'upload.php', true);xhr.send(blob);
});复制代码

更多关于toBlob()方法的信息可以参见“Canvas API中文文档-toBlob()”。

一旦有了可传输的图像数据,上传下载就好实现了。例如下载前端压缩好的图片,可以参考我上一篇在掘金发布的文章:“纯JS生成并下载各种文本文件或图片”。

四、总结

经过“图片→canvas压缩→图片”三步曲,我们完成了图片前端压缩功能。

以上,感谢阅读!

作者:张鑫旭
链接:https://juejin.im/post/5bec3c6cf265da614312a0fa
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

图片纯前端JS压缩的实现相关推荐

  1. 纯前端JS导出Word包含图片

    纯前端JS导出Word包含图片 纯前端JS导出Word文档包含图片 Word导出方式 依赖 实现代码 纯前端JS导出Word文档包含图片 在做项目中,遇到一个需求,是将后台返回的属性以及URL图片导出 ...

  2. 阿发你好java_191122_01 纯前端JS实现的文字验证码

    纯前端JS实现的文字验证码 作者:邵发 本文是Java学习指南系列教程的官方配套文档.内容介绍一种基于JavaScript绘制的纯前端实现的验证码技术.本文附带项目源码及相关JAR包. 1.  验证码 ...

  3. 纯前端JS实现一个登记照改换底色背景色功能

    说到登记照改换底色功能的实现,我想大部分人都会认为使用opencv或者机器学习方法对图像进行图像分割.边缘检测.基于语义的物体检测.无监督的像素分类算法等等算法是最好的途径. 而我最近实现了一个登记照 ...

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

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

  5. blob 图片_前端JS实现字符串/图片/excel文件下载

    编者按:本文转载自SF专栏,由作者 赵帅强 授权奇舞周刊转载 在web开发中,如果你想让用户下载或者导出一个文件,应该怎么做呢? 传统的做法是在后端存储或者即时生成一个文件来提供下载功能,这样的优势是 ...

  6. 纯前端JS实现人脸识别眨眨眼张张嘴案例

    在不久之前我发布了一个案例,是java通过百度云人脸识别接口实现活体检测(张张嘴和眨眨眼)的案例,大家可以去看看:人脸识别活体检测之眨眨眼和张张嘴,今天我就抽空更新一下纯JS的活体检测吧. 首先给大家 ...

  7. 前端js压缩上传图片 多图、单图 ajax上传

    <script>/*三个参数file:一个是文件(类型是图片格式),w:一个是文件压缩的后宽度,宽度越小,字节越小objDiv:一个是容器或者回调函数photoCompress()*/fu ...

  8. 纯前端js(或者vue)导出excel实现:合并单元格、设置单元格样式、单元格内换行

    前提是安装xlsx,已经可以导出普通的excel npm install --save xlsx file-saver 然后需要安装 npm install xlsx-style 如果运行的时候报错 ...

  9. 纯前端JS实现文件上传解析渲染页面

    AI真的能代替前端吗? 回答:不会完全代替 能用吗?复制到项目中只会报错 爆红 --他完全不能理解你需要什么 JavaScript(简称JS)是一种轻量级的脚本语言,主要用于在Web页面上添加交互行为 ...

最新文章

  1. 挨踢部落直播课堂第一期:起航2017——拥抱大数据
  2. 启动Tomcat出现乱码--淇℃伅
  3. 一篇文章教你学会Java基础JDBC
  4. LeetCode单链表题目测试代码(只需添加对应题目,本地即可debug)
  5. 《Cortex-M0权威指南》之体系结构---栈空间操作
  6. android 调试好事工具类,Android 工具类之总结 Hua
  7. Bzoj2124(p5364): 等差子序列
  8. Python UnicodeEncodeError: ‘gbk‘ codec can‘t encode character 解决方法
  9. EF的表连接方法Include() - nlh774
  10. oracle append 分区,insert append 到底扩展几个数据块?
  11. Atitit attilax在自然语言处理领域的成果
  12. idea插件开发教程
  13. 微机 —— 可编程并行接口芯片8255A 应用
  14. android viewpager中每个view,ViewPager系列之 打造一个通用的ViewPager
  15. 王道数据结构3.3.6——2、铁道进行车厢调度,将一辆列车的硬座车厢都调到软坐车厢后面
  16. linux下非root用户如何修改root权限的文件
  17. 天融信上网行为管理如何做短信验证?
  18. java孙膑与庞涓_用java解决鬼谷子问题
  19. Java虚拟机学习与总结(二)
  20. 总结:java.lang包

热门文章

  1. mysql update报错
  2. 所有地区的中英文名称,手机区号,字母缩写(代码)json文件整理
  3. 时尚星球_时尚和科技属于一起吗?
  4. Android多媒体开发技术
  5. java.net.UnknownHostException 异常处理(个人案例)
  6. oracle出现“无法为表空间 XX 中的段创建 INITIAL 区”错误
  7. Windows Server 2008 R2安装openSSH服务
  8. java基础之测试1
  9. 文本导出的方方面面—工资好助手
  10. 求一份 2018年5月更新最新全国省市区县geojson数据(江苏)(echarts等图表可用)