使用 pyvips 减小 PNG 文件大小:匹配 ImgBot 和 ImageMagick 优化

Reducing PNG file size with pyvips: matching ImgBot and ImageMagick optimizations

我正在尝试最小化使用 pyvips.Image.pngsave() 写入的 PNG 图像的文件大小。仅用 .pngsave(output) 写入的原始文件位于 https://github.com/CDDA-Tilesets/UltimateCataclysm,我们将查看 giant.png,即 119536 字节。

ImgBot was able to reduce file size50672.

pngsave(output, compression=9, palette=True, strip=True)58722

但是 ImageMagick 的 convert 命令仍然能够在后者之后进一步减小文件大小,使用默认选项 42833:

$ convert giant_pyvips_c9.png giant_pyvips_magick.png

问题是是否可以仅使用 pyvips 将同一图像放入 42833 字节以避免在我们的工作流程中添加另一个步骤?

更新:警告

palette 大小为 limited to 256 colors,如果转换有损,pyvips 不会警告您。

尝试关闭过滤:

$ vips copy giant.png x.png[palette,compression=9,strip,filter=0]
$ ls -l x.png
-rw-r--r-- 1 john john 41147 Feb 14 10:58 x.png

背景:PNG 过滤器在压缩之前将图像通过差异过滤器。如果值中存在某种局部模式,则压缩与相邻像素的差异而不是绝对像素值可以提高压缩率。 pyvips 默认使用自适应过滤器。

调色板图像将索引编码为查找 table 而不是与亮度相关的任何内容,因此局部相关性要小得多。在这种情况下,过滤实际上会损害压缩。

http://www.w3.org/TR/PNG-Filters.html

您可以在此处查看 filter= 参数允许的值:

https://github.com/libvips/libvips/blob/master/libvips/include/vips/foreign.h#L579-L598