ImageMagick:与多次转换的结果组合
ImageMagick : Compose with results of multiple convert
我想创建一个图像给其他人,这是他们自己 convert
操作的结果,而不将中间结果保存到文件系统。
详细解释:
我有两张图片,这两张需要特定的t运行格式:
- avatar.jpg 需要 t运行sformed 为圆形图像 -> rounded-avatar.jpg
- background.jpg 需要应用颜色层 -> colored-background.jpg
然后我想dissolve
rounded-avatar.png in colored-background.jpg,这样我就得到了这样的东西:
+-----------+
| O |
+-----------+
我目前有:
我知道如何按顺序进行这些操作(也许不是最好的方法,但这不是这个问题的主题),我什至制作了一个有效的 bash 脚本:
#!/bin/bash
convert -alpha set -background none -vignette 0x0 rounded-avatar.png
convert -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
我可以用
调用它
$ ./myScript.sh avatar.jpg background.jpg output.jpg
我想要的:
我想避免保存两个临时图像(rounded-avatar.jpg 和 colored-background.jpg) 在文件系统上。
为什么?
- 此过程必须在 Web 平台上自动 运行,我不想使用命名技巧来处理那些临时文件的并发。
- 当前脚本使 IM 在内存中加载图像两次,重用计算图像而不是将它们写入磁盘然后在新进程中加载它们可能更有效。
- 这几天磁盘I/O很紧缺,还是省点吧。
我希望我只是缺少正确的关键字来在文档中找到答案。
我知道这似乎过度优化了,我在这里并没有为 C10k 问题苦苦挣扎,但我只是想正确地做这件事(并理解 IM 语法)。
没有看到您的图片有点难以帮助!我猜它看起来像这样:
convert -gravity center \
\( -alpha set -background none -vignette 0x0 \) \
\( -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 \( .... \) \( ... \) miff:- | composite -dissolve 100 -gravity center - ...
选项 3
另一种选择是对每个输入文件使用单独的 convert
,然后将连接的结果发送到第三个 convert
或 composite
,如下所示:
(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 磁盘space
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..."
马克的回答(我没有仔细看)我相信 "the right thing" 可以为您效劳。
关于...
"I just want to do this right (and understand IM syntax)."
...这两个其他 SO 答案可能会帮助您更好地理解 IM 语法:
ImageMagick Command-Line Option Order {and Categories of Command-Line Parameters}
ImageMagick “color to alpha” (like The GIMP)
我想创建一个图像给其他人,这是他们自己 convert
操作的结果,而不将中间结果保存到文件系统。
详细解释:
我有两张图片,这两张需要特定的t运行格式:
- avatar.jpg 需要 t运行sformed 为圆形图像 -> rounded-avatar.jpg
- background.jpg 需要应用颜色层 -> colored-background.jpg
然后我想dissolve
rounded-avatar.png in colored-background.jpg,这样我就得到了这样的东西:
+-----------+ | O | +-----------+
我目前有:
我知道如何按顺序进行这些操作(也许不是最好的方法,但这不是这个问题的主题),我什至制作了一个有效的 bash 脚本:
#!/bin/bash
convert -alpha set -background none -vignette 0x0 rounded-avatar.png
convert -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
我可以用
调用它$ ./myScript.sh avatar.jpg background.jpg output.jpg
我想要的:
我想避免保存两个临时图像(rounded-avatar.jpg 和 colored-background.jpg) 在文件系统上。
为什么?
- 此过程必须在 Web 平台上自动 运行,我不想使用命名技巧来处理那些临时文件的并发。
- 当前脚本使 IM 在内存中加载图像两次,重用计算图像而不是将它们写入磁盘然后在新进程中加载它们可能更有效。
- 这几天磁盘I/O很紧缺,还是省点吧。
我希望我只是缺少正确的关键字来在文档中找到答案。
我知道这似乎过度优化了,我在这里并没有为 C10k 问题苦苦挣扎,但我只是想正确地做这件事(并理解 IM 语法)。
没有看到您的图片有点难以帮助!我猜它看起来像这样:
convert -gravity center \
\( -alpha set -background none -vignette 0x0 \) \
\( -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 \( .... \) \( ... \) miff:- | composite -dissolve 100 -gravity center - ...
选项 3
另一种选择是对每个输入文件使用单独的 convert
,然后将连接的结果发送到第三个 convert
或 composite
,如下所示:
(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 磁盘space
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..."
马克的回答(我没有仔细看)我相信 "the right thing" 可以为您效劳。
关于...
"I just want to do this right (and understand IM syntax)."
...这两个其他 SO 答案可能会帮助您更好地理解 IM 语法:
ImageMagick Command-Line Option Order {and Categories of Command-Line Parameters}
ImageMagick “color to alpha” (like The GIMP)