답변:
필자는 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
공백이나를 포함하는 입력을 처리 할 수 없으므로 일반을 사용할 수 없습니다 \'"
.파일 이름에는 줄 바꾸기를 제외한 모든 문자가 포함될 수 있습니다.
identify
각 레코드 뒤에 자동으로 개행 문자를 입력하고 다른 버전에는 명시 적으로 하나를 추가해야합니다. \n
인수 끝에 추가 -format
하십시오 (내 편집 참조).
나는 당신이 묘사 한 것과 같은 문제에 직면했습니다. 내 해결책은 다음과 같습니다.
#!/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
파일을 이전 보다 크게 만들었습니다 ).
fx
연산자를 사용하여 높이 / 너비를 기준으로 이미지를 필터링 할 수도 있습니다. 예 :
identify -format '%[fx:(h>400 && w>400)]\n' image.png
의지 출력 1
이미지가보다 큰 경우 400x400
와 0
는 같거나 작을 경우 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
사용자 항목 이 답변을 .
그런 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
@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에서 작동하지 않기 때문에 이것이 필요했습니다.)
크기 조정 및 최적화를위한 내 기능
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"
}