저는 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 성명서그것은 테라비트로 작동할 수 있습니다이미지는 괜찮습니다. 따라서 수천 개의 작업을 동시에 할당하는 것은 문제가 되지 않을 것 같습니다.
문제는 쉘이 프로그램에 전달할 수 있는 인수의 수를 제한한다는 것입니다. 다른 수단(예: 스크립트 파일)을 통해 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 -
더 좋은 예가 있습니다여기.