여러 개별 작업에 하나의 입력 파일을 사용하는 방법

여러 개별 작업에 하나의 입력 파일을 사용하는 방법

파일을 읽고, 다양한 매개변수를 사용하여 여러 작업을 수행하고, 최종적으로 각 출력을 별도의 파일로 저장하고 싶습니다.

현재 저는 아래 코드 조각에 표시된 대로 이 작업을 수행합니다. 이는 실제로 이미지를 변경하지 않고 각 반복에서 이미지를 읽습니다. 더 큰 이미지(여기서는 400MB)의 경우 속도가 매우 느려집니다. 메모리가 충분히 커서 메모리에 로드하고 메모리에서 한 번만 처리해도 괜찮습니다. 하지만 어떻게 해야 할지 잘 모르겠습니다. ImageMagick이 아닌 셸에는 없습니다.

  1. ImageMagick이를 수행하는 기본 방법이 있습니까 ?
  2. 메모리 매핑 파일 시스템에 파일을 한 번 복사하고 아래 스크립트를 사용하는 것이 가장 쉬운가요?
#!/bin/sh

FILE=foo.tif
i=65;END=80;STEP=1
while [ $i -le $END ]; do
convert $FILE -threshold ${i}\% ${i}.png &
i=$((i+$STEP))
done

만약에쉘 부분POSIX 규격을 유지합니다. 편집: 얻은 코어를 활용하기 위해 백그라운드에서 하위 프로세스를 시작했습니다.

답변1

이것가장 단순한이를 수행하는 방법은 다음과 같습니다.GNU 병렬, 이는 스크립트와 거의 동일한 작업 순서를 생성하지만(프로세스 및 병렬 처리 측면에서) 훨씬 더 간결합니다.

따라서 다음 이미지부터 시작하세요.

여기에 이미지 설명을 입력하세요.

다음을 실행할 수 있습니다.

parallel magick image.jpg -threshold {}% {}.jpg ::: {65..80}

시퀀스에 애니메이션을 적용하면 다음과 같은 결과를 얻게 됩니다.

여기에 이미지 설명을 입력하세요.


이미지를 한 번만 로드하고 작업을 여러 번 수행하려면 실제로 Magick 스크립트가 필요합니다. 따라서 다음과 같이 생성할 수 있습니다.

for ((t=65;t<=80;t++)) ; do
   printf "( -clone 0 -threshold ${t}%% -write ${t}.jpg +delete )\n"
done

그러면 다음과 같은 스크립트가 생성됩니다.

( -clone 0 -threshold 65% -write 65.jpg +delete )
( -clone 0 -threshold 66% -write 66.jpg +delete )
( -clone 0 -threshold 67% -write 67.jpg +delete )
( -clone 0 -threshold 68% -write 68.jpg +delete )
( -clone 0 -threshold 69% -write 69.jpg +delete )
( -clone 0 -threshold 70% -write 70.jpg +delete )
( -clone 0 -threshold 71% -write 71.jpg +delete )
( -clone 0 -threshold 72% -write 72.jpg +delete )
( -clone 0 -threshold 73% -write 73.jpg +delete )
( -clone 0 -threshold 74% -write 74.jpg +delete )
( -clone 0 -threshold 75% -write 75.jpg +delete )
( -clone 0 -threshold 76% -write 76.jpg +delete )
( -clone 0 -threshold 77% -write 77.jpg +delete )
( -clone 0 -threshold 78% -write 78.jpg +delete )
( -clone 0 -threshold 79% -write 79.jpg +delete )
( -clone 0 -threshold 80% -write 80.jpg +delete )

따라서 이라는 파일에 쓰면 script.mgk다음과 같이 실행할 수 있습니다.

magick image.jpg -script script.mgk

스크립트를 여러 번 재사용합니다.


또는 생성할 수 있습니다."즉각적인"(임시 파일을 만들 필요가 없음) 파이프로 연결이미지 마술사이와 같이:

for ((t=65;t<=80;t++)) ; do 
   printf "( -clone 0 -threshold ${t}%% -write ${t}.jpg +delete )\n"
done | magick image.jpg -script -

이는 위와 동일한 결과를 생성하지만 POSIX와 호환됩니다. 단일 인스턴스만 시작하는 것을 볼 수 있기를 바랍니다.이미지 마술사, 입력 이미지를 한 번만 로드한 다음 다시 사용합니다.

관련 정보