[英]How to pass Imagemagick montage output and image properties to the convert command without using any temporary files?
我有一组图像,我可以对它们使用 Imagemagick montage
命令来生成具有透明背景的蒙太奇图像文件(我们称之为fgimg
)。 现在我有另一个现有图像(我们称之为bgimg
),我想使用(在使用convert
命令进行一些特殊处理后)作为fgimg
的背景,这可以在同一个convert
命令中实现。 在这一点上,避免将临时fgimg
写入磁盘似乎是微不足道的,只需将montage
的标准 output 管道传输到convert
的标准输入。
我的问题是我对bgimg
应用的特殊处理需要一些关于fgimg
图像属性的知识(例如,将bgimg
调整为与fgimg
相同的大小),我事先并不知道。 如何在convert
命令中检索和使用这些信息?
注意:我在 Linux 上使用 Imagemagick 版本 6.9.7-4。
我将在下面包含一些命令以进一步详细说明问题。
以下命令从一组输入图像中生成蒙太奇图像fgimg
。 output 采用“特殊” miff
格式(这似乎最适合稍后处理的临时 output),并且具有透明背景,以便以后可以应用实际背景。 这里的其他选项大部分都不重要,但重点是不能提前确定output的大小(尺寸)。
montage input_*.jpg -tile 5x -border 2 -geometry '200x200>+20+20' \
-gravity center -set label '%f\n%G' -background none -fill white \
-title 'Sample Title' miff:fgimg
接下来,我有另一个输入图像bgimg.jpg
。 我想在将其用作fgimg
的背景之前对其进行一些处理。 一般来说,处理可能非常复杂,但在这个例子中,我想:
bgimg.jpg
的大小以适应fgimg
的尺寸而不进行任何裁剪;fgimg
大小相同,背景为黑色;fgimg
结合以生成最终的 output。 请注意,我在两个地方需要fgimg
的大小。 我可以先将其提取到 shell 变量中:
size=$(identify -format '%G' miff:fgimg)
然后我可以在一个convert
命令中完成上述所有步骤(注意$size
被使用了两次):
convert "bgimg.jpg[$size]" -gravity center \
\( +clone -fill white -colorize 100% -bordercolor black \
-shave 20 -border 20 -blur 0x20 \) -compose multiply -composite \
-background black -compose copy -extent $size \
miff:fgimg -compose over -composite final_out.jpg
现在问题来了:我想避免将临时文件fgimg
写入磁盘。
我可以将miff:fgimg
替换为miff:-
在montage
和convert
命令中,然后只是 pipe 一个到另一个: montage... | convert...
montage... | convert...
但是我该如何处理$size
?
我尝试使用文件描述符( miff:fd:3
),但这似乎不起作用, 对此问题的评论证实了这一点。
有没有办法在不创建临时文件的情况下做到这一点(在 Imagemagick v6 中)?
此示例命令在 bash shell 上使用 ImageMagick v6。 它不是使用“蒙太奇”,而是首先使用“convert”创建一个“logo:”,这是 IM 的内置示例图像之一,然后将其作为 MIFF 输出并输入随后的“convert”命令。 您可以像“蒙太奇”的 pipe 和 output 一样轻松。 它使用另一个 IM 内置图像“rose:”作为您的“bgimg.jpg”...
convert logo: miff:- | convert - rose: \
+distort SRT "%[fx:t?min(u.w/v.w,u.h/v.h):1] 0" \
-shave 1 +repage -gravity center -bordercolor black \
\( -clone 1 -fill white -colorize 100 -shave 6 -border 6 \
-blur 0x6 -clone 1 -compose multiply -composite \) -delete 1 \
\( -clone 0 -alpha off -fill black -colorize 100 \
-clone 1 -compose over -composite \) -delete 1 \
+swap -composite final_out.jpg
读取管道图像“-”和背景图像“玫瑰:”。
然后它使用带有 FX 表达式的“+distort”将“rose:”缩放到仍然适合原始管道输入图像的最大尺寸。 该操作在周围添加了一个像素,因此我们使用“-shave 1”来消除它。
接下来在括号内,它克隆重新缩放的背景图像,制作边缘模糊蒙版,并将它们合成以在背景图像上制作淡入黑边。 在括号之后,它会删除非边缘背景图像。
在下一个括号中,它克隆输入图像,使其变为黑色,克隆修改后的背景图像,并将其合成到黑色图像的中心。 同样,未扩展的背景图像在带有“-delete 1”的括号之后被丢弃。
最后,修改后的背景和输入图像用“+swap”以正确的顺序排列,并合成最终的 output。 在没有最后一个“-composite”的情况下运行此命令,以查看该命令前面部分产生的两个图像。
主输入图像和背景图像都可以是任意大小、任意尺寸和任意纵横比。 这适用于我在 v6.8.9 上的 bash shell。 它应该适用于任何更新的 ImageMagick。 它应该在 Windows 上工作,方法是删除所有转义括号的反斜杠并将续行反斜杠“\”更改为插入符号“^”。
编辑添加:
您可以使用该 FX 表达式来查找缩放量,将其保存为变量,然后隔离括号内的背景图像并使用该变量在此处进行缩放和剃须。 这样它只会影响背景图像。 这可能存在舍入误差,但确定确切最终 output 尺寸的主图像将不受影响。 请注意此命令前几行的区别...
convert logo: miff:- | convert - rose: \
-set option:v1 "%[fx:min(u.w/v.w,u.h/v.h)]" \
\( -clone 1 +distort SRT "%[v1] 0" -shave 1 \) -delete 1 \
+repage -gravity center -bordercolor black \
\( -clone 1 -fill white -colorize 100 -shave 6 -border 6 \
-blur 0x6 -clone 1 -compose multiply -composite \) -delete 1 \
\( -clone 0 -alpha off -fill black -colorize 100 \
-clone 1 -compose over -composite \) -delete 1 \
+swap final_out.jpg
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.