使用 ImageMagick 合成预乘图像

Compositing premultiplied images using ImageMagick

我有两张图片。一种是没有 alpha 的背景。另一个是白云。云图像的 alpha 预乘以黑色。当我合成它们时,白云里面有黑色,所以它看起来是灰色的,而不是它应该的白色。我在做:

convert -gravity Center bg.tga whitecloud.tga -composite comp.tga

有没有办法在ImageMagick中合成预乘图像,或者图像是否必须是非预乘的?我可以使用 ImageMagick 使预乘图像成为非预乘图像吗?

更新:
好的,下面是TGA的图片供下载:

http://acatysmoof.com/posting/problems/imagemagick/premultiplication/bg.tga http://acatysmoof.com/posting/problems/imagemagick/premultiplication/whitecloud.tga http://acatysmoof.com/posting/problems/imagemagick/premultiplication/aftereffects.tga http://acatysmoof.com/posting/problems/imagemagick/premultiplication/imagemagick.tga

并且在您的浏览器中以与 jpg 相同的顺序查看:

我尝试了提供的所有模式,但其中 none 产生了与 After Effects 相同的结果。

如果你展示你的图片会更容易,但是尝试在你的命令中的 -composite 之前添加 -compose lighten,就像这样:

convert a.tga b.tga -compose lighten -composite out.tga

基本上这将使 ImageMagick 在每个点选择两个图像中较亮的像素。

如果这不起作用,请尝试其他混合模式

for b in $(identify -list compose); do 
   convert -label "$b" bg.tga whitecloud.tga -compose $b -composite miff:- 
done | montage - -tile 5x out.png

我有点想 AtopDissolveSrcAtopSrcOver 可能是你的朋友,但看看全尺寸的,看看有什么让你的船漂浮.那将是

convert a.tga b.tga -compose Atop -composite out.tga

这是一个 Imagemagick 命令,可以执行您想要的操作:

convert -gravity Center whitecloud.tga -fx "u/max(u.a, 1/255)" bg.tga +swap -composite -fx "u*u.a" comp.tga

这里发生了什么?

  1. -fx 命令 #1:将 whitecloud.tga 从预乘 alpha 转换为“正常”。 max() 运算符是一种特殊情况,可以避免被零除。
  2. +swap命令:使bg.tga第一张图像和修改后的whitecloud.tga第二张图像。
  3. -composite 这两张常规的 non-premultiplied 图片。
  4. -fx 命令 #2:取结果,return 为预乘 alpha 格式。

这给出了与 After Effects 完全相同的结果。

请注意,如我所写,它仅适用于不透明 bg.tga。您需要做一些额外的工作来处理透明背景图像。

如果您想复制 After Effects 结果,那么我相信您想要在 ImageMagick 中执行以下操作——使用云作为蒙版将背景图像与白色图像合成:

convert bg.tga \( -clone 0 -fill white -colorize 100 \) whitecloud.tga -compose over -composite cloud_blue.tga

我发布了一个 JPG 结果,但我的 .tga 结果是一样的。