Imagemagick替换颜色但保持透明度

Imagemagick replace color but keep transparency

我想用其他颜色替换PNG徽标中所有黑色的实例。我试过了:

1
convert source.png -fill #123456 -opaque black out.png

但是徽标具有一些未转换的透明黑色像素。如何更改每个黑色像素,但保持每个像素的透明度?


1
convert in.png xc:"#ff0000" -channel RGB -clut  out.png

这将完成工作。如果in.png具有Alpha通道,则in.png中的RGB通道将被替换为红色(#ff0000),同时保持Alpha通道不变。

这里发生了什么?
in.png是第一个输入图像。 xc:"#ff0000"是第二个输入图像(xc:特殊文件由ImageMagick解释为全部填充有给定颜色的图像)。 -clut选项("颜色查找表")将第二张图像解释为查找表,并将其应用于第一张图像中的值。由于第二个图像是单色的,因此在此示例中,第一个图像中的每种颜色都映射为红色。最后一个文件名(out.png)被解释为输出文件。

-clut为什么不影响alpha通道?
好了,您可以使用-channel选项设置受影响的频道。它必须在-clut之前。 RGB是我们想要的。


您可以尝试以下操作:

1
convert source.png -channel RGB -fuzz 99% -fill blue -opaque black dest.png

但是它仅在您的徽标是单色(如iOS图标-仅一种颜色和透明度)时才有效。


在ImageMagick中,如果您有透明度,请尝试

1
convert source.png -alpha off -fuzz XX% -fill"#123456" -opaque black -alpha on out.png

其中XX是您可能要包含的接近黑色的百分比。如果只想更改纯黑色,则可以设置XX = 0。

请注意,上面的代码会将所有黑色像素更改为新颜色,包括透明度下的任何黑色。

如果您只想将完全不透明的黑色更改为新颜色,而在透明度下不更改任何黑色,则可以在颜色中包含alpha值。所以尝试

1
convert source.png  -fuzz XX% -fill"#123456FF" -opaque"graya(0)" -alpha on out.png

如果使用IM 7,则将转换为magick。


我意识到这是一个古老的问题,但是我花了不可思议的长时间,没有找到答案。但最后我明白了。

注意:我的图像是全黑的,并带有alpha灰度。 (即我的所有像素都看起来像:R = 0,G = 0,B = 0,A = X。您的像素可以是其他任何像素,我想您将能够调整我的答案。

1
convert in_file.png -alpha off -fuzz 100% -fill blue -opaque '#000000' -alpha on -format png32 out_file.png32

这是怎么回事?

  • alpha off这意味着,如果图像没有Alpha通道,则
    没有任何变化,如果您的图像确实具有Alpha通道,则随后
    操作会假装它不存在。
  • 不幸的是,当使用.png后缀保存图像时,imagemagick将决定使用索引最有效的格式。我不知道为什么,但是它认为我的图像是1位可表示的:完全透明/完全不透明的颜色,并且我放弃了alpha通道的所有细微细节。也许还有其他解决方案,但是我的surefire方法是在文件名上使用" .png32"后缀。这意味着,图像必须以8bit-8bit-8bit-8bit RGBA格式保存。
  • 无论如何,如果您尝试调试,为什么图像管道不能与透明一起使用:

    • 使用gimp打开图像

    • 在窗口顶部的

      您应该看到...Indexed color...或其他内容,例如...RGB color...。如果您看到Indexed color,则可能是您的管道已经正常运行,只是将其保存为错误的格式!

    是的,这是一个双重错误。关于其中一个错误,您可能已经正确无误了数十次。 ..

    版本:ImageMagick 6.8.9-9 Q16 x86_64 2017-07-31 http://www.imagemagick.org


    根据我的经验,以前的答复对我来说有一个缺点:如果您的图形具有柔和的边缘(由于alpha通道),则会丢失它们,而结果只有锐利的边缘。
    使用此命令可以保留软边缘:

    1
    magick in_file.png -fill"#6696DC" -colorize 100% out_file.png32

    正如Zoltan所提到的,我需要使用png32后缀来实施png 32位编码。然后,只需在文件生成后重命名(删除32个文件),即可得到具有正确扩展名的工作文件。

    注意:我正在使用ImageMagick 7.0.8-24 Q16 x64。