通过保留半透明像素,使用ImageMagick将32位png转换为8位png

Kar*_*mar 10 png transparency imagemagick image-processing png-8

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

convert original.png PNG8:output.png
Run Code Online (Sandbox Code Playgroud)

Ilm*_*nen 16

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

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

幸运的是,这个特定的工作有一个更好的工具:pngquant.使用它,将32位RGBA PNG转换为8位色彩映射PNG,质量损失最小,就像下面这样简单:

pngquant 256 < original.png > output.png
Run Code Online (Sandbox Code Playgroud)

作为一个快速演示,这里是一个简单的测试图片(一个半透明阴影的星星)使用各种方法转换为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必须"为'背景'颜色保留一个条目." 根据我的测试,我没有观察到实际情况; 使用-colors 256仍然会产生一个8位色彩映射的PNG,其量化伪像在质量上与输出相似,但细节与输出不同-colors 255.尽管如此,为了安全起见,我已经习惯-colors 255了上面的例子.将色彩图大小减少一种颜色本身不应该显着影响结果的质量,因为测试pngquant 255证明.

  • 是的,我试过了两个.第二个使完全透明的像素变黑.我开始使用pngquant命令行工具而不是ImageMagick.它正确保留alpha通道. (2认同)
  • 不需要保留背景颜色,但 ImageMagick 默认保留一种背景颜色。您可以使用“-define png:exclude-chunk=bKGD”来避免这种情况。使用“-colors 255”和*不*指定 PNG8 的量化可能看起来更好:(PNG8 使用一种快速而肮脏的量化方法,只需将较低位清零)。但事实上,我更喜欢使用 pngquant 而不是 ImageMagick 来生成调色板。 (2认同)