我想用 ImageMagick 将 32 位 png 转换为 8 位 png,但是半透明像素丢失了。如何解决这个问题呢?我正在使用的命令如下
convert original.png PNG8:output.png
我想用 ImageMagick 将 32 位 png 转换为 8 位 png,但是半透明像素丢失了。如何解决这个问题呢?我正在使用的命令如下
convert original.png PNG8:output.png
显然,尽管 PNG 格式实际上允许 8 位索引颜色 PNG 中的任何和所有颜色完全或部分透明,但 ImageMagick 的“PNG8”格式说明符仅支持 GIF 样式的 1 位透明度。
通过不使用说明符,可以使用 ImageMagick 生成索引的 8 位 PNG PNG8:
,而只需使用-colors 256
or -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
有必要“为'背景'颜色保留一个条目”。根据我的测试,我并没有观察到这种情况。using-colors 256
仍将生成 8 位颜色映射 PNG,其量化伪影在质量上与-colors 255
. 尽管如此,为了安全起见,我已经使用-colors 255
了上面的示例。将颜色图大小减少一种颜色本身不会显着影响结果的质量,正如测试pngquant 255
将证明的那样。