繁体   English   中英

如何在不使用任何临时文件的情况下将 Imagemagick montage output 和图像属性传递给转换命令?

[英]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的背景之前对其进行一些处理。 一般来说,处理可能非常复杂,但在这个例子中,我想:

  1. 调整bgimg.jpg的大小以适应fgimg的尺寸而不进行任何裁剪;
  2. 在边缘周围应用淡入黑效果;
  3. 使其与fgimg大小相同,背景为黑色;
  4. 将其与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:-montageconvert命令中,然后只是 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM