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

Javascript 压缩jpeg以达到指定目标图像文件大小的算法,javascript,image-compression,Javascript,Image Compression,我有两个javascript库(,),可以用来压缩用户上传的图像,然后再提交到后端 我见过的所有库都采用质量参数,并使用jpeg压缩来减少文件。在压缩之前,您不知道基于任何质量值生成的图像的文件大小 我的想法是使用一种“二进制搜索”类型的算法来尝试不同的质量百分比,直到最终得到一个刚好低于目标最大文件大小的图像 它将以50%的jpeg质量开始。如果压缩图像小于目标文件大小,则转到75%质量,否则转到25%质量,依此类推。它将在保证的6次迭代中达到目标文件大小的1%粒度,然后我将停止 假设没有一个

我有两个javascript库(,),可以用来压缩用户上传的图像,然后再提交到后端

我见过的所有库都采用质量参数,并使用jpeg压缩来减少文件。在压缩之前,您不知道基于任何质量值生成的图像的文件大小

我的想法是使用一种“二进制搜索”类型的算法来尝试不同的质量百分比,直到最终得到一个刚好低于目标最大文件大小的图像

它将以50%的jpeg质量开始。如果压缩图像小于目标文件大小,则转到75%质量,否则转到25%质量,依此类推。它将在保证的6次迭代中达到目标文件大小的1%粒度,然后我将停止


假设没有一个库已经有这个功能,有没有比二进制搜索更好的方法?是否有任何图像研究表明种子价值高于50%

由于JPEG算法的工作方式,如果输出大小确实如此关键,那么“二进制搜索”方法是唯一可行的方法。JPEG的设计根本没有考虑到这一目的,而是使用质量设置来丢弃信息,而不是朝着特定目标计算

由于压缩比将根据图像内容和复杂度而变化很大,因此也没有比从50%开始更好的选择,您必须分析图像以做出更好的猜测,然后您也可以对其进行压缩


我在二进制搜索上看到的唯一可能的改进是使其成为分布式搜索。因此,如果50%的产量为40KB,75%的产量为80KB,而您的目标是50KB以下,那么尝试(50%+下限(25*1/4))=56%,而不是62.5%,这是一个相当安全的赌注。由于JPEG压缩比不是质量设置的线性函数,但我怀疑这在实际情况下会更有效。

二进制搜索可能足以解决您的问题,但它隐含地假设压缩文件大小是参数Q的线性函数,而参数Q可能不是。因此,可能有更好的执行选项

如果您有一个您将要处理的图像类型的代表性样本,您可能需要计算一个平均大小作为Q函数的函数。然后,您可以看到最佳起点是什么,以及随着Q的变化,大小变化的速度有多快

在任何情况下,JPEG的量化表通常作为标准IJG表的“缩放”版本进行计算。表T[i]的条目通常作为Q as的函数进行缩放

S = Q < 50 ? 5000/Q : 200 - 2Q
T_Q[i] = (S*T[i] + 50) / 100
S=Q<50?5000/季度:200-2季度
T_Q[i]=(S*T[i]+50)/100

因此,如果您的库采用这种方法,那么对Q>=50使用二进制(线性)搜索并调整对QSo的线性搜索是有意义的,您认为(50%+下限(25*1/4))通常可以节省一些迭代?至少这是一个想法,也许吧。我和你们一样感兴趣的是,这是否比纯二进制方法更有效,呵呵。你必须运行100多个测试用例来验证它。好的,我会再给你一点时间,然后标记为答案,除非我们有一个jpeg团队成员或什么。谢谢!给我一天时间复习,尤其是JPEG2000