ImageMagick:使用多次转换的结果进行构图

时间:2015-06-05 18:04:40

标签: imagemagick imagemagick-convert

我想从其他人创建一个图像,这是convert操作自己的结果,而不将中间结果保存到文件系统。

长解释:

我有两张图片,两张需要特定的转换:

  • avatar.jpg 需要转换为圆形图片 - > 四舍五入avatar.jpg
  • background.jpg 需要应用颜色图层 - > 有色background.jpg

然后我想在 colored-background.jpg dissolve 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.jpg colored-background.jpg )。

为什么?

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

我希望我只是错过了在文档中找到答案的正确关键字。

我知道这可能看起来过于优化而且我在这里没有遇到C10k问题,但我只是想这样做(并理解IM语法)。

2 个答案:

答案 0 :(得分:3)

如果没有看到你的照片,有点难以帮助!我想它看起来会像这样:

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命令的compose运算符。

选项2

另一种选择可能是将MIFF格式用于多个图像和这样的管道:

convert \( $1 .... \) \( $2 ... \) miff:- | composite -dissolve 100 -gravity center -   ... 

选项3

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

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

给出了这个:

enter image description here

选项4

如果图像在组合之前需要大量处理,您可以开发选项3,以便并行处理2个输入图像,如下所示

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] ..."

需要33秒,而下面的顺序版需要64秒,顶部使用2MB的磁盘空间

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..."

答案 1 :(得分:1)

Mark的答案(我没有仔细看过它)我相信为你做“正确的事”。

...关于

  

“我只是想这样做(并理解IM语法)。”

......这两个其他的SO答案可以帮助您更好地理解IM语法: