小さな画像を無視しながら大きな画像のサイズを変更するには、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)が前提条件を満たす場合:
    • 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:パラメータ説明400x400mogrifyファイルサイズが400×400以下の場合でもファイルは処理されますが、サイズ変更サイズが400×400より大きい場合にのみ該当します。そのため、ファイルの変更時間とサイズが変更されます(私の場合は、mogrifyこれらのファイルを均一にして大きい彼らより)。

答え3

imagemagick fx演算子を使用すると、高さ/幅に基づいて画像をフィルタリングできます。

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

内部コマンドは1画像がより大きい400x4000等しいか小さいかを出力するため、式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では動作しないため、これが必要です。)

関連情報