imagemagicで画像の一括リサイズ(名前も変更する)編

次のフォルダ構成に格納されている画像を

g
├── x001
│   ├── 0.png
│   ├── a.jpg
├── x002
│   ├── b.jpg
└── x003
    ├── 0.jpg
    ├── 1.jpg

こんな感じにしたい。

g
├── x001
│   ├── 0.png
│   ├── 0_300x300.png
│   ├── a.jpg
│   ├── a_300x300.jpg
├── x002
│   ├── b.jpg
│   ├── b_300x300.jpg
└── x003
    ├── 0.jpg
   ├── 0_300x300.jpg
    ├── 1.jpg
   ├── 1_300x300.jpg

次のようなコマンドになる。

find . -regex "\.\/.*\/[0-9]*\..*" | xargs -P8 -I{} convert {} -set filename:x "%d/%t_300x300.%e" -resize 300x300 "%[filename:x]"

それぞれ解説。

対象画像のリストアップ

findコマンドで正規表現を利用する - 屑プログラマの憂鬱 を参照

xargsを使ってImageMagickに渡す

pipeを利用すると、findの結果数が多くて処理が落ちてしまうので、xargsを利用してImageMagickに一つ一つ渡してあげます。

xargs -P8 -I{}

-P8 は、プロセスの並列数です。ImageMagickのconvertが並列で8つ立ち上がります。PCの性能が許す限り増やしていきましょう。

-I {} は、findの実行結果であるファイル名が入る置換文字列を利用するというオプションです。

ImageMagickでリサイズする

ImageMagickのconvertを利用します。基本的なリサイズ方法としては次のとおりです。アスペクト比を保ちつつリサイズしてくれます。

convert input_file -resize  (width)x(height)  output_file

ファイル名を変更する場合は、次のようになります。

-set filename:x "%d/%t_300x300.%e"で、filename:xという変数に"%d/%t_300x300.%e"を代入し、出力ファイル名として、\"%[filename:x]"(filename:xという変数そのままを出力結果とする)としています。

  • %dは、対象ファイルのディレクトリ名
  • %tは、対象ファイルのファイル名。ただし、ディレクトリと拡張子を除く
  • %eは、対象ファイルの拡張子

他にも属性は存在して、Format and Print Image Properties @ ImageMagick にまとまっています。