使用 PIL 时 pngquant 输出的文件大小增加

File size increase for pngquant output when using PIL

如果我使用 pngquant 压缩和成像,然后使用 PIL 读取和写入,我发现文件大小显着增加(有时高达 2 倍)。有人在这里有任何提示吗?我怀疑这可能与一些 PIL 标志有关,但对它还不够熟悉。

and then read and write out with PIL, I see file size increase significantly (sometimes by up to 2x)

由于 PNG 是无损的,因此不会引入其他编码器可能有问题的伪影,我只看到三种真正的可能性:

  • 您正在使用不同的位深度进行保存(例如输入 8 位,输出 24 位)
  • 您保存时添加了 alpha 信息
  • 调色板被大量重新排序(这不应该保存或丢失超过百分之几,但在没有看到实际图像的情况下,如果 2x 是一个例外情况并且规则接近 1.2x,它 在可能的范围内)

对于 非常 的小文件,如果 PIL 重新添加一些 pngquant 删除的数据,非图像块可能是问题的一部分。获取一些能够转储所有块(PLTE、tEXT 等)的列表和大小的 PNG 诊断工具,并查看实际增加发生的位置 (Quick google link)。

zLib 也可能是罪魁祸首(例如,如果内存可用,advpng 使用欺骗性的 zlib 来提高性能),但不是那些数字,除非我们谈论的文件足够小,甚至几个字节可能很重要。

除非您修改任何 RGBA 或使用不同的 settings 保存,否则无论您使用何种库或应用程序,读取和写入 PNG 对文件大小几乎没有影响。

使用 pngquant 生成的图像和 PIL 的概念证明:

$ wget https://pngquant.org/Ducati_side_shadow-fs8.png
$ python
>>> from PIL import Image
>>> im = Image.open("Ducati_side_shadow-fs8.png")
>>> im.rotate(180).save("output.png")
$ stat -c "%s %n" *.png
23405 Ducati_side_shadow-fs8.png
23362 output.png

在上面的例子中,output.png甚至比原来少了43个字节。我们已将其上下颠倒旋转但未触及颜色或 alpha。