我想用ImageMagick将32位png转换为8位png,但半透明像素会丢失。如何解决这个问题呢?我正在使用的命令是以下
convert original.png PNG8:output.png
答案 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:
从左到右:
pngquant 256 < input.png > output.png
convert input.png -colors 255 output.png
* convert input.png PNG8:output.png
convert input.png -colors 255 PNG8:output.png
* *)在下面的评论中,建议-colors 255
必须为“背景”颜色保留一个条目。“根据我的测试,我没有观察到实际情况;使用-colors 256
仍然produce an 8-bit colormapped PNG,量化工件在质量上与-colors 255
的输出定性相似,但细节不同。尽管如此,为了安全起见,我已将-colors 255
用于上述示例。将颜色贴图大小减少一种颜色本身不会显着影响结果的质量,因为使用pngquant 255
demonstrate {{3}}的测试。