压缩jpeg以达到指定目标图像文件大小的算法

Algorithm to compress jpeg to achieve a specified target image file size

本文关键字:图像 目标 文件大小 算法 jpeg 压缩      更新时间:2023-09-26

我有几个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压缩比不是质量设置的线性函数,但我怀疑这在现实世界中会更有效。