使用ImageMagick合成预乘图像

时间:2015-03-07 05:24:47

标签: imagemagick premultiplied-alpha

我有两张照片。一个是没有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

并按照与jpgs相同的顺序在浏览器中查看:

bg.jpg whitecloud.jpg aftereffects.jpg imagemagick.jpg

我尝试了所有提供的模式,但没有一个创建与After Effects相同的结果。

3 个答案:

答案 0 :(得分:2)

如果您展示图片会更容易,但请尝试在-compose lighten之前添加-composite,如下所示:

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

enter image description here

我有点想AtopDissolveSrcAtopSrcOver可能是你的朋友,但看看全尺寸,看看你的船浮起来了。那将是

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

答案 1 :(得分:0)

这是一个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转换为“ normal”。 max()运算符是避免被零除的特例。
  2. +swap命令:将bg.tga作为第一张图片,将修订后的whitecloud.tga作为第二张图片。
  3. -composite这两个常规的非预乘图像。
  4. -fx命令#2:获取结果,然后返回预乘的alpha格式。

这提供与After Effects完全相同的结果。

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

答案 2 :(得分:0)

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

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

enter image description here

我已经发布了JPG结果,但是我的.tga结果是相同的。