如何在较小的水印/帧图像上叠加更大的水印/帧图像?

时间:2017-04-28 07:22:48

标签: imagemagick

我有一个叠加图像,就像水印/徽标一样,需要叠加在源图像的顶部(同时保留alpha通道等)

当叠加与源图像相同或更小的尺寸时 - 事情很简单:

composite.exe -alpha on -gravity center logo.png in_image.jpg out_image.jpg

但是,当logo.png大于in_image.jpg时 - 上面的调用会截断徽标,而out_image.jpg的尺寸与in_image.jpg相同

我希望得到的图像是logo.png或in_image.jpg中最大的图像,所以我可以做照片周围的艺术框架。

下面的图片展示了我希望能够得到的最终结果: Desired Result

注意,这里,带有头骨的png比kiddo的图像具有更大的暗淡。需要保留alpha通道。

编辑:通过示例更清晰

这是另一个desired result 这里,png文件两侧是不透明的,中间有一个清晰的窗口,半透明的半泡。 JPG文件只是来自相机的常规JPG。

很想添加导致它的原始文件和徽标文件,但缺少添加2个以上链接(或添加图像)的声誉

2 个答案:

答案 0 :(得分:0)

尝试使用转换而不是复合。它比复合材料更灵活。

convert logo.png in_image.jpg -gravity center -compose over -composite out_image.jpg

但如果你坚持使用复合材料,那么

composite in_image.jpg logo.png -gravity center -compose src_over out_image.jpg

请注意保留Alpha通道的确切含义,因为jpg不支持透明度。也许您可以发布一对输入和您想要的输出,如果我发布的内容不符合您的要求。

答案 1 :(得分:0)

更新了答案

如果你有 ImageMagick 的v7,你可以使用-fx在一行中为你做数学计算,以确定两个图像中较大的图像的尺寸: / p>

magick background.jpg overlay.png -background none -gravity center -extent '%[fx:u.w>v.w?u.w:v.w]x%[fx:u.h>v.h?u.h:v.h]' -composite result.png

基本上说... "按如下方式扩展两个图像。如果第一个图像(u.w)的宽度大于第二个图像(v.w)的宽度,则使用第一个图像的宽度,否则使用第二个图像的宽度。高度相同。"

原始答案

我相信你想要这个。获得更宽的背景和叠加的宽度。获得高度背景和叠加的高度。使用透明像素将背景和叠加层扩展到新尺寸。覆盖。

所以,如果我们从这开始作为背景(300x50):

enter image description here

这是叠加层(122x242) - 这是一个高透明的蓝色矩形,然后用黑色边框显示它的范围:

enter image description here

你会运行它,这实际上很简单,但它充满了注释和调试输出,所以你可以看到发生了什么:

#!/bin/bash

# Get background width and height
read wb hb < <(convert background.jpg -format "%w %h" info: )
echo "Background: " $wb $hb

# Get overlay width and height
read wo ho < <(convert overlay.png -format "%w %h" info: )
echo "Overlay: " $wo $ho

# Get wider of the two
w=$wb
[ $wo -gt $w ] && w=$wo
# Get taller of the two
h=$hb
[ $ho -gt $h ] && h=$ho
echo "New dimensions: " $w $h

convert background.jpg overlay.png -background none -gravity center -extent ${w}x${h} -composite result.png

enter image description here

以下是它的运行方式:

Background:  300 50
Overlay:  122 242
New dimensions:  300 242

据推测,当你完成叠加后,你会添加-trim作为命令行的最后一部分,以删除任何已添加的无关内容。