使用 GraphicsMagick 或 ImageMagick,如何用填充颜色代替透明度?

使用 GraphicsMagick 或 ImageMagick,如何用填充颜色代替透明度?

使用 GraphicsMagick,可以很容易地用透明度替换一种颜色......

gm convert -transparent magenta src.png dst.png

不幸的是,我找不到一种简单的方法来做完全相反的事情。如果我有一个具有 alpha 通道透明度的图像文件,我该如何在恒定颜色背景上合成它,然后丢弃现在多余的 alpha 通道?背景颜色应该影响部分透明和完全透明的像素。

我发现了 +matte 选项,但它实际上会丢弃 alpha 层 - 通常会在透明度处留下垃圾颜色像素,而不是使用 -background 选项来指定要使用的背景颜色。

到目前为止,我唯一能做到这点的方法是使用多个调用 - 一个用于生成纯色矩形图像文件,另一个用于将原始图像与纯色图像合成,第三个用于丢弃 alpha 通道。这似乎很疯狂 - 肯定应该通过一个相当简单的调用来实现吧?

我目前使用 GraphicsMagick,但没有承诺 —— 如果它使事情变得更容易,我将切换到 ImageMagick。

编辑

当我说“背景颜色应该影响部分透明和完全透明的像素”时,我的意思是结果应该是我通常期望的结果,即透明精灵被传送到纯色背景上。部分透明的像素应该混合。

这意味着,如果我随后反转该过程 - 将背景颜色键转换为透明度 - 我会看到原始图像周围出现光晕,其中背景颜色与像素混合,因此颜色键无法精确匹配,因此不会转换回透明度。出于这个原因,这不是大多数人想要的。但这是我想要的,因为我不会将背景转换回透明度 - 如果需要,我仍然会保留具有原始透明度的原始图像。

答案1

使用 GraphicsMagick,应该能够替换您流程中的前两个步骤(对于 ImageMagick,它将代替)。我不确定第三步,但听起来您只是在前两个步骤中的图像上运行,因此最终的调用看起来像这样:-background color -extent 0x0-mosaic-extent+matte

gm convert -background color -extent 0x0 +matte src.png dst.png

或者对于 ImageMagick,

convert src.png -background color -mosaic +matte dst.png

答案2

您要搜索的内容几乎符合 -opaque 的描述,但略有不同。假设背景颜色恒定,则以下命令可能适合您(我只能在 ImageMagick 上进行测试)。

gm convert -channel matte -threshold 0% -channel RGB -fill [your background color] -opaque transparent -channel matte -threshold 100% src.png dst.png

-channel matte -threshold 0%将具有任何透明度的像素设置为完全透明,用给定的填充颜色替换完全透明的像素,并删除所有像素的透明度。-channel RGB -fill [your background color] -opaque transparent-channel matte -threshold 100%

答案3

在我看来,您只是想将透明(或部分)图像合成到背景上,并进行 alpha 混合。这一页建议代码:

composite smile.gif rose: rose-over.png

是基础。在给出的例子中,它将一个图像与另一个图像混合在一起。

现在,如果您想将透明图像与纯色背景混合,您可以使用第二个图像作为背景(如果是静态的),或者在运行时创建一个基本单色/填充相同尺寸的图像。如何执行此操作取决于您使用的是 shell 还是某种脚本(Perl、PHP 等)。

相关内容