回答:
私は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にサイズ変更)のような寸法の画像で機能しました。
PS: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"
}