m2

画像の一括縮小

要件

  1. フォルダ内の jpeg 画像をすべて 1280x1024 に収まる大きさに縮小する
  2. なるべくきれい

はじめは Java で書こうとして以下の情報を見つけました。

Javaでサムネイル作成」に注目すると、やっていることは

の2つ。
それぞれ自分でもやってみましたが、自分が用意した画像と環境(Java SE 6)では前者の方がきれいでした。「画像の縮小について」にあるように、縮小の場合は「RenderingHints.VALUE_INTERPOLATION_BILINEAR」が効いてないようです。
前者は(遅いけど)十分きれいなのですが、IrfanView で縮小表示した結果には及びませんでした。IrfanView では「Lanczos」というアルゴリズムが使われているようです。
どうやら「理論上最高品質らしい」ようなのでそれを Java で … と思ったんですが、現在はまだ標準では無いみたいです。そういうライブラリも見つけられませんでした。
というわけで今回は Lanczos3 アルゴリズムが使える nconvert というフリーソフト(商用は有料)を使いました。
以下は「大きさを 1280x1024、縦横比を固定、リサイズアルゴリズムに lanczos3、jpeg画像で圧縮率を90%、出力ファイルを"r_(元のファイル名).jpg"でカレントフォルダ内の全ての".jpg"ファイルを対象にしてリサイズ」を実行します。

nconvert -resize 1280px 1024px -ratio -rtype lanczos -out jpeg -q 90 -o r_%.jpg  *.jpg

コマンドラインオプションは以下を参考にしました。

結果はもちろんきれいでしかも速い。他にもいろいろな変換が可能で、かなり高機能なソフトだと思いました。

  • -

b:id:brazil さんに ImageMagick を教えて頂きました。ありがとうございます。
上と同じ事をやるには

convert -resize 1280x1024 -filter Lanczos -quality 90 XXXX.jpg r_XXXX.jpg

とします*1
これだと「1280x1024」にリサイズされそうですが、ImageMagickでこれは最大値指定になります。
「1280x1024」にリサイズするには

convert -resize 1280x1024! -filter Lanczos -quality 90 XXXX.jpg r_XXXX.jpg

のように、大きさの後に"!" を付けます。

*1:デフォルトがLanczosなのでフィルタの指定は不要です。あと一括でやる方法はわかりませんでした。スクリプトを書けばいい話ですが。