前端及node端的图片压缩处理
前端
此处我的业务场景是后台管理和小程序,后台管理就是正常的
vue
+elementUI
,小程序是原生无UI
框架,后台管理端主要涉及到的图片上传为文章主图上传、富文本编辑器中的图片上传,此处先做正常的文章主图上传压缩处理。
input
框的图片选择限制选择文件类型为图片下的png
、jpg
、jpeg
pc
端封装
H5
端的图片压缩是使用的canvas重新绘图来实现的。具体代码如下
1 | /** |
小程序端封装
当前业务中的小程序端涉及到的图片上传就是用户在补充信息时需要进行上传头像,用户在浏览个人资料的时候可以更改自己的头像
小程序端进行图片压缩主要有三种方式可选择,一种是小程序官方提供的接口
wx.compressImage()
官方文档提供的接口能力,很怪,ios
大多数情况下是可以的,但是安卓有时候反而会把图片变大,不做选择。第二种是用canvas重绘来进行图片压缩,可自定义性比较强一点。第三种就是找一下有没有图片压缩的插件之类的了。我选用的是第二种方式。
小程序端的
canvas
绘制相关api
有做更新,这里做老版和新版的写法说明,老版写法参考的文章微信小程序对图片进行canvas压缩的方法示例详解,老版写法尝试成功,新版写法未做尝试。
老版写法
1 | // 封装utils功能文件 |
1 | <!-- wxml --> |
1 | // js |
新版的canvas绘制写法
1 | // 主要是canvas这个函数的一些内容写法不同 |
1 | <!-- wxml --> |
这里的图片压缩是用图片清晰度来换取空间的,所以图片压缩的越小,就越模糊,如果业务场景是需要压缩体积且足够清晰,此种方法不可取。
node
端
后端我用的是
node
端做的接口,框架是express
,主要是两个场景,一个是接口接收文件数据时先进行图片压缩处理然后保存在服务器本地或者上传到七牛云,此处选择的是保存在服务器本地。另一个场景是脚本执行,选择服务器某个图片资源文件夹,进行图片压缩处理。
接口接收文件数据进行图片压缩处理保存在服务器本地(也可选择接七牛云图片存储)
选择服务器本地图片进行压缩处理
此处选择的方案是使用
npm
包tinify
,具体的api
功能可以查看官网tiniPNG
,封装成js
文件,随意更改图片资源的地址执行文件以压缩文件夹里的图片资源,但是tinify
的限制是每个月免费500次请求次数,超出次数进行收费,所以目前我还没找到最优解。
刚开始我也尝试了另一个
npm
包images
的使用,但是发现无法对png
图片进行压缩,或者是压缩效果不明显,因为规定的quality
压缩质量字段对png
形式的图片是不起作用的,只好放弃。
tinify
虽然不能规定压缩质量,但是压缩效果还是比较令人满意的,压缩前后对比,图片质量几乎没有明显的下降。
下载tinify
包
1 | npm i tinify --save |
如下为示例代码
1 | /** |
1 | /** |
还有一可选方案,图片在上传之后,通过
tinify
转成webp
形式的图片,体积会很小,然后存储在数据库中的图片地址字段为base64
形式,这样小程序中也能正常展示,在查阅相关资料的时候看到有这样的方案,未做尝试。
本文作者:人模人样的搬砖老段
本文链接:前端及node端的图片压缩处理
如有错误,请及时评论或者知乎私信或者 B 站私信哦~
最后更新于:2022/10/11