Linux Memo: Vine Linux 5 設定 tips このページをアンテナに追加 RSSフィード

2009-09-29

コマンドラインで画像を縮小する:ImageMagick convert mogrify

画像をWebサイトに掲載したり、メールで送ったりする際、できるだけファイルサイズを小さくしつつできるだけキレイな画質にする必要がある。高速回線が一般的となった現状では、以前ほどファイルサイズを気にすることもなくなったが、それでも100KBを超えるような画像をサイトに掲載するのはやや抵抗があるし、画像が複数あるサイトでは、ひとつの画像のファイルサイズはできるだけ小さくしておきたい。


細かな編集にはgimpを使うべきだが、細かいことはあまり気にせずにコマンド一発で画像を縮小する場合は、「ImageMagick」に含まれる「convert」や「mogrify」コマンドを使う。

コマンドラインで処理ですれば、GUIで作業するよりも格段に楽で早い上、複数のファイルも一発で処理できる。

ImageMagick」は、その解説だけで1冊の本になるほど高機能かつ使いでのあるコマンドであり、「convert」や「mogrify」もまた様々な画像処理が行えるが、以下はPNG画像の縮小だけについてのメモ。

(一般的に、画像は縮小はしても拡大するものではない。拡大すると画質が著しく落ちる)

「convert」や「mogrify」コマンドがない場合は、「ImageMagick」をインストールする。


縮小コマンド例

(処理したい画像のあるディレクトリにcdしてから)

convert

a.pngを縮小してb.pngという名前で保存

convert -resize 320x -unsharp 2x1.4+0.5+0 -colors 65 -quality 100 -verbose a.png b.png

下記の「mogrify」コマンドは、元ファイルを上書きしてしまうので「convert」を使うほうが安心。複数ファイルを一発で処理したい場合は「mogrify」が便利。

mogrify

a.pngを縮小して上書き保存(元画像はなくなる)

mogrify -resize 320x -unsharp 2x1.4+0.5+0 -colors 65 -quality 100 -verbose a.png

ディレクトリ内のすべての「.png」ファイルをまとめて処理して上書き(元画像はなくなる)

mogrify -resize 320x -unsharp 2x1.4+0.5+0 -colors 65 -quality 100 -verbose *.png

mogrifyコマンドは元画像を上書きするので注意。上書きされると困る場合は元画像をどこかにバックアップしてから処理する。

処理後は必ず、画像の大きさ、画質、ファイルサイズを確認する。

オプション書式

[-resize] [横x縦] or [%]

画像のサイズを指定する。画像サイズを小さくするほど、ファイルサイズも小さくなる。画像の大きさは、ファイルサイズを大きく左右するとともに、画像の見やすさも大きく左右する。Webサイトの画像は、可能なら一般的な解像度のモニタでスクロールせずに全体を見ることができる大きさにするほうがよい。

  • 横のサイズをpx(ピクセル)指定、縦は自動
    -resize 100x
    横幅の数値を入れ、縦は指定しない。この場合、横幅が100pxになり、縦は元画像の縦横比に従って自動調整される。
  • 縦のサイズをpx(ピクセル)指定、横は自動
    -resize x100
    縦の数値を入れ、横は指定しない。この場合、縦が100pxになり、横幅は元画像の縦横比に従って自動調整される。
  • 縦横のサイズをpx(ピクセル)指定
    -resize 100x200
    最大で横100px縦200px内に収まるように、縦横比を保ったまま画像の大きさを変更する。横300px縦300pxの正方形の画像を「-resize 100x200」で処理すると、横の最大値が「100px」となるので、元画像が正方形のため処理後の画像は縦も「100px」となり、結果「100x100」となる。この指定方法は結果をイメージしにくいので、多くの場合、横サイズのみ、または縦サイズのみで指定したほうがよいだろう。

「%」指定は、文字通り元画像の指定%の大きさになる。

[-unsharp] [数値]

画像を縮小するとボケるので「-unsharp」(アンシャープマスク)にて、鮮明になるようシャープネス処理をする。多くの場合、これは必須。このオプションは、画質を大きく左右する。

数値は、
「-unsharp radius(x)sigma{+amount}{+thresold}」
で指定する。

  • radius:ガウシアンでの範囲(default:0)
  • sigma:ガウシアンの標準偏差(default:1.0)
  • amount:オリジナルとぼやけたイメージの差分をパーセントで示す。(default:1.0)
  • thresold:量子レンジの分数として定義。(default:0.05)

出力結果が気に入らなくて、この数値が何のことだかわからない場合は、画像を確認しながら指定する数値を決める(しかない)。

[-colors] [数値]

画像の色数を指定する。色数を減らすほどファイルサイズは小さくなる。どこまで色数を減らすことができるかは、元画像による。ファイルサイズと画質のバランスをとるためには、この数値がかなり重要なポイントとなる。

画像を縮小せずにファイルサイズを小さくしたいときは、[-resize]や[-unsharp]を省略して[-colors] で色数を減らす。

[-quality] [数値]

画像の圧縮レベル。[0-100]の数値が指定できる。が、これは、よくわからない。処理結果からは、一見、数値が大きいほど圧縮レベルが上がり、ファイルサイズが小さくなるようにも思えるが、単純にそうなるわけでもない。ちょっと調べてみたがわからないのでひとまず放置。指定がない場合は、[75]。「[100]は劣化無し」と解説されているが、この意味もよくわからない。いまのところ、[90]と[100]は同じになるので、これは元画像の圧縮率に従うということか。これも、ファイルサイズを大きく左右するオプション。

[-verbose]

モニタに、コマンドの動きを出力する。このオプションがないと、「convert」と「mogrify」は、モニタには何も出力せずにコマンドを終えるので、本当に画像が処理されたのかどうかが心配な場合は、このオプションを付ける。

■ 参考サイト

andy