怎么利用toDataURL压缩图片至固定大小
在使用canvas
的toDataURL
方法压缩图片的时候如何计算quality
使图片压缩至固定大小。
用size算比例好像不行。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
在使用canvas
的toDataURL
方法压缩图片的时候如何计算quality
使图片压缩至固定大小。
用size算比例好像不行。
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(2)
canvas.toDataURL(type, encoderOptions);
type 可选
图片格式,默认为 image/png
encoderOptions 可选
在指定图片格式为 image/jpeg 或 image/webp的情况下,可以从 0 到 1 的区间内选择图片的质量。如果超出取值范围,将会使用默认值 0.92。其他参数会被忽略。
详细见于https://developer.mozilla.org...
做过类似的工作,在前端采用 canvas 压缩jpg图片,但是代码没有留存下来,大致的思路是采用二分法,也就是设定目标文件体积和精度,然后反复压缩直到文件体积与目标体积之差小于设定的精度。
采用二分法的原因是生成 jpeg 的算法的压缩比和图片色彩丰富度、图片频率等图片本身的性质相关,因此 quality 和压缩比的关系不太好计算(计算过程需要对压缩算法有透彻的了解,这样一来还不如自己写压缩算法) 。
精度不能设太小,不然可能导致脚本运行时间过长甚至死循环,当然还可以限制循环次数,然后选择符合条件且最接近目标体积的文件输出。
这里还有一个难点就是文件体积的计算,我采用的方法是将文件转成 base64 字符串,然后去掉占位的等号,再计算字符串长度来获得,这个过程也比较费事,可以考虑 WebWorker。
2021年1月,重新做了类似功能,搜索方案的时候看到了自己的答案……重新实现了一下,使用二分法,没有做 polyfill,但还是有参考意义的,Windows chrome 80+ 浏览器测试过了,一般图片没有问题,代码如下: