我想使用 ImageMagick 将 32 位 png 转换为 8 位 png,但是半透明像素丢失了。如何解决这个问题呢?我正在使用的命令如下
convert original.png PNG8:output.png
最佳答案
显然,即使 PNG 格式实际上允许 8 位索引颜色 PNG 中的任何和所有颜色完全或部分透明,ImageMagick 的“PNG8”format specifier仅支持 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
作为快速演示,这里有一个使用各种方法转换为 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 .
关于image-processing - 使用 ImageMagick 通过保留半透明像素将 32 位 png 转换为 8 位 png,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14031965/