画像処理ツール ImageMagick の便利なコマンド逆引きまとめ

ImageMagickでやりたい事からコマンドオプションを調べるための逆引き辞典的なまとめ。
項目は随時追加予定です(2013-11-21更新)。

詳細については ImageMagick公式サイトのUsageOptions を参照すると幸せになれます。

基本

画像形式を相互変換する(GIFからJPEG, JPEGからPNGなど)

convert input.gif output.jpg

convertコマンドは拡張子から画像形式を自動判別して変換することができます。上記の例では GIF から JPEGへ変換しています。
拡張子がないファイル名を扱うときなど、拡張子に依存せずに変換したい場合はプレフィクスをつけることで任意の画像形式として取り扱うことも可能です。


<h1>JPEG 形式の input.dat ファイルを PNG形式のimage0001に変換する。</h1>

convert jpeg:input.dat png:image0001

画像の読み込み、保存に標準入力、標準出力を使う

cat input.jpg | convert - -resize 50x50 - > output.jpg
cat input.jpg | convert jpg:- -resize 50x50 png:- > output.png

標準入力、標準出力を扱いたい場合、ファイルの代わりにハイフンを指定します。
入力値でプレフィクスによる画像形式指定を省略した場合は自動判別されます。
同様に出力値で画像形式指定を省略した場合、入力値と同じ形式で出力されます。

SVGからPNG(JPEG,GIF)へ変換する。

convert input.svg -resize 1600x1600 output.png

SVGはPNGやJPEG,GIFなど他の画像と同様に入力画像として扱えます。
jpegやgifにする場合は、output.pngの拡張子を変えるだけでOKです。

色の変換

カラー写真をグレースケール画像、セピア画像に変換する

グレースケール(モノクロ写真)への変換。

convert input.jpg -type GrayScale output.jpg

セピア調画像への変換。

convert input.jpg -sepia-tone '80%' output.jpg

グレースケールの画像を単色のアルファ画像に変換する。

convert  from.png -background '#99FFFF' -channel A -combine to.png

