0

我有一组图像,我可以montage在它们上使用 Imagemagick 命令来生成具有透明背景的蒙太奇图像文件(我们称之为fgimg)。现在我有另一个现有图像(我们称之为bgimg),我想使用(在使用convert命令进行一些特殊处理后)作为 的背景fgimg,这可以在同一convert命令中实现。fgimg在这一点上,避免将临时文件写入磁盘似乎是微不足道的,只需通过管道将 的标准输出montage传输到convert.

我的问题是我正在应用的特殊处理bgimg将需要一些我事先不知道的图像属性知识fgimg(例如,调整大小bgimg以具有与 相同的大小)。如何在命令中检索和使用这些信息?fgimgconvert

注意:我在 Linux 上使用 Imagemagick 版本 6.9.7-4。


我将在下面包含一些命令以进一步详细说明问题。

以下命令fgimg从一组输入图像生成蒙太奇图像。输出采用“特殊”miff格式(这似乎最适合稍后处理的临时输出),并且具有透明背景,以便以后可以应用实际背景。这里的其他选项大部分都不重要,但重点是无法提前确定输出大小(维度)。

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生成最终输出相结合。

请注意,我需要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磁盘。

我可以在and命令中替换miff:fgimg为,然后将一个管道传递给另一个:. 但是我该如何处理?miff:-montageconvertmontage ... | convert ...$size

我尝试使用文件描述符 ( miff:fd:3) 但这似乎不起作用,对此问题的评论证实了这一点。

有没有办法在不创建临时文件的情况下做到这一点(在 Imagemagick v6 中)?

4

1 回答 1

2

此示例命令在 bash shell 上使用 ImageMagick v6。它不是使用“蒙太奇”,而是首先使用“convert”创建一个“logo:”,这是 IM 的内置示例图像之一,然后将其作为 MIFF 输出并输入随后的“convert”命令。您可以轻松地通过管道输出“蒙太奇”的输出。它使用另一个 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”按正确的顺序排列并合成最终输出。在没有最后一个“-composite”的情况下运行此命令,以查看该命令前面部分产生的两个图像。

主输入图像和背景图像都可以是任意大小、任意尺寸和任意纵横比。这适用于我在 bash shell 上的 v6.8.9 上。它应该适用于任何更新的 ImageMagick。它应该通过删除所有转义括号的反斜杠并将续行反斜杠“\”更改为插入符号“^”在 Windows 上工作。

编辑添加:

您可以使用该 FX 表达式来查找缩放量,将其保存为变量,然后隔离括号内的背景图像并使用该变量在此处进行缩放和剃须。这样它只会影响背景图像。这可能存在舍入误差,但确定确切最终输出尺寸的主图像将不受影响。请注意此命令前几行的区别...

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
于 2021-02-01T20:25:33.850 回答