ImageMagick:使用多个convert的结果进行合成

3
我想要从两个图像中创建一个图像,这两个图像是通过convert操作得到的结果,而无需将中间结果保存到文件系统中。
长说明:
我有两个图像,需要进行特定的变换:
- avatar.jpg需要转换为圆形图像 -> rounded-avatar.jpg - background.jpg需要应用颜色层 -> colored-background.jpg 然后我想在colored-background.jpgdissolve rounded-avatar.png,以便获得类似于以下内容的东西:
  +-----------+
  |     O     |
  +-----------+
我知道如何顺序执行这些操作(也许不是最好的方法,但这不是这个问题的主题),我甚至制作了一个可以工作的bash脚本:
#!/bin/bash

convert $1 -alpha set -background none -vignette 0x0 rounded-avatar.png

convert $2 -auto-orient -thumbnail 600x313^ -gravity center -extent 600x313 -region 100%x100% -fill "#256997" -colorize 72% colored-background.jpg

composite -dissolve 100 -gravity Center rounded-avatar.png colored-background.jpg -alpha Set $3

我可以用以下方式进行调用:

$ ./myScript.sh avatar.jpg background.jpg output.jpg

我的要求:

我想避免在文件系统上保存两个临时图像(rounded-avatar.jpgcolored-background.jpg)。

为什么?

  • 这个程序必须在网络平台上自动运行,我不想用命名技巧处理那些临时文件的并发。
  • 当前脚本使IM两次加载图像,重用计算出的图像可能更有效,而不是将它们写入磁盘,然后在新进程中加载它们。
  • 磁盘I/O在今天很缺乏,让我们节省一些。

我希望我只是错过了在文档中找到答案的关键词。
我知道这可能看起来过于优化,而且我在这里并没有遇到C10k问题,但我只是想做得正确(并理解IM语法)。

请您提供输入图像以及脚本生成的输出结果。 - Kurt Pfeifle
2个回答

4

如果没有看到你的图片,很难帮助你!不过我猜它可能看起来像这样:

convert -gravity center                                    \
        \( $1 -alpha set -background none -vignette 0x0 \) \
        \( $2 -auto-orient -thumbnail 600x313^ -gravity center -extent 600x313 -region 100%x100% -fill "#256997" -colorize 72% \) \
        -compose dissolve -composite result.jpg
        

重点内容如下:
a) 您可以使用括号来进行“旁注处理”,以处理特定的图像
b) 您可以将2个或更多图像加载到图像堆栈中进行处理
c) 您可以在设置了实际的合成命令之后,使用convert命令的-composite运算符来代替compose命令本身。 选项2 另一种选择可能是使用MIFF格式进行多图像处理,并使用如下管道:
convert \( $1 .... \) \( $2 ... \) miff:- | composite -dissolve 100 -gravity center -   ... 

选项三

另一个选择是针对每个输入文件使用单独的 convert,然后将连接后的结果发送到第三个 convertcomposite,如下所示:

(convert -size 100x100 xc:red miff:- ; convert -size 100x100 xc:blue miff:- ) | convert - +append result.jpg

这将得到以下结果:

在此输入图像描述

选项 4

如果需要在合并之前对图片进行大量处理,可以改进选项3,使得两个输入图像并行处理,如下:

mkfifo fifo1 fifo2 2>/dev/null
convert -size 2000x2000 xc:gray +noise gaussian -median 7 jpeg:fifo1 &
convert -size 2000x2000 xc:gray +noise gaussian -median 7 jpeg:fifo2 &
convert fifo1 fifo2 +append result.jpg       # or equally "convert fifo[12] ..."

下面的顺序版本需要64秒,并且在此基础上使用了2MB的磁盘空间,而下面的版本只需33秒:

convert -size 2000x2000 xc:gray +noise gaussian -median 7 1.jpg
convert -size 2000x2000 xc:gray +noise gaussian -median 7 2.jpg
convert 1.jpg 2.jpg +append result.jpg       # or equally "convert [12].jpg..."

这正是我在寻找的!我没有意识到可以在括号中加载不同的图像,因为大多数示例都涉及-clone。 现在看起来很明显:)只需对你的片段进行了两个小改动:调换了反斜杠以关闭括号,并倒置了堆栈中的两个图像以获得所需的结果。谢谢。 - g4vroche

1

谢谢,我会深入研究这个。 - g4vroche

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接