压缩jpeg以达到指定目标图像文件大小的算法
Algorithm to compress jpeg to achieve a specified target image file size
我有几个javascript库(angular ahdin,J-I-C),在将用户上传的图像提交到后端之前,我可以使用它们来压缩图像。
我看到的所有库都采用了一个质量参数,并使用jpeg压缩来减少文件。在压缩之前,您不知道基于任何质量值生成的图像的文件大小。
我的想法是使用"二进制搜索"类型的算法来尝试不同的质量百分比,直到我最终得到一个刚好低于目标最大文件大小的图像。
它将从50%的jpeg质量开始。如果压缩图像低于目标文件大小,则转到75%的质量,否则转到25%的质量,依此类推。它会在保证的6次迭代内将目标文件大小达到1%的粒度,然后我会停止。
假设没有一个库已经具备了这一功能,还有比二进制搜索更好的方法吗?是否有任何图像研究表明种子价值高于50%?
二进制搜索可能足以解决您的问题,但它隐含地假设压缩文件大小是参数Q的线性函数,而事实可能并非如此。因此,可能存在性能更好的选项。
如果你有一个你将要处理的图像类型的代表性样本,你可能需要计算一个平均大小即Q函数。然后你可以看到一个最佳的起点是什么,以及随着你改变Q,尺寸变化的速度有多快。
在任何情况下,JPEG的量化表通常被计算为标准IJG表的"缩放"版本。表T[i]的条目通常被缩放为作为的Q的函数
S = Q < 50 ? 5000/Q : 200 - 2Q
T_Q[i] = (S*T[i] + 50) / 100
因此,如果你的库遵循这种方法,那么对Q>=50使用二进制(线性)搜索并对Q<50例。
最后,如果您可以使用JPEG2000之类的渐进压缩算法,则可以直接避免此问题,因为可以使用目标比特率(等效性、压缩文件大小)作为参数。
由于JPEG算法的工作方式,如果输出大小真的如此关键,那么"二进制搜索"方法是唯一可行的方法。JPEG的设计根本没有考虑到这一目的,它使用质量设置来丢弃信息,而不是朝着特定目标计算。
由于压缩比会随图像内容和复杂性的不同而变化WILLY,因此没有比从50%开始更好的选择了,您必须分析图像以做出更好的猜测,然后您也可以对其进行压缩。
我在二进制搜索上看到的唯一可能的改进是使其成为分布式搜索。因此,如果50%产生40KB,75%产生80KB,并且你的目标是低于50KB,那么接下来尝试(50%+floor(25*1/4))=56%而不是62.5%是非常安全的。由于JPEG压缩比不是质量设置的线性函数,但我怀疑这在现实世界中会更有效。
- 如何使用url加载程序在webpack中导入多个图像
- nodejs-expressjs上传图像并显示它们
- 使用JSP从服务器检索和显示图像
- 角度:在ng重复上切换图像
- 画廊图像未显示
- 目标 css:背景图像 Javascript
- 上传的图像不会保存在 Node.js 的目标路径中
- 目标段落仅包含图像
- HTML5 画布绘制图像功能在源画布和目标画布相同时变慢
- 压缩jpeg以达到指定目标图像文件大小的算法
- 如何设置应该使用此代码的目标图像
- Wikitude中的多个目标图像的图像识别无法正常工作
- 停止用作图像拖动目标的文本区域
- 图像在多个源DIV,添加/替换当前图像从每个DIV点击到目标DIV
- Jsplumber -在端点中分配两个不同的锚图像,一个用于源,一个用于目标
- 响应式地将图像定位在背景图像上的特定目标上
- 是否有一个好的jQuery (Javascript)库来做快速视频(不是图像)缩放/平移?(目标:iPhone通过Pho
- 目标c-如何在iPad上使用JavaScript/Oj-c将图像保存到照片库
- 如何根据一组控件和目标坐标将图像转换为不同的大小
- KineticJS:拖放后绘制的图像不在拖放目标中