我写了一个无损重新压缩PNG文件的程序。不幸的是,没有一个参数可以保证最佳地做到这一点,我只是检查所有这些参数(计算时间不是对象,反正也不合理)。
具体而言,有:
png_set_compression_level
(0到9)png_set_compression_strategy
(系统,过滤,仅霍夫曼,RLE和静态霍夫曼)png_set_filter
的一堆不同的预过滤器。我使用PNG_ALL_FILTERS
检查所有内容。所以我的代码基本上压缩了所有可能的(10 * 5 * 2 = 100)组合并选择了最小的组合。
这适用于各种典型图像。对于某些图像,减少量可高达20%(尽管5%更为典型)。对于例如图像密集的网站,这是显而易见的。
这是一张PNG图片(link to original):
这是一张测试图片。它恰好占用144,391字节。我的策略best effort是145,501字节。
我并不关心这是大0.77%。我担心我检查了所有参数,其中一个应该是最佳的。所以Can't Happen。
所以我的问题:发生了什么?我想念的参数是什么?我没有在文档中看到任何其他内容。
答案 0 :(得分:1)
您可以尝试使用recompressing with zopfli获得zlib最佳压缩效果。
答案 1 :(得分:0)
通过检查OptiPNG的来源,我发现:
zlib内存使用参数(从png_set_compression_mem_level
间接传递)也会影响压缩率。尽管documentation说的是这样的。我对此没有任何解释,并认为这是一件坏事。
当我将其设置为8
(默认值)而不是我使用的9
时,我能够重现原始图像。
过滤器参数(到png_set_filter
)有所不同。这种意义有道理;为特定行选择最佳滤波器并不一定意味着全局最优压缩(因为该行可能与相邻行压缩较少)。这是一个完整的猜测,因为文档中没有出现这种情况。
当我优化这些值时,我得到一个140,541字节的图像,这似乎是最佳的。