黒い部分を透明、白部分を不透明として、-backgroundで指定した色(例では#99FFFF)で塗りつぶしたアルファ画像に変換します。

画像の色を反転する。

convert from.png -negate to.png to.png



画像操作

画像の向きを上下反転・左右反転する


<h1>上下反転</h1>

convert input.png -flip output.png

<h1>左右反転</h1>

convert input.png -flop output.png

画像の一部を切り抜く

-crop geometry

使用例:座標(10, 20)から30×40ピクセル切り抜く

convert input.png -crop '30x40+10+20' output.png

サイズ指定必須、座標は省略可能です。

画像をリサイズする

-resize geometry

使用例: アスペクト比を維持しつつ100×100に収まるのサイズにリサイズする。

convert input.png -resize '100x100' output.png

サイズ指定必須。サイズには -resize ‘50%’ のようにパーセント指定が可能です。
デフォルトでアスペクト比を維持したままリサイズしますが、-resize ‘100×100!’のようにサイズ指定にエクスクラメーション記号(‘!’)を指定した場合はアスペクト比を無視したリサイズを行います。

横幅だけに合わせてリサイズ、または縦幅だけに合わせてリサイズを行いたい場合、-resize ’50x’ や -resize ‘x50’のように不要なサイズ指定を省略することで一方だけを基準としたリサイズが実現できます。

画像を回転する

-rotate degree{<}{>}

例: 画像を90度回転する

convert input.png -rotate 90 output.png

回転角を度数で指定します。
90の倍数以外の場合、回転後の画像が収まるサイズにキャンバスが拡張され、余白部分は背景色で塗りつぶされます。
-rotate ’90<‘のように不等号を指定すると、元が縦長(‘<‘)、または横長(‘>’)の時だけ回転処理を行うことが可能です。

画像をトリミングする

-trim +repage

使用例:

convert input.png -trim +repage output.png

画像の上下左右の余白部分をトリミングします。
-trimだけでも画像はトリミングされますが、キャンバスサイズはトリミングされないため、+repageと組み合わせて使いましょう。

トリミングを行う対象は四隅の色と一致する色です。
近似色までトリミングしたい場合は -fuzz distance{%} オプションで近似色の許容範囲を事前に設定して下さい。

convert input.png -fuzz 10 -trim +repage output.png

ImageMagickでコマンドラインからアニメーションGIF 1フレーム目を抽出, PNG画像から透過をはずす

– GIF アニメの1フレーム目のみを取り出す(出力はpngでもjpgでも可)

convert from.gif[0] -coalesce to.gif

 
– 透過 PNG 画像のアルファチャネルを除去する
透過を完全になくす時は PNG24 で出力します。
PNG8(パレットモード)にしないのは, PNG8 は GIF と同様パレットの1色を透過色として使うためです。

convert from.png png24:to.png

convert Tips – 標準入出力の利用と画像形式を指定の方法

convert コマンドを使っていて、パフォーマンスを考えるとファイルを介さずパイプを使いたい、という場合が多々あります。
こういう場合、ハイフン “-” を入出力ファイル名として指定することでそれぞれ標準入力、標準出力を使うという意味になります。
 
標準入力から画像を読み取る(STDIN):

cat foo.jpeg | convert – -resize 320×320 out.bmp

結果を標準出力に書き出す(STDOUT):

convert foo.jpeg -resize 320×320 – | cat > out.jpg

 
なお、標準入力を使う場合はこのままでも自動判別してくれるのでよいのですが、標準出力を使う場合はファイル指定する時と違い、拡張子による出力判別ができないため、デフォルトの動作はソースの形式と同じ形式で出力になってしまいます。
 
こういう場合に役立つ方法として、ファイル名の接頭語による画像形式指定があります。
たとえば /tmp/foo というファイルを明示的に GIF として読み込み、PNG として標準出力に出力する場合は以下のようにします。
 

convert gif:/tmp/foo png:-

 
参考:
ImageMagick: Command-line Processing
Standard In の項参照。

画像の伸縮

1. 単純に -resize を使った場合、アスペクト比を維持する。

convert from.png -resize 600×100 to.png

結果: from.png が 1000×1000 の場合、 100×100 に変換される
 
2. サイズ指定の最後に ! を付与すると、アスペクト比を無視する。

convert from.png -resize 600×100\! to.png

結果: 元のピクセルサイズによらず、600×100 になる。
 
などなど。
 
なお、単純に伸縮するだけでフィルタ処理( -filter, -support)をしないなら、-scale のほうが速いようです。

convert from.png -scale 600×100\! to.png

 
参考:
ブログの木村研 – ImageMagick Tips#03 オプションでさらに便利に
ImageMagick – Command-line Options#resize

ImageMagick の convert で半透明な PNG を扱う

PNG はRGBとともにα値を保持しているので、半透明色というのも指定することが可能です。

# a.gif の白(#FFFFFF)を半透明(50%=0x80)にし、b.png として保存(入力の形式は任意ですが、出力は png 必須です)。
convert a.gif -fill “#FFFFFF80” -opaque “#FFFFFF00” b.png
# 半透明になったか確認のため背景画像 bg.jpg の上に b.png を重ね、
# c.jpg として保存する(背景、出力の画像形式は任意です)。
convert -compose over bg.jpg b.png c.jpg

参考:
– convert コマンドのオプションについては「指定した色を別の色に置き換える
」を参照。
– PNGについては JEvaHz Messages 1320-1331 を参考にしました。

PNGの透明化は大別して2種類の指定方法があり、色深度などにより厳密には
4種類のフォーマットがあります。
 
1.αチャンネルを用いる場合(Color type = 4 or 6)
  (8bit,16bit grayscale / 24bit,48bit color)
 RGB値もしくはgrayscale値に加え、ピクセル毎にα値(透明度)を保持。
 α値の深度は色深度と同じ。
 
2.tRNS(=transparency) chunkを用いる場合
  a.1,2,4,8bit indexed colorの場合(Color type = 3)
   個々のカラーに対し、8bitの深度の透明度を指定できる。
  b.1,2,4,8,16bit grayscale の場合 (Color type = 0)
   ある一つのgrayscale levelに対し、1bitの深度の透明度を指定できる。
  c.24/48bit colorの場合(Color type = 2)
   ある一つの色に対し、1bitの深度の透明度を指定できる。
 
(中略)
 
また、PNGの仕様によると透明化は必須ではないらしいので、
実装にばらつきがでるのはやむを得ないでしょう。
部分的な対応もOKだそうで…。

PNG Programming Resources

指定した色を別の色に置き換える

 

convert source.gif -fill dest_color -opaque src_color dest.jpg

source.gif の、 src_color という色を dest_color という色に置き換えて dest.jpg として保存します。

例:
convert source.gif -fill “#FF0000” -opaque “#FFFFFF” result.jpg

真っ白で塗られている箇所を、真っ赤に塗りつぶします。
 
用途として、GIF,PNG などの透過対応形式からJPG,BMPなどの透過非対応形式に変換する場合の、透過色の置き換えなどに使えます。
 
参考:
convert -opaque
convert -fill