如何向 ImageMagick 传递很多选项?

如何向 ImageMagick 传递很多选项?

我正在使用 ImageMagick 来合成许多图像。

for counter in {1..$limit}
do
  partial=...
  x=...
  y=...
  convert $canvas
    $partial -geometry "+$x+$y" -composite
    $canvas
done

基本上,我一次一张地整理 N 张图像。

现在我的$limit规模很小,脚本在合理的时间内运行。但$limit未来将增加到数千张图像。

我正在考虑构建convert命令以一次包含所有部分。然后只运行convert一次。 ImageMagick 声明它可以与太比特一起工作图像没问题。所以我想一次分配数千个任务应该不成问题。

问题在于 shell 限制了可以传递给程序的参数数量。我可以通过其他方式(例如脚本文件)将所有参数传递给 ImageMagick 吗?这是一个坏主意吗?

答案1

您可以通过向文件传递一个参数来传递 ImageMagick 选项,@filename在这种情况下,ImageMagick 将从传递的文件中读取参数。

文档(参见“文件参考”部分):

某些 ImageMagick 命令行选项可能超出命令行处理器的能力。例如,Windows 将命令行限制为 8192 个字符。例如,如果您的绘制选项包含超出命令行长度限制的多边形点,请将绘制选项放入文件中并使用@(例如@mypoly.txt)引用该文件。

因此,该功能专门设计用于限制命令行长度和参数数量的限制。

答案2

你可以放很多图像魔术师脚本中的命令并告诉它执行它们。我真的不知道你的部分命令是什么,所以我决定绘制 10,000 个随机颜色、大小和位置的圆圈,所以希望你能适应你的具体问题:

这是脚本:

#!/bin/bash

out="script.mgk"

# Define width and height of the image
W=512
H=512

# Create the initial canvas
echo "-size ${W}x${H} xc:" > $out

# Draw 10,000 randomly-sized, randomly-coloured circles on it
for ((i=0;t<=10000;t++)) ; do
   ((cx=$RANDOM % W))         # x-coordinate of circle centre
   ((cy=$RANDOM % H))         # x-coordinate of circle centre
   ((r=$RANDOM % 30))         # radius of circle
   ((cx2=cx+r))               # x-coordinate of point on circumference 
   ((red=$RANDOM %255))       # random red in range 0..255
   ((green=$RANDOM % 255))    # random green in range 0..255
   ((blue=$RANDOM % 255))     # random blue in range 0..255
   echo "-fill rgb(${red},${green},${blue}) -draw \"circle ${cx},${cy} ${cx2},${cy}\""
done >> $out

echo "-write result.png" >> $out

如果运行它,它会创建一个名为的文件script.mgk,如下所示:

-size 512x512 xc:
-fill rgb(44,228,226) -draw "circle 54,274 77,274"
-fill rgb(59,118,147) -draw "circle 242,231 258,231"
-fill rgb(70,91,229) -draw "circle 418,95 436,95"
-fill rgb(26,16,153) -draw "circle 148,128 148,128"
...
... thousands of lines omitted
...
-fill rgb(130,67,183) -draw "circle 15,326 23,326"
-fill rgb(152,79,104) -draw "circle 409,155 438,155"
-write result.png

您现在可以像这样执行:

magick -script script.mgk

在此输入图像描述


注1

您可以在命令行上而不是在脚本中创建 512x512 背景图像,然后运行脚本以继续处理您之前创建/加载的图像:

magick -size 512x512 xc: -script script.mgk

笔记2

您可以消除在磁盘上创建临时脚本并将命令直接通过管道传输到的需要图像魔术师像这样:

for ((i=0;i<10;i++)) ; do
  echo "-draw ..."
done | magick -script -

有一个更好的例子这里

相关内容