我想用另一种颜色替换 PNG 徽标中的所有黑色实例。我试过了:
convert source.png -fill #123456 -opaque black out.png
但是标志有一些透明的黑色像素没有被转换。如何更改每个黑色像素,但保持每个像素的透明度?
我想用另一种颜色替换 PNG 徽标中的所有黑色实例。我试过了:
convert source.png -fill #123456 -opaque black out.png
但是标志有一些透明的黑色像素没有被转换。如何更改每个黑色像素,但保持每个像素的透明度?
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 是我们想要的。
你可以尝试这样的事情:
convert source.png -channel RGB -fuzz 99% -fill blue -opaque black dest.png
但只有当您的徽标是单色的(如 iOS 图标 - 只有一种颜色和透明度)时,它才会起作用。
我意识到这是一个老问题,但我花了难以置信的时间,却没有找到答案。但最后我想通了。
注意:我的图像是全黑的,使其成为带有 alpha 的灰度。(即我所有的像素看起来像: R=0, G=0, B=0, A=X 。您的像素可以是其他任何东西,我认为您将能够调整我的答案。
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 通道的所有更精细的细节。也许还有其他解决方案,但我的可靠方法是在文件名上使用“.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
在 ImageMagick 中,如果您有透明度,请尝试
convert source.png -alpha off -fuzz XX% -fill "#123456" -opaque black -alpha on out.png
其中 XX 是接近黑色的某个百分比,您可能希望包括在内。如果您只想更改纯黑色,则可以设置 XX=0。
请注意,上面的代码会将所有黑色像素更改为新颜色,包括透明度下的任何黑色。
如果您只想将完全不透明的黑色更改为新颜色,而不是透明度下的任何黑色,请在颜色中包含 alpha 值。所以试试
convert source.png -fuzz XX% -fill "#123456FF" -opaque "graya(0)" -alpha on out.png
如果使用 IM 7,则将 convert 更改为 magick。
根据我的经验,以前的回复对我的看法有一个缺点:如果您的绘图有软边缘(由于 alpha 通道),您会丢失它们并且您的结果只有锐利的边缘。使用此命令可以保留软边缘:
magick in_file.png -fill "#6696DC" -colorize 100% out_file.png32
正如 Zoltan 所提到的,我需要使用 png32 后缀来强制执行 png 32 位编码。然后,只需要在文件生成后重命名文件(删除 32),就可以获得具有正确扩展名的工作文件。
注意:我使用的是 ImageMagick 7.0.8-24 Q16 x64。