我可以尝试使用哪些其他参数来进一步压缩此PNG图像?

时间:2016-01-11 17:40:32

标签: png zlib

我写了一个无损重新压缩PNG文件的程序。不幸的是,没有一个参数可以保证最佳地做到这一点,我只是检查所有这些参数(计算时间不是对象,反正也不合理)。

具体而言,有:

  • 将10个级别的zlib压缩传递到png_set_compression_level(0到9)
  • 5个zlib策略传入png_set_compression_strategy(系统,过滤,仅霍夫曼,RLE和静态霍夫曼)
  • 隔行扫描(2个值)
  • 传递给png_set_filter的一堆不同的预过滤器。我使用PNG_ALL_FILTERS检查所有内容。

所以我的代码基本上压缩了所有可能的(10 * 5 * 2 = 100)组合并选择了最小的组合。

这适用于各种典型图像。对于某些图像,减少量可高达20%(尽管5%更为典型)。对于例如图像密集的网站,这是显而易见的。

这是一张PNG图片(link to original):
test image

这是一张测试图片。它恰好占用144,391字节。我的策略best effort是145,501字节。

我并不关心这是大0.77%。我担心我检查了所有参数,其中一个应该是最佳的。所以Can't Happen

所以我的问题:发生了什么?我想念的参数是什么?我没有在文档中看到任何其他内容。

2 个答案:

答案 0 :(得分:1)

您可以尝试使用recompressing with zopfli获得zlib最佳压缩效果。

答案 1 :(得分:0)

通过检查OptiPNG的来源,我发现:

  1. zlib内存使用参数(从png_set_compression_mem_level间接传递)也会影响压缩率。尽管documentation说的是这样的。我对此没有任何解释,并认为这是一件坏事。

    当我将其设置为8(默认值)而不是我使用的9时,我能够重现原始图像。

  2. 过滤器参数(到png_set_filter)有所不同。这种意义有道理;为特定行选择最佳滤波器并不一定意味着全局最优压缩(因为该行可能与相邻行压缩较少)。这是一个完整的猜测,因为文档中没有出现这种情况。

    当我优化这些值时,我得到一个140,541字节的图像,这似乎是最佳的。