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

问题描述

我正在尝试最小化使用 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

问题是是否可以仅使用 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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...