使用 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 size 到 50672
.
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
我正在尝试最小化使用 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
问题是是否可以仅使用 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