작은 파일은 무시하면서 mogrify를 사용하여 큰 파일의 크기를 조정합니다


10

다음 명령을 실행 중입니다.

mogrify -resize '400x400>' *.png

">"에 주목하십시오. 작은 파일은 무시하지만 크기를 조정하지는 않지만 편집합니다 (수정 날짜 및 파일 크기가 변경됨).

실제로 작은 파일을 그대로 두는 방법이 있습니까? 수천 번의 불필요한 쓰기 작업을 피하고 싶습니다.

답변:


15

필자는 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)가 필요한 조건과 일치하면 다음을 수행하십시오.
    • 두 번째 공백 문자까지 모든 텍스트를 제거하십시오. 너비와 높이를 제거합니다.
    • 줄의 남은 부분, 즉 파일 이름을 인쇄하십시오.
  • 개행을 널 문자로 바꾸십시오.
  • 파일 이름 xargs -0에서 mogrify명령 을 실행하려면 호출 하십시오. xargs공백이나를 포함하는 입력을 처리 할 수 ​​없으므로 일반을 사용할 수 없습니다 \'".

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


그 스크립트를 설명 할 수 있습니까? 구체적으로 "하위"부분. 공백없이 파일 이름을 인쇄하거나 새 줄을 삽입합니다. mogrify :`22 553.png308 400 0134 2.png '@ error / png.c / ReadPNGImage / 2951 파일을 열 수 없습니다. 나는 그 "308 400"이 어디에서 왔는지 전혀 모른다. 파일 이름에 공백이 있음을 언급해야합니다. 감사합니다.
Mike

나는 화를 내고있다 :`340 271 22 553.png308 400 0134 2.png '@ error / png.c / ReadPNGImage / 2951 파일을 열 수 없다. 두 개의 샘플 파일에서 200x200을 사용하여 명령을 실행했습니다. 308x400이 파일 중 하나의 크기 인 것을 알 수 있습니다.
Mike

2
@ 마이크 아, 알았어. 일부 버전의 경우 identify각 레코드 뒤에 자동으로 개행 문자를 입력하고 다른 버전에는 명시 적으로 하나를 추가해야합니다. \n인수 끝에 추가 -format하십시오 (내 편집 참조).
Gilles 'SO- 악마 중지

8

나는 당신이 묘사 한 것과 같은 문제에 직면했습니다. 내 해결책은 다음과 같습니다.

#!/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으로 크기 조정)과 같은 크기의 이미지에서 작동했습니다.

추신 : 400x400매개 변수 에 대한 참고 사항 : mogrify파일 크기가 400x400보다 작거나 같더라도 파일을 처리하지만 크기 가 400x400보다 큰 경우에만 크기조정 됩니다. 그렇기 때문에 파일의 수정 시간과 크기가 변경됩니다 (제 경우에는 mogrify파일을 이전 보다 크게 만들었습니다 ).


5

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

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

의지 출력 1이미지가보다 큰 경우 400x4000는 같거나 작을 경우 400x400...


정상적인 파일 이름 (줄 바꿈 / 공백 / 탭 없음 등)을 사용 identify하여 이미지 이름 앞에 1:또는을 붙여서 출력 할 수 있고 0:, 출력을 시작하는 행을 삭제 하고 나머지 행의 행을 0:제거 1:하여 파일 이름 만 남아 있도록합니다. 줄마다 다음 목록을 파이프하십시오 mogrify ... @-( @구문 은에 추가되었습니다 imagemagick v6.5.2).

identify -format '%[fx:(h>400 && w>400)]:%i\n' ./*.png | \
sed '/^1:/!d;//s///' | mogrify -resize '400x400' -- @-

그렇지 않으면 find크기가 400x400 이상인 파일 만 인쇄 한 다음 결과를 xargs+ 로 파이프 할 수 있습니다 mogrify(각 파일에 대해 쉘을 실행할 때 덜 효율적이지만 모든 종류의 파일 이름으로 작동해야 함).

find . -maxdepth 1 -type f -name '*.png' -exec sh -c \
'identify -format "%[fx:(h>400 && w>400)]\n" "$0" | grep -q 1' {} \; -print0 \
| xargs -0 mogrify -resize '400x400'

당신이 경우 zsh사용자 항목 이 답변을 .


3

식별을 사용하여 이미지의 크기를 찾고 작은 스크립트에서 편집할지 여부를 결정하는 방법은 다음과 같습니다.

identify -format "width=%w heigth=%h" bootchart.png 
width=3853 heigth=10092

간단한 스크립트에서 사용하기 위해 출력 형식을 편집하기가 너무 어렵지 않아야합니다.


제한된 기술과 이미지 크기가 불규칙하다는 사실을 고려할 때 더 간단한 방법이 필요합니다. 차라리 그들을 모기로 처리하고 싶습니다.
Mike

0

그런 PHP 스크립트를 사용하고 ImageMagick을 사용합니다.

<?php
$dir = ".";
$exts = array('jpg', 'jpeg', 'png', 'gif');
$max_size = is_numeric($argv[1]) ? $argv[1] : 3000;
$morgify = "mogrify -verbose -scale \"${max_size}x${max_size}>\" -quality 85";
$identify = "identify -format \"%wx%h\"";

$dh = opendir($dir);
while (($file = readdir($dh)) !== false) {
    $path = "$dir/$file";
    // skip no images
    $dot = strrpos($file, '.');
    $ext = strtolower(substr($file, $dot + 1));
    if (!in_array($ext, $exts)) continue;
    // large size?
    $size = exec("$identify \"$path\"");
    list($width, $height) = explode('x', trim($size));
    if (max($width, $height) > $max_size) {
        // scale!
        print "scale $file ${width}x${height}";
        exec("$morgify \"$path\"");
        print "\n";
    }
}
closedir($dh);
?>

현재 디렉토리의 모든 이미지를 일부 가장자리에서 3000보다 크게 조정합니다.

명령 실행 : php scale.php또는php scale.php 2000


0

@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에서 작동하지 않기 때문에 이것이 필요했습니다.)


0

크기 조정 및 최적화를위한 내 기능

resize_and_optimize_images () {
  resize_images 700 $PWD
  optimize_images 85 $PWD
}

resize_images () {
  max="$1"
  dir="$2"

  echo "Resizing dir $dir, max size - $max"

  shopt -s globstar

  for f in $dir/**/*.jpg $dir/**/*.jpeg $dir/**/*.png ; do
    echo "Checking $f"
    s=`identify -format "%w" $f`

    if [ $s -gt $max ]; then
      echo "Resizing..."
      mogrify -verbose -resize $max $f
    fi
    echo
  done

  echo "Done resizing dir $dir"
}

optimize_images () {
  quality="$1"
  dir="$2"

  echo "Optimizing dir $dir, quality - $quality"

  docker run -it --rm --name optimize_images_foo \
    -v $dir:/usr/src/app \
    -w /usr/src/app ruby:2.4-stretch bash -c \
    "gem install image_optim image_optim_pack && \
    (curl -L \"http://static.jonof.id.au/dl/kenutils/pngout-20150319-linux.tar.gz\" | tar -xz -C /usr/bin --strip-components 2 --wildcards \"*/x86_64/pngout\") && \
    image_optim --verbose --allow-lossy --jpegoptim-allow-lossy true --jpegoptim-max-quality $quality --pngquant-allow-lossy true --pngquant-quality 0..$quality -r ."

  echo "Done optimizing dir $dir"
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.