【问题标题】:ImageMagick : Compose with results of multiple convertImageMagick : 组合多个转换的结果
【发布时间】:2015-06-05 18:04:39
【问题描述】:

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

详细解释:

我有两张图片,这两张需要具体的转换:

  • avatar.jpg 需要转成圆形图片 -> rounded-avatar.jpg
  • background.jpg 需要应用颜色层 -> colored-background.jpg

然后我想dissolverounded-avatar.png in colored-background.jpg,这样我就得到了这样的东西:

+-----------+ | ○ | +-----------+

我目前所拥有的:

我知道如何按顺序进行这些操作(也许不是最好的方法,但这不是这个问题的主题),我什至制作了一个有效的 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 语法)。

【问题讨论】:

  • 能否请您提供您的输入图像以及您的脚本产生的输出?

标签: imagemagick imagemagick-convert


【解决方案1】:

如果没有看到您的图像,有点难以提供帮助!我想它看起来像这样:

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) 您可以使用括号对一个特定图像进行'aside-processing'

b) 您可以将 2 个或更多图像加载到一种图像堆栈上进行处理

c) 在设置-compose 类型代替实际的compose 命令本身之后,您可以使用convert 命令的-composite 运算符。

选项 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

这给出了这个:

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

【讨论】:

  • 这正是我想要的!我没有意识到可以在括号内加载不同的图像,因为大多数示例都涉及-clone。现在看起来很明显:)。只需对您的 sn-p 进行 2 处小更改:错误放置的反斜杠用于右括号并反转堆栈中的两个图像以获得所需的结果。谢谢。
【解决方案2】:

马克的回答(我没有仔细研究过)我相信会为你做“正确的事”。

关于...

“我只想做正确的事(并且理解 IM 语法)。”

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

【讨论】:

  • 谢谢,我会深入研究的。
猜你喜欢
  • 1970-01-01
  • 2014-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-08
  • 1970-01-01
  • 2020-04-14
相关资源
最近更新 更多