我可以尝试使用哪些其他参数来进一步压缩此 PNG 图像?
What Other Parameters Can I Try to Further Compress This PNG Image?
我编写了一个程序来无损地重新压缩 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):
这是一张测试图片。它正好占用 144,391 个字节。我的策略 best effort 是 145,501 字节。
我不太担心这会大 0.77%。我担心 我检查了所有参数,其中一个应该是最优的。所以这个 Can't Happen.
所以我的问题是:发生了什么事?我错过了哪些参数?我没有在文档中看到任何其他内容。
通过检查 OptiPNG 的来源,我发现:
zlib 内存使用参数(从 png_set_compression_mem_level
间接传递)也会影响压缩比。这一点,尽管 documentation 说了什么。我对此没有任何解释,我认为这是一件坏事。
当我将其设置为 8
(默认值)而不是我使用的 9
时,我能够重现原始图像。
过滤器参数(对png_set_filter
)有所不同。这种说法是有道理的;为特定行选择最佳过滤器并不一定意味着全局最佳压缩(因为该行可能会压缩 less-well 与相邻行)。这是一个完整的猜测,因为 none 出现在文档中。
当我对这些值进行优化时,我得到了一个 140,541 字节的图像,这似乎是最佳的。
您可以尝试 recompressing with zopfli 获得超过 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):
这是一张测试图片。它正好占用 144,391 个字节。我的策略 best effort 是 145,501 字节。
我不太担心这会大 0.77%。我担心 我检查了所有参数,其中一个应该是最优的。所以这个 Can't Happen.
所以我的问题是:发生了什么事?我错过了哪些参数?我没有在文档中看到任何其他内容。
通过检查 OptiPNG 的来源,我发现:
zlib 内存使用参数(从
png_set_compression_mem_level
间接传递)也会影响压缩比。这一点,尽管 documentation 说了什么。我对此没有任何解释,我认为这是一件坏事。当我将其设置为
8
(默认值)而不是我使用的9
时,我能够重现原始图像。过滤器参数(对
png_set_filter
)有所不同。这种说法是有道理的;为特定行选择最佳过滤器并不一定意味着全局最佳压缩(因为该行可能会压缩 less-well 与相邻行)。这是一个完整的猜测,因为 none 出现在文档中。当我对这些值进行优化时,我得到了一个 140,541 字节的图像,这似乎是最佳的。
您可以尝试 recompressing with zopfli 获得超过 zlib 最佳压缩的一些增益。