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通道,则随后
操作会假装它不存在。
无论如何,如果您尝试调试,为什么图像管道不能与透明一起使用:
-
使用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。