ImageMagick:使用多次转换的结果进行合成

ImageMagick:使用多次转换的结果进行合成,imagemagick,imagemagick-convert,Imagemagick,Imagemagick Convert,我想创建一个从到他人的图像,这是convert操作本身的结果,而无需将中间结果保存到文件系统 详细解释: 我有两个图像,这两个需要特定的转换: 需要将avatar.jpg转换为圆形图像->圆形-avatar.jpg background.jpg需要应用颜色层->colored-background.jpg 然后我想在colored-background.jpg中分解rounded-avatar.png,这样我就可以得到如下效果: +-----------+ | O |

我想创建一个从到他人的图像,这是
convert
操作本身的结果,而无需将中间结果保存到文件系统

详细解释:

我有两个图像,这两个需要特定的转换:

  • 需要将avatar.jpg转换为圆形图像->圆形-avatar.jpg
  • background.jpg需要应用颜色层->colored-background.jpg
然后我想在colored-background.jpg中分解rounded-avatar.png,这样我就可以得到如下效果:

+-----------+ | O | +-----------+
convert \( $1 .... \) \( $2 ... \) miff:- | composite -dissolve 100 -gravity center -   ... 
(convert -size 100x100 xc:red miff:- ; convert -size 100x100 xc:blue miff:- ) | convert - +append result.jpg
我可以称之为

$。/myScript.sh avatar.jpg background.jpg output.jpg
我想要什么:

我希望避免在文件系统中保存两个临时图像(rounded-avatar.jpg和colored background.jpg)

为什么?

  • 这个过程必须在web平台上自动运行,我不想用命名技巧处理那些临时文件的并发性
  • 当前脚本使IM在内存中加载图像两次,重用计算出的图像可能比将其写入磁盘然后在新进程中加载更有效
  • 现在磁盘I/O不足,让我们保存一些

我希望我只是缺少在文档中找到答案的正确关键字


我知道这似乎过于优化了,我在这里并没有遇到C10k问题,但我只想做得对(并理解IM语法)。

如果不看你的图片,很难帮助你!我想它看起来会像这样:

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) 设置
-compose
类型以代替实际的
compose
命令本身后,可以使用
convert
命令的
-composite
操作符

选项2

另一种选择可能是对多个图像和以下管道使用
MIFF
格式:

+-----------+ | O | +-----------+
convert \( $1 .... \) \( $2 ... \) miff:- | composite -dissolve 100 -gravity center -   ... 
(convert -size 100x100 xc:red miff:- ; convert -size 100x100 xc:blue miff:- ) | convert - +append result.jpg
选项3

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

+-----------+ | O | +-----------+
convert \( $1 .... \) \( $2 ... \) miff:- | composite -dissolve 100 -gravity center -   ... 
(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..."

如果不看你的图片,很难帮助你!我想它看起来会像这样:

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) 设置
-compose
类型以代替实际的
compose
命令本身后,可以使用
convert
命令的
-composite
操作符

选项2

另一种选择可能是对多个图像和以下管道使用
MIFF
格式:

+-----------+ | O | +-----------+
convert \( $1 .... \) \( $2 ... \) miff:- | composite -dissolve 100 -gravity center -   ... 
(convert -size 100x100 xc:red miff:- ; convert -size 100x100 xc:blue miff:- ) | convert - +append result.jpg
选项3

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

+-----------+ | O | +-----------+
convert \( $1 .... \) \( $2 ... \) miff:- | composite -dissolve 100 -gravity center -   ... 
(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..."
马克的回答(我没有仔细看)我相信会为你做“正确的事情”

关于

“我只想正确地执行此操作(并理解IM语法)。”

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

    • 马克的回答(我还没有仔细看它)我相信会为你做“正确的事情”

      关于

      “我只想正确地执行此操作(并理解IM语法)。”

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


      能否提供您的输入图像以及脚本生成的输出?能否提供您的输入图像以及脚本生成的输出?这正是我要找的!我没有意识到可以在括号内加载不同的图像,因为大多数示例都涉及
      -clone
      。现在看起来很明显:)。只需对代码片段进行两个小更改:将反斜杠放错位置以关闭括号,并反转堆栈中的两个图像以获得所需的结果。谢谢。那正是我想要的!我没有意识到可以在括号内加载不同的图像,因为大多数示例都涉及
      -clone
      。现在看起来很明显:)。只需对代码片段进行两个小更改:将反斜杠放错位置以关闭括号,并反转堆栈中的两个图像以获得所需的结果。谢谢,谢谢,我会深入研究的,谢谢,我会深入研究的。