Imagemagick替换颜色但保持透明度

Imagemagick替换颜色但保持透明度,imagemagick,Imagemagick,我想用另一种颜色替换PNG徽标中的所有黑色实例。我试过: convert source.png -fill #123456 -opaque black out.png 但是徽标有一些未转换的透明黑色像素。如何更改每个黑色像素,但保持每个像素的透明度?您可以尝试以下方法: convert source.png -channel RGB -fuzz 99% -fill blue -opaque black dest.png 但只有当你的徽标是单色的(就像iOS图标一样,只有一种颜色和透明度)时,

我想用另一种颜色替换PNG徽标中的所有黑色实例。我试过:

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

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

您可以尝试以下方法:

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通道的所有更精细的细节。也许有其他解决方案,但我的surefire way在文件名上使用了“.png32”后缀。这意味着图像必须以8bit-8bit-8bit-8bit-8bit RGBA格式保存
  • 无论如何,如果您尝试调试,为什么图像管道不能与透明度一起工作:

    • 使用gimp打开图像

    • 在窗口的顶部栏上,您应该看到
      …索引颜色…
      ,或者其他内容,如
      …RGB颜色…
      。如果您看到
      索引颜色
      ,可能您的管道已经运行良好,只是它以错误的格式保存

    是的,这是一个双重错误…关于其中一个错误,你可能已经纠正了几十次了…猜猜我是怎么想的,当我在几个小时毫无希望的谷歌搜索和尝试后发现了这个错误


    版本:ImageMagick 6.8.9-9 Q16 x86_64 2017-07-31

    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,则将转换为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

    convert in.png xc:"#ff0000" -channel RGB -clut  out.png
    
    这就可以了。如果in.png有一个alpha通道,那么in.png中的RGB通道将被替换为红色(#ff0000),同时保持alpha通道不变

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

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

    您是否设法找到了问题的解决方案?也许可以尝试在命令开头附近设置
    -channel RGBA
    ?我知道这一问题提出已经有一段时间了,但是有一个示例文件会非常有用pful正确回答这个问题。在Imagemagick 7中,使用magick,而不是magick convert和not convert。使用-colorize将使用该颜色对整个图像进行着色。这似乎不是OP想要的。抱歉,如果我误解了,但原始问题是关于“使用其他颜色的PNG徽标中的所有黑色实例”。其他回复也认为目标是单色图片,用alpha灰度。无论如何,你是对的,colorize命令是单色的。是的,我更正了IM7命令删除convert。谢谢。