작은 이미지를 무시하면서 큰 이미지의 크기를 조정하려면 mogrify를 사용하세요.

작은 이미지를 무시하면서 큰 이미지의 크기를 조정하려면 mogrify를 사용하세요.

다음 명령을 실행하고 있습니다.

mogrify -resize '400x400>' *.png

~에 따르면문서, "너비x높이>" 지오메트리( >with) "해당 너비 및/또는 높이 매개변수보다 큰 치수의 이미지를 축소합니다."

너비/높이가 400x400보다 작은 이미지는 영향을 받지 않을 것으로 예상했지만 mogrify는 뚜렷한 이유 없이 파일을 다시 작성합니다. 수정 날짜와 파일 크기가 모두 변경됩니다.

실제로 더 작은 이미지만 남겨 두는 방법이 있나요? 수천 개의 불필요한 쓰기를 피하고 싶습니다.

답변1

파일이 체계적으로 다시 작성되었다고 생각하므로 mogrify유일한 희망은 목록을 먼저 필터링하는 것입니다.jippie가 제안한 것. 다음을 수행할 수 있습니다(테스트되지 않음): 크기 표시가 있는 이미지 파일 목록을 인쇄하고 범위 내에서 관련 크기가 있는 이름만 유지한 다음 목록을 처리합니다.

identify -format '%w %h %i\n' ./*.png |
awk '$1 > 400 || $2 > 400 {sub(/^[^ ]* [^ ]* /, ""); print}' |
tr '\n' '\0' |
xargs -0 mogrify -resize '400x400'

스크립트 설명:

  • 각 파일에 대해 너비, 공백, 높이, 공백 및 파일 이름이 포함된 줄을 인쇄합니다. 버전에 따라 identify마지막 \n개행 추가가 필요할 수도 있고(ImageMagick 6.6.0) 중복되지만 무해할 수도 있습니다(GraphicsMagick 1.1.11).
  • ( awk) 각 줄에서 너비( $1)와 높이( $2)가 필수 조건을 충족하는 경우:
    • 두 번째 공백 문자 앞의 모든 텍스트를 제거합니다. 이렇게 하면 너비와 높이가 제거됩니다.
    • 파일 이름인 줄의 나머지 부분을 인쇄합니다.
  • 개행 문자를 null 문자로 바꿉니다.
  • filename 에 대해 명령을 실행하기 위해 호출됩니다 xargs -0. (plain은 공백이나 가 포함된 입력을 처리할 수 없기 때문에 mogrify사용할 수 없습니다 .)xargs\'"

파일 이름에는 개행 문자를 제외한 모든 문자가 포함될 수 있습니다.

답변2

설명하신 것과 동일한 문제가 발생했습니다. 이것이 내 해결책입니다.

#!/bin/bash
files=*.jpg
minimumWidth=640
minimumHeight=640

for f in $files
do
    imageWidth=$(identify -format "%w" "$f")
    imageHeight=$(identify -format "%h" "$f")

    if [ "$imageWidth" -gt "$minimumWidth" ] || [ "$imageHeight" -gt "$minimumHeight" ]; then
        mogrify -resize ''"$minimumWidth"x"$minimumHeight"'' $f
    fi
done

가상 CentOS 6.5 시스템의 여러 JPEG 이미지에서 테스트했습니다. 스크립트는 너비나 높이가 640픽셀보다 큰 이미지만 크기를 조정하고 압축합니다. 따라서 800 x 600(가로, 640 x 480으로 크기 조정) 및 600 x 800(세로, 480 x 640으로 크기 조정) 크기의 이미지에 적합합니다.

PS: 매개변수 설명 400x400: mogrify파일 크기가 400x400 이하인 경우에도 파일은 처리되지만크기 조정크기가 400x400보다 큰 경우에만 해당됩니다. 그렇기 때문에 파일 수정 시간과 크기가 변경됩니다(저의 경우에는 mogrify이러한 파일을 균일하게 만들어서더 큰그들보다).

답변3

imagemagick fx연산자를 사용하면 높이/너비를 기준으로 이미지를 필터링할 수 있습니다.

(( $(identify -format '%[fx:(h>400 && w>400)]' image.png) ))

내부 명령은 1이미지가 보다 크 400x400거나 0같거나 작은지 여부를 출력하므로 400x400표현식은 (( ))각각 및로 평가됩니다. 따라서 파일을 반복하고 이 테스트를 실행하여 배열에 양수를 추가한 다음 이를 매개변수로 배열에 전달할 수 있습니다.truefalsemogrify

args=()
for f in ./*.png
do
(( $(identify -format '%[fx:(h>400 && w>400)]' "$f") )) && args+=("$f"}
done
mogrify -resize '400x400' "$args[@]"

zsh사용자 이시라면 이것도 참고해주세요이 답변.

답변4

@ArionKrause와 @don_crissti의 의견을 혼합한 내 의견은 다음과 같습니다.

#!/bin/bash
# adapted from http://unix.stackexchange.com/a/157594/110635
# and http://unix.stackexchange.com/a/220619/110635
W=1024
H=768
SIZE_TEST="%[fx:(h>$H && w>$W)]"'\n'

for f in $*; do
  if [ $(identify -format "$SIZE_TEST" "$f") = 1 ]; then
    echo "Resize: $f"
    mogrify -resize ''"$W"x"$H"'' "$f"
  else
    echo "Do not resize: $f"
  fi
done

(내가 가장 좋아하는 배치 프로세서인 Phatch가 Ubuntu 16.04에서 작동하지 않기 때문에 이것이 필요합니다.)

관련 정보