Image processing 通过保留半透明像素,使用ImageMagick将32位png转换为8位png
我想用ImageMagick将32位png转换为8位png,但是半透明像素丢失了。如何解决这个问题?我正在使用的命令如下Image processing 通过保留半透明像素,使用ImageMagick将32位png转换为8位png,image-processing,imagemagick,png,transparency,png-8,Image Processing,Imagemagick,Png,Transparency,Png 8,我想用ImageMagick将32位png转换为8位png,但是半透明像素丢失了。如何解决这个问题?我正在使用的命令如下 convert original.png PNG8:output.png 显然,尽管PNG格式实际上允许8位索引彩色PNG中的任何和所有颜色完全或部分透明,但ImageMagick的“PNG8”仅支持GIF样式的1位透明 可以使用ImageMagick生成索引的8位PNG,方法是不使用PNG8:说明符,而只使用-colors 256或-colors 255*来减少图像中的颜
convert original.png PNG8:output.png
显然,尽管PNG格式实际上允许8位索引彩色PNG中的任何和所有颜色完全或部分透明,但ImageMagick的“PNG8”仅支持GIF样式的1位透明 可以使用ImageMagick生成索引的8位PNG,方法是不使用
PNG8:
说明符,而只使用-colors 256
或-colors 255
*来减少图像中的颜色数量。不幸的是,至少根据我使用ImageMagick 6.8.9进行的测试,得到的图像有一些相当奇怪和非常不必要的丑陋的颜色量化伪影
幸运的是,有一个更好的工具用于此特定作业:。使用它,将32位RGBA PNG转换为8位彩色映射PNG,质量损失最小,非常简单:
pngquant 256 < original.png > output.png
pngquant 256output.png
作为一个快速演示,下面是一个简单的测试图片(带有半透明阴影的星星),使用各种方法转换为8位PNG: 从左到右:
pngquant 256output.png
convert input.png-colors 255 PNG8:output.png量化*
*)在下面的评论中,有人建议,
-colors 255
是“为‘背景’颜色保留一个条目”所必需的。根据我的测试,我没有发现实际情况是这样的;使用-colors 256
仍然会产生量化伪影,量化伪影在质量上类似于-colors 255
的输出,但在细节上有所不同。尽管如此,为了安全起见,我在上面的示例中使用了-colors 255
。将colormap大小减少一种颜色本身不应显著影响结果的质量,因为使用pngquant 255
进行测试将产生影响。相关:此问题不是重复问题。这张海报抱怨从24位转换到8位后半透明像素丢失。他已经有了从24位转换到8位的(正确的)语法,他想知道为什么它会这样(这有一个很好的答案)。谢谢你的回答。我试过那个命令,但它不能保留半透明像素。哦,好吧,值得一试((顺便说一句,你两个都试过了,对吗?我链接到的线程中有人建议说,破坏alpha透明度的是PNG8:
前缀。)是的,我尝试了两种方法。第二种方法使完全透明的像素变黑。我开始使用pngquant命令行工具而不是ImageMagick。它正确地保留了alpha通道。尝试-colors 255
而不是-colors 256
。ImageMagick需要为“背景”保留一个条目颜色。没有必要保留背景色,但ImageMagick默认保留背景色。您可以使用“-define png:exclude chunk=bKGD”来避免这种情况。使用“-colors 255”而不指定PNG8时,量化效果可能会更好:(PNG8使用快速且脏的量化方法,只需将较低的位归零).但事实上,我更喜欢使用pngquant而不是ImageMagick生成调色板。