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



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

ImgBot能够将文件大小减小到50672

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

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

$ convert giant_pyvips_c9.png giant_pyvips_magick.png

问题是是否有可能只使用pyvips将相同的图像放入42833字节,以避免为我们的工作流程添加另一个步骤?

更新:警告palette的大小限制为256色,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

Background: PNG filters将图像在压缩前经过差值过滤器。如果值中存在一些局部模式,那么将差异压缩到相邻像素而不是绝对像素值可以提高压缩比。Pyvips默认使用自适应过滤器。

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

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

您可以在这里看到filter=参数允许的值:

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

最新更新