16

我想用 ImageMagick 将 32 位 png 转换为 8 位 png,但是半透明像素丢失了。如何解决这个问题呢?我正在使用的命令如下

convert original.png PNG8:output.png
4

1 回答 1

22

显然,尽管 PNG 格式实际上允许 8 位索引颜色 PNG 中的任何和所有颜色完全或部分透明,但 ImageMagick 的“PNG8”格式说明符仅支持 GIF 样式的 1 位透明度。

通过不使用说明符,可以使用 ImageMagick 生成索引的 8 位 PNG PNG8:,而只需使用-colors 256or -colors 255* 来减少图像中的颜色数量。不幸的是,至少基于我使用 ImageMagick 6.8.9 的测试,生成的图像有一些相当奇怪且非常不必要的丑陋颜色量化伪影。

幸运的是,对于这项特定的工作,有一个更好的工具:pngquant。使用它,以最小的质量损失将 32 位 RGBA PNG 转换为 8 位彩色映射 PNG 非常简单:

pngquant 256 < original.png > output.png

作为快速演示,这里有一张简单的测试图片(带有半透明阴影的星星),使用各种方法转换为 8 位 PNG:

原来的 pngquant 256 ImageMagick 转换 (-colors 255) ImageMagick 转换 (PNG8) ImageMagick 转换(-colors 255,PNG8)

从左到右:

  1. 原始 32 位 RGBA PNG
  2. 量化为pngquant 256 < input.png > output.png
  3. 量化为convert input.png -colors 255 output.png*
  4. 量化为convert input.png PNG8:output.png
  5. 量化为convert input.png -colors 255 PNG8:output.png*

*)在下面的评论中,建议-colors 255有必要“为'背景'颜色保留一个条目”。根据我的测试,我并没有观察到这种情况。using-colors 256仍将生成 8 位颜色映射 PNG,其量化伪影在质量上与-colors 255. 尽管如此,为了安全起见,我已经使用-colors 255了上面的示例。将颜色图大小减少一种颜色本身不会显着影响结果的质量,正如测试pngquant 255证明的那样。

于 2012-12-25T15:53:44.747 回答