我试图最小化用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