Image processing 通过保留半透明像素,使用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*来减少图像中的颜

我想用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
*来减少图像中的颜色数量。不幸的是,至少根据我使用ImageMagick 6.8.9进行的测试,得到的图像有一些相当奇怪和非常不必要的丑陋的颜色量化伪影

幸运的是,有一个更好的工具用于此特定作业:。使用它,将32位RGBA PNG转换为8位彩色映射PNG,质量损失最小,非常简单:

pngquant 256 < original.png > output.png
pngquant 256output.png

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

从左到右:

  • 原始32位RGBA PNG
  • 使用
    pngquant 256output.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
    仍然会产生量化伪影,量化伪影在质量上类似于
    -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生成调色板。