次のコマンドを実行しています。
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
)が前提条件を満たす場合:- 2 番目の空白文字の前のすべてのテキストを削除します。これにより、幅と高さが削除されます。
- ファイル名である行の残りの部分を印刷します。
- 改行文字を null 文字に置き換えます。
- filenameに対してコマンドを実行するために呼び出されます
xargs -0
。 (プレーンはスペースや埋め込み入力を処理できないため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
ファイルサイズが400×400以下の場合でもファイルは処理されますが、サイズ変更サイズが400×400より大きい場合にのみ該当します。そのため、ファイルの変更時間とサイズが変更されます(私の場合は、mogrify
これらのファイルを均一にして大きい彼らより)。
答え3
imagemagick
fx
演算子を使用すると、高さ/幅に基づいて画像をフィルタリングできます。
(( $(identify -format '%[fx:(h>400 && w>400)]' image.png) ))
内部コマンドは1
画像がより大きい400x400
か0
等しいか小さいかを出力するため、式400x400
は(( ))
それぞれと評価されます。したがって、ファイルを繰り返してこのテストを実行して配列に正数を追加し、それをパラメータとして配列に渡すことができます。true
false
mogrify
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では動作しないため、これが必要です。)