欠けている画像だけをサイズ変更する方法は?

欠けている画像だけをサイズ変更する方法は?

10,000個のJPEGを含むディレクトリがあります。ファイルを作成するときに間違いを犯したが、一部は720px×480pxで、すべて448px×336pxである必要があります。ディレクトリには大きすぎるファイルが含まれており、正しいサイズは448ピクセル×336ピクセルです。サイズは同じでなければならないため、720ピクセル×480ピクセルの画像を正しい448ピクセル×336ピクセルに縮小する必要があります。

  • 各ファイルは448ピクセル×336ピクセルでなければなりません。
  • ファイルが10,000個あるため、各ファイルを調べてどのファイルが大きすぎるかを判断するのは困難です。

ImageMagickまたは同様のバッチツールを使用してサイズが間違った画像のみを選択的にサイズ変更する方法はありますか?

答え1

以下を使用して、幅720ピクセルのファイルを見つけることができます。

identify -format '%w %i\n' *.jpg | awk '/^720/ {print $2}'

*.jpg 拡張を引き起こし、「引数リストが多すぎる」エラーを引き起こす可能性のあるファイルが実際に多い場合は、次のバリアントを使用できます。

find -name '*.jpg' -exec identify -format '%w %i\n' {} + | awk '/^720/ {print $2}'

このリストを使用すると、次のファイルのサイズを変更できます。

find -name '*.jpg' -exec identify -format '%w %i\n' {} + | awk '/^720/ {print $2}' | xargs -I {} convert -resize 488x336! {} {}

感嘆符! 488x336 がない場合、新しい画像はそのサイズに正確に合わせられるため、縦横比が維持され、指定されたサイズは幅と高さの最大サイズです。

答え2

希望できる

convert in.jpg -resize "448x336!" out.jpg

すでにサイズが正しい場合は、ファイルがタッチされないのですか?
残念ながらそうではありません。しかし、imagemagicコマンドライン形式がどのように機能するかを考えると、これは驚くべきことではありません。

したがって、各ファイルの画像サイズを最初に確認する必要があります。今、identifyこの目的のためのコマンドでImageMagicを使用しようとしています。

identify -format "%wx%h\n" file.jpg

形式でサイズを表示しますWxH(例:)448x336

サイズがない場合は、448x336サイズを変更したいと思います。この場合、convertサイズ変更を使用します。画像を強制的に新しいサイズにするためにアスペクト比を変更した場合でも、サイズを変更したいことを知らせる必要があり448x336ます。これをサイズにオプション/フラグとして追加します。 :convert!

convert in.jpg -resize "448x336!" out.jpg

必要なサイズを調整してください。ただし、出力の固定ファイル名はありません。元の名前を持って-res前に挿入してみましょう。.jpgたとえば、次のようになります。in-res.jpg

convert in.jpg -resize "448x336!" -set filename:path "%d/%t-res.%e" "%[filename:path]"

find'コマンドを使用してディレクトリに移動します。.jpg '画像 - または'.JPG".セクションは、コマンドを使用identifyするためにシェルで実行されます。また、最初の操作(オプションではありません)が成功すると、実行されるコマンドとしてシェルを使用します。この場合、サイズを変更すると、次のようにメッセージが表示されます。サイズ変更された各ファイルについて。test[ ... ]convert-exec

find  . -type f -iname "*.jpg" -exec bash -c \
    '[ $(identify -format "%wx%h\n" "{}") != 448x336 ]' \;  -exec bash -c \
    'convert "{}" -resize "448x336!" -set filename:path "%d/%t-res.%e" \
    "%[filename:path]" ; echo "Resized {}"' \; 

bash2番目のタスクの代わりに一般を使用し-exec convert ...て新しいタスク(たとえば、-printまたは-ls)を追加して、サイズ変更されたファイルの名前を表示できます。

技術的には、コマンドは1行です(スクロールを避けるために連続した行を表示します)。
そして、この説明を聞いた後も、この文章が読みやすくないという感じがまだ続きます。

関連情報