使用 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
我有点想 Atop
、Dissolve
、SrcAtop
和 SrcOver
可能是你的朋友,但看看全尺寸的,看看有什么让你的船漂浮.那将是
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
这里发生了什么?
-fx
命令 #1:将 whitecloud.tga 从预乘 alpha 转换为“正常”。 max()
运算符是一种特殊情况,可以避免被零除。
+swap
命令:使bg.tga
第一张图像和修改后的whitecloud.tga
第二张图像。
-composite
这两张常规的 non-premultiplied 图片。
-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 结果是一样的。
我有两张图片。一种是没有 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
我有点想 Atop
、Dissolve
、SrcAtop
和 SrcOver
可能是你的朋友,但看看全尺寸的,看看有什么让你的船漂浮.那将是
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
这里发生了什么?
-fx
命令 #1:将 whitecloud.tga 从预乘 alpha 转换为“正常”。max()
运算符是一种特殊情况,可以避免被零除。+swap
命令:使bg.tga
第一张图像和修改后的whitecloud.tga
第二张图像。-composite
这两张常规的 non-premultiplied 图片。-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 结果是一样的。