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

时间:2012-12-25 15:37:57

标签: image-processing imagemagick png transparency png-8

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

convert original.png PNG8:output.png

1 个答案:

答案 0 :(得分:14)

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

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

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

pngquant 256 < original.png > output.png

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

  

Original   pngquant 256   ImageMagick convert (-colors 255)   ImageMagick convert (PNG8)   ImageMagick convert (-colors 255, PNG8)

从左到右:

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

    *)在下面的评论中,建议-colors 255必须为“背景”颜色保留一个条目。“根据我的测试,我没有观察到实际情况;使用-colors 256仍然produce an 8-bit colormapped PNG,量化工件在质量上与-colors 255的输出定性相似,但细节不同。尽管如此,为了安全起见,我已将-colors 255用于上述示例。将颜色贴图大小减少一种颜色本身不会显着影响结果的质量,因为使用pngquant 255 demonstrate {{3}}的测试。