私はImageMagickを使って多くの画像を合成しています。
for counter in {1..$limit}
do
partial=...
x=...
y=...
convert $canvas
$partial -geometry "+$x+$y" -composite
$canvas
done
デフォルトでは、N個の画像を一度に1つずつ整列しています。
これで小規模なので、$limit
スクリプトは合理的な時間内に実行されます。しかし、$limit
今後は画像数が数千個に増えるでしょう。
convert
すべての部分を一度に含むコマンドを書くつもりです。それでは一度だけ実行してみてくださいconvert
。 ImageMagickステートメントそれはテラビットとして働くことができます画像は大丈夫です。したがって、何千ものタスクを同時に割り当てることは問題にはならないようです。
問題は、シェルがプログラムに渡すことができる引数の数を制限することです。他の手段(スクリプトファイルなど)を介して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 -
より良い例がありますここ。