问题描述
我正在尝试最小化使用 pyvips.Image.pngsave()
编写的 PNG 图像的文件大小。仅用 .pngsave(output)
编写的原始文件位于 https://github.com/CDDA-Tilesets/UltimateCataclysm,我们将查看 giant.png
,它是 119536
字节。
ImgBot was able to reduce file size 到 50672
。
pngsave(output,compression=9,palette=True,strip=True) 到 58722
但是 ImageMagick 的 convert
命令仍然能够在后者之后进一步减小文件大小,使用默认选项将文件大小减小到 42833
:
$ convert giant_pyvips_c9.png giant_pyvips_magick.png
问题是是否可以仅使用 42833
将同一图像放入 pyvips
字节以避免在我们的工作流程中添加另一个步骤?
更新:警告
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 默认使用自适应过滤器。
调色板图像将索引编码到查找表中,而不是与亮度相关的任何内容,因此局部相关性要少得多。在这种情况下,过滤实际上会损害压缩。
http://www.w3.org/TR/PNG-Filters.html
您可以在此处查看 filter=
参数允许的值:
https://github.com/libvips/libvips/blob/master/libvips/include/vips/foreign.h#L579-L598