コマンドラインの構造
コマンドラインの構造 • 入力ファイル名 • コマンドラインオプション • 出力ファイル名
ImageMagick のコマンドラインツールは、これほど単純にも書けます:
magick image.jpg image.png
あるいは、次のように大量のオプションを伴う複雑なものにもなります:
magick label.gif -alpha Set \
\( +clone -shade 110x90 -normalize -negate +clone -compose Plus -composite \) \
\( -clone 0 -shade 110x50 -normalize -channel BG -fx 0 +channel -alpha Off \) \
-delete 0 +swap -compose Multiply -composite button.gif
この例のコマンドは長く、複数行にまたがって書く必要があるため、見やすくするためにバックスラッシュ(\)を挿入して整形しています。バックスラッシュは Linux の行継続文字です。Windows シェルでは、行継続にキャレット文字(^)を使います。これらの Web ページでは上記のように Linux スタイルを採用しています。ただし、ブラウザのウィンドウが十分小さいと行がブラウザによって折り返されることがありますが、白で表示されているコマンドラインは依然として 1 行として入力することを意図しています。行継続文字は入力する必要はありません。上記でバックスラッシュを使ってエスケープしている括弧は、Windows ではエスケープしません。Windows と Linux の間には他にもいくつか違い(たとえば引用符の扱い)がありますが、それらの問題は必要に応じて後ほど説明します。
本サイトのほとんどのコマンドライン例では、Windows で実行できる同等の変換版がある場合、右下にドロップダウンが表示され、どの OS 向けのコマンドをプレビューするか切り替えられます。
ImageMagick のコマンドラインについて詳しくなくても、上記の最初のコマンドが JPEG 形式の画像を PNG 形式に変換していることは、おそらく推測できるでしょう。しかし、2 つ目のより複雑なコマンドが、平面的な 2 次元のラベルに、豊かなテクスチャと擬似的な奥行きを持つ 3 次元の見た目を与えていることに気づく人は、ごくわずかかもしれません:
ここでは、タスクの完了率を陰影付きのシリンダーとして表示します:

このレンダリングの複雑さを考えると、これが 1 つのコマンドラインで実現できることに驚くかもしれません:
magick -size 320x90 canvas:none -stroke snow4 -size 1x90 -tile gradient:white-snow4 \
-draw 'roundrectangle 16, 5, 304, 85 20,40' +tile -fill snow \
-draw 'roundrectangle 264, 5, 304, 85 20,40' -tile gradient:chartreuse-green \
-draw 'roundrectangle 16, 5, 180, 85 20,40' -tile gradient:chartreuse1-chartreuse3 \
-draw 'roundrectangle 140, 5, 180, 85 20,40' +tile -fill none \
-draw 'roundrectangle 264, 5, 304, 85 20,40' -strokewidth 2 \
-draw 'roundrectangle 16, 5, 304, 85 20,40' \( +clone -background snow4 \
-shadow 80x3+3+3 \) +swap -background none -layers merge \( +size -pointsize 90 \
-strokewidth 1 -fill red label:'50 %' -trim +repage \( +clone -background firebrick3 \
-shadow 80x3+3+3 \) +swap -background none -layers merge \) -insert 0 -gravity center \
-append -background white -gravity center -extent 320x200 cylinder_shaded.png
Geemack 氏が提供したこのスクリプトを実行してみてください。ImageMagick コマンドラインの強力さと汎用性の一端を垣間見られます:
magick -background none -size 960x960 xc:black \( xc:darkred -duplicate 1 +append \) \
xc:gold \( xc:teal -duplicate 2 +append \) -modulate 100,100,"%[fx:rand()*200]" \
xc:white -scale x1 +append -write mpr:clut +delete radial-gradient: mpr:clut \
-clut -scale 100x4% -wave "%[fx:rand()*24+24]"x"%[fx:w/ceil(rand()*4+1)]" -extent "%[w]x%[w]" \
-roll +0+"%[fx:(rand()*w*0.05)+(w*0.51)]" \( +clone -blur 0x4 \) -insert 0 -composite \
-duplicate "%[fx:floor(rand()*3+3)*2-1]" -set option:rot "%[fx:180/n]" -virtual-pixel tile \
-virtual-pixel none -distort SRT "%[fx:t*360/n]" +repage -flatten -extent 100x50% \
\( +clone -rotate 180 \) -append +channel -virtual-pixel none -distort SRT "0.96 %[fx:rand()*360]" \
\( +clone -flop \) +repage -insert "%[fx:round(rand())]" -background black \
-flatten -brightness-contrast 20,20 -normalize dragonFire.png
このスクリプトを Windows で実行できるようにするには、バックスラッシュ付きの括弧(\()を単なる括弧に、バックスラッシュ(\)を ^ に変え、パーセント記号(%)を 2 つ重ねてください。
以降のセクションでは、ImageMagick コマンドラインの構造を分解して解説します。コマンドラインの仕組みを注意深く読み、よりよく理解すれば、ときに敷居の高いプログラムインターフェースに頼らずとも、複雑な画像処理タスクをこなせるようになるはずです。
コマンドラインから ImageMagick を使う際の追加のヘルプは Examples of ImageMagick Usage を参照してください。
コマンドラインの構造
ImageMagick のコマンドラインは、以下から構成されます。
- 1 つ以上の必須の入力ファイル名。
- 0 個以上の画像設定(image settings)。
- 0 個以上の画像演算子(image operators)。
- 0 個以上の画像シーケンス演算子(image sequence operators)。
- 0 個以上の画像スタック(image stacks)。
- 0 または 1 個の出力画像ファイル名(magick、convert、composite、montage、compare、import、conjure で必須)。
コマンドラインを構成する各要素の詳しい説明は、以降のセクションにあります。
入力ファイル名
ImageMagick は、入力ファイル名の概念を次のように拡張しています。
- ファイル名のグロブ(globbing)
- 明示的な画像フォーマット指定
- 組み込み画像とパターンの利用
- STDIN、STDOUT、ファイルディスクリプタ
- 画像から特定フレームの選択
- 画像の領域選択
- 読み込み時のインライン画像リサイズの強制
- 読み込み時のインライン画像切り抜きの強制
- ファイル名参照の利用
これらの拡張は、次のいくつかの段落で説明します。
なお、既定では、コマンドラインオプションがファイル名でもある場合(例: -quality)、ファイル名として解釈されます。代わりにオプションとして解釈させるには -define registry:option:pedantic=true を使ってください。
ファイル名のグロブ(Globbing)
Linux シェルでは、アスタリスク(*)や疑問符(?)などの特定の文字が、パターンマッチに基づいてファイル名のリストを自動生成します。この機能はグロブ(globbing)と呼ばれます。ImageMagick は、Windows のようにグロブをネイティブにサポートしないシステムのために、ファイル名のグロブをサポートしています。たとえば、カレントディレクトリの 1.jpg、2.jpg、3.jpg、4.jpg、5.jpg を GIF アニメーションに変換したいとします。次のコマンドで、すべての JPEG ファイルを簡潔に指定できます:
magick *.jpg images.gif
明示的な画像フォーマット
画像は、よく知られた JPEG、PNG、TIFF など、無数の画像フォーマットで保存されます。ImageMagick は、画像を読み込んで処理する前に、そのフォーマットを知る必要があります。ほとんどのフォーマットには、フォーマットを一意に識別するシグネチャが画像内にあります。それがない場合、ImageMagick はファイル名の拡張子を利用してフォーマットを判定します。たとえば image.jpg や image.JPG は、JPEG 形式の画像を読み込んでいることを ImageMagick に伝えます。
場合によっては、画像にシグネチャが含まれていなかったり、ファイル名がフォーマットを示していなかったりすることがあります。その場合は、明示的に画像フォーマットを指定する必要があります。たとえば、画像の名前が image で、生の赤・緑・青の輝度値を含んでいるとします。ImageMagick はフォーマットを自動判定できないので、明示的に指定します:
magick -size 640x480 -depth 8 rgb:image image.png
組み込み画像とパターン
ImageMagick には、多数の組み込み画像とパターンがあります。たとえば市松模様(checkerboard)パターンを使うには:
magick -size 640x480 pattern:checkerboard checkerboard.png
STDIN、STDOUT、ファイルディスクリプタ
Linux と Windows では、あるコマンドの出力を別のコマンドの入力へパイプできます。ImageMagick は、疑似ファイル名 - を使って、標準ストリーム STDIN(標準入力)と STDOUT(標準出力)から画像データを読み書きできます。この例では、magick の出力を display プログラムへパイプします:
magick logo: gif:- | magick display gif:-
上の例では、2 つ目の明示的フォーマット "gif:" は省略可能です。GIF 画像フォーマットには画像内に一意のシグネチャがあるため、ImageMagick の display コマンドはフォーマットを GIF と容易に認識できます。magick プログラムも、この方法で STDIN を入力として受け付けます:
magick rose: gif:- | magick - -resize "200%" bigrose.jpg'
その他のパイプは、ファイルディスクリプタ経由でアクセスできます(バージョン 6.4.9-3 以降)。ファイルディスクリプタ 0、1、2 はそれぞれ標準ストリーム STDIN、STDOUT、STDERR 用に予約されていますが、ディスクリプタ番号 N>2 に関連付けられたパイプは、疑似名 fd:N でアクセスできます。(疑似名 fd:0 と fd:1 は STDIN と STDOUT に使えます。)次の例は、ディスクリプタ 3 と 4 からパイプされた画像データを連結し、結果をディスクリプタ番号 5 のファイルへ出力する方法を示します:
magick fd:3 fd:4 -append fd:5
必要に応じて、前述のように明示的な画像フォーマットを指定できます:
magick gif:fd:3 jpg:fd:4 -append tif:fd:5
フレームの選択
一部の画像フォーマットには複数の画像フレームが含まれます。最初の画像だけ、最後の画像だけ、あるいはその間のいくつかが欲しい場合があります。読み込むフレームは、画像ファイル名の後にフレーム範囲を角括弧で囲んで指定できます。ここでは、画像(アニメーション GIF)に複数フレームが含まれますが、最初のフレームだけが欲しいとします:
magick 'images.gif[0]' image.png
Linux シェルは一般に角括弧を解釈するため、上記ではファイル名を引用符で囲んでいます。Windows コマンドシェルでは角括弧は解釈されませんが、引用符を使っても害はありません。ただし、ほとんどの場合、シングルクォートとダブルクォートの役割は Linux と Windows で逆になるため、Windows ユーザーは、こちらでシングルクォートと表示している箇所では通常ダブルクォートを試すべきです(逆も同様)。
フレーム範囲を使えば、シーケンスから複数の画像を読み込めます。たとえば、画像シーケンスの最初の 4 フレームを抽出できます:
magick 'images.gif[0-3]' images.mng
既定では 1 フレームずつ進むため、フレーム 0、1、2、3 が返されます。-define frames:step=2 でステップを 2 に設定すると、代わりにフレーム 0 と 2 が得られます。
最後に、シーケンスから複数の画像を順不同で読み込むこともできます。次のコマンドは、シーケンスの 4 番目、続いて 3 番目、そして 5 番目の画像を取得します:
magick 'images.gif[3,2,4]' images.mng
最後の 2 つのコマンドでは、1 つの画像が書き出される点に注意してください。この場合、画像タイプが MNG であれば、MNG フォーマットは複数フレームをサポートするため、出力はマルチフレームファイルになります。出力フォーマットが単一フレームしかサポートしない JPG だった場合、出力は個別のフレームに分かれます。これについては後述の「出力ファイル名」のセクションで詳しく説明します。
画像領域の選択
生(raw)画像は、幅・高さ・画像シグネチャといった付加的なメタ情報を持たない、色強度の並びです。生画像フォーマットでは、画像の幅と高さを指定する必要がありますが、読み込む画像の領域を指定することもできます。この例では、画像は生の 8 ビット RGB 形式で、幅 6000 ピクセル・高さ 4000 ピクセルです。ただし、画像中央付近の 600×400 の領域だけが欲しいとします:
magick -size 6000x4000 -depth 8 'rgb:image[600x400+1900+2900]' image.jpg
同じ結果は -extract オプションでも得られます:
magick -size 6000x4000 -depth 8 -extract 600x400+1900+2900 rgb:image image.jpg
インライン画像リサイズ
画像を読み込みながらリサイズすると便利なことがあります。たとえば、数百枚の大きな JPEG 画像を PNG サムネイルのシーケンスに変換したいとします:
magick '*.jpg' -resize 120x120 thumbnail%03d.png
ここでは、すべての画像が読み込まれてから、その後にリサイズされます。各画像を読み込みながらリサイズする方が高速で、リソース消費も少なくて済みます:
magick '*.jpg[120x120]' thumbnail%03d.png
インライン画像切り抜き
画像を読み込みながら切り抜くと便利なことがあります。たとえば、数百枚の大きな JPEG 画像を PNG サムネイルのシーケンスに変換したいとします:
magick '*.jpg' -crop 120x120+10+5 thumbnail%03d.png
ここでは、すべての画像が読み込まれてから、その後に切り抜かれます。各画像を読み込みながら切り抜く方が高速で、リソース消費も少なくて済みます:
magick '*.jpg[120x120+10+5]' thumbnail%03d.png
ファイル名参照
ファイル名を使って他の画像ファイル名を参照する方法は 2 つあります。1 つ目は '@' を使う方法で、指定ファイルから空白で区切られた画像ファイル名を読み込みます。ファイル myimages.txt が次のようなファイル名リストで構成されているとします:
frame001.jpg
frame002.jpg
frame003.jpg
このとき、次のコマンド:
magick @myimages.txt mymovie.gif
は、画像 frame001.jpg、frame002.jpg、frame003.jpg を読み込み、GIF 画像シーケンスに変換します。
画像のパスに 1 つ以上のスペースが含まれる場合は、パスを引用符で囲みます:
'my title.jpg'
一部の ImageMagick コマンドラインオプションは、コマンドラインプロセッサの能力を超えることがあります。たとえば Windows は、コマンドラインを 8192 文字に制限しています。たとえば、多角形の点を持つ draw オプションがコマンドライン長の制限を超える場合は、draw オプションを代わりにファイルに入れ、@ でそのファイルを参照してください(例: @mypoly.txt)。
他の画像ファイルを参照するもう 1 つの方法は、ファイル名にフォーマット文字とシーン範囲を埋め込むことです。ファイル名 image-%d.jpg[1-5] を考えます。次のコマンド:
magick image-%d.jpg[1-5]
は、ImageMagick に次のファイル名の画像を読み込ませようとします:
image-1.jpg
image-2.jpg
image-3.jpg
image-4.jpg
image-5.jpg
ストリームバッファリング
既定では、入力ストリームはバッファリングされます。ソースファイルや端末の情報を利用可能になり次第読み込むようにするには、バッファサイズを 0 に設定します:
magick logo: gif:- | magick display -define stream:buffer-size=0 gif:-
コマンドラインオプション
これらのコマンドラインオプションで、ImageMagick ユーティリティの動作を制御できます。オプションの動作は、次のいずれかのカテゴリに分類されます。
- 画像設定(Image Setting)
- 画像演算子(Image Operator)
- 画像チャンネル演算子(Image Channel Operator)
- 画像シーケンス演算子(Image Sequence Operator)
- 画像ジオメトリ(Image Geometry)
- 画像スタック(Image Stack)
画像設定(Image Setting)
画像設定は、コマンドライン上に現れた時点から持続し、その後の処理(画像の読み込み、画像演算子、画像の書き出しなど)に適切に影響します。画像設定は、リセットされるかコマンドラインが終了するまで有効です。画像設定には以下が含まれます。
- • -adjoin
- • -affine
- • -alpha
- • -antialias
- • -authenticate
- • -background
- • -bias
- • -black-point-compensation
- • -blue-primary
- • -bordercolor
- • -caption
- • -channel
- • -comment
- • -compress
- • -debug
- • -define
- • -delay
- • -density
- • -depth
- • -direction
- • -display
- • -dispose
- • -dither
- • -encoding
- • -endian
- • -extract
- • -family
- • -fill
- • -filter
- • -font
- • -format
- • -fuzz
- • -geometry
- • -gravity
- • -green-primary
- • -interlace
- • -intent
- • -interpolate
- • -label
- • -limit
- • -linewidth
- • -log
- • -loop
- • -mattecolor
- • -monitor
- • -orient
- • -page
- • -pointsize
- • -preview
- • -quality
- • -quiet
- • -read-mask
- • -red-primary
- • -region
- • -render
- • -repage
- • -sampling-factor
- • -scene
- • -seed
- • -size
- • -stretch
- • -stroke
- • -strokewidth
- • -style
- • -texture
- • -tile
- • -transparent-color
- • -treedepth
- • -type
- • -undercolor
- • -units
- • -verbose
- • -virtual-pixel
- • -weight
- • -write-mask
この例では、前述のとおり設定は持続するため、-channel は各画像に適用されます:
magick -channel RGB wand.png wizard.png images.png
画像演算子(Image Operator)
画像演算子は、コマンドライン上に現れた時点で即座に画像へ作用する点が設定と異なります。演算子とは、画像設定にも画像シーケンス演算子にも挙げられていないコマンドラインオプションのことです。コマンドライン終了まで持続する画像設定と違い、演算子は現在の画像セットに適用されたあと忘れられます。画像演算子には以下が含まれます。
- • -annotate
- • -black-threshold
- • -blur
- • -border
- • -charcoal
- • -chop
- • -clip
- • -clip-path
- • -clip-mask
- • -colors
- • -colorize
- • -colorspace
- • -color-threshold
- • -compose
- • -contrast
- • -convolve
- • -crop
- • -cycle
- • -despeckle
- • -draw
- • -edge
- • -emboss
- • -enhance
- • -equalize
- • -evaluate
- • -extent
- • -flip
- • -flop
- • -floodfill
- • -frame
- • -fx
- • -gamma
- • -gaussian-blur
- • -grayscale
- • -implode
- • -integral
- • -kmeans
- • -lat
- • -level
- • -map
- • -median
- • -modulate
- • -monochrome
- • -negate
- • -noise
- • -normalize
- • -opaque
- • -ordered-dither
- • -paint
- • -posterize
- • -raise
- • -profile
- • -random-threshold
- • -resample
- • -resize
- • -roll
- • -rotate
- • -rotational-blur
- • -sample
- • -scale
- • -sepia-tone
- • -segment
- • -shade
- • -shadow
- • -sharpen
- • -shave
- • -shear
- • -sigmoidal-contrast
- • -solarize
- • -splice
- • -spread
- • -strip
- • -swirl
- • -threshold
- • -transparent
- • -thumbnail
- • -tint
- • -transform
- • -trim
- • -unsharp
- • -version
- • -wave
- • -white-balance
- • -white-point
- • -white-threshold
この例では、-negate は wand 画像を反転しますが、wizard は反転しません:
magick wand.png -negate wizard.png images.png
画像演算子は、画像シーケンス内の各画像に適用される点に注意してください。たとえば -resize オプションで GIF 画像をリサイズすると、各フレームが指定サイズにリサイズされます。ただし、一部のフレームは画像全体より小さいことがあり、すべてのフレームを同じサイズにリサイズすると予期しない出力になることがあります。そのような場合は、-coalesce を使ってフレームを準備すべきです。
画像チャンネル演算子(Image Channel Operator)
画像チャンネルに直接作用します:
- • -channel-fx
- • -separate
画像シーケンス演算子(Image Sequence Operator)
画像シーケンス演算子は、コマンドライン上に現れた時点で即座に画像シーケンスへ作用する点が設定と異なります。以下の画像シーケンス演算子から選べます。
- • -append
- • -affinity
- • -average
- • -clut
- • -coalesce
- • -combine
- • -compare
- • -complex
- • -composite
- • -copy
- • -crop
- • -debug
- • -deconstruct
- • -delete
- • -evaluate-sequence
- • -fft
- • -flatten
- • -fx
- • -hald-clut
- • -ift
- • -identify
- • -insert
- • -layers
- • -limit
- • -map
- • -maximum
- • -minimum
- • -morph
- • -mosaic
- • -optimize
- • -process
- • -quiet
- • -read
- • -swap
- • -write
この例では、-append は 3 つの画像を 1 つに連結します:
magick mikayla.png picnic.png beach.png -append vacation.png
画像ジオメトリ(Image Geometry)
多くのコマンドラインオプションは、画像の希望する幅と高さなどの寸法量を指定するためにジオメトリ引数を取ります。ユーザーは結果の寸法・サイズ・位置について実に多くのバリエーションを求めるため(そして ImageMagick はそれらを提供したいため)、ジオメトリ引数は多くの形式を取れます。このセクションでは、その多くを説明します。
何らかの形式のジオメトリ引数を取る画像オプション・設定には、以下が含まれます。これらの一部は、引数をわずかに異なる方法で解釈する点に留意してください。詳細は個々のオプション・設定のドキュメントを参照してください。
- • -adaptive-resize
- • -border
- • -borderwidth
- • -chop
- • -crop
- • -density
- • -extent
- • -extract
- • -frame
- • -geometry
- • -iconGeometry
- • -liquid-rescale
- • -page
- • -region
- • -repage
- • -resize
- • -sample
- • -scale
- • -shave
- • -splice
- • -thumbnail
- • -window
ジオメトリ引数は、下の表に挙げる形式のいずれかを取ります。これらは表の後のサブセクションで詳しく説明します。通常の形式は size[offset] で、size は必須、offset は省略可能です。まれに [size]offset も可能です。いずれの場合も、ジオメトリ引数の中にスペースは許可されません。
| size | 一般的な説明(実際の動作はオプション・設定によって異なる場合がある) |
|---|---|
| scale% | 高さと幅の両方を指定したパーセンテージで拡大縮小する。 |
| scale-x%xscale-y% | 高さと幅を個別に指定したパーセンテージで拡大縮小する(% 記号は 1 つでよい)。 |
| width | 幅を指定し、高さはアスペクト比を保つよう自動選択する。 |
| xheight | 高さを指定し、幅はアスペクト比を保つよう自動選択する。 |
| widthxheight | 高さと幅の最大値を指定し、アスペクト比を保つ。 |
| widthxheight^ | 幅と高さの最小値を指定し、アスペクト比を保つ。 |
| widthxheight! | 幅と高さを強制的に指定し、元のアスペクト比を無視する。 |
| widthxheight> | 指定した幅・高さより大きい寸法を持つ画像を縮小する。 |
| widthxheight< | 指定した幅・高さより小さい寸法を持つ画像を拡大する。 |
| area@ | 指定したピクセル面積になるよう画像をリサイズする。アスペクト比は保たれる。 |
| x:y | ここで x と y はアスペクト比を表す(例: 3:2 = 1.5)。 |
| x:y^ | 指定したアスペクト比にするため行または列を削除する。 |
| x:y# | 指定したアスペクト比にするため行または列を追加する。 |
| {size}{offset} | オフセットを指定する(既定は +0+0)。ここで {size} は上記いずれかの形式を指す。 |
| {size}{+-}x{+-}y | 水平・垂直のオフセット x と y をピクセルで指定する。両方に符号が必要。オフセットは -gravity 設定の影響を受ける。オフセットは % などの size 演算子の影響は受けない。なお、正の X・Y オフセットは、'center' を除くすべての -gravity オプションで、画像中心に向かう内向き方向となる。East では +X は左、South では +Y は上、SouthEast では +X は左・+Y は上。center では通常の X・Y の方向規約が使われる(+X は右、+Y は下)。 |
幅と高さの基本的な調整: 演算子 %、^、!
すぐ下に、-resize オプションの引数としての使い方を示す、ジオメトリの簡単な例をいくつか挙げます。入力画像には内部画像 logo: を使います。この見事な画像は幅 640 ピクセル・高さ 480 ピクセルです。その寸法を 640x480 と表記します。画像の寸法を表すとき、幅(水平方向)は常に高さ(垂直方向)に先行します。これは画像内の座標やオフセットを表すときも同様で、常に x 値の後に y 値が続きます。高校の代数の授業と xy 平面を思い出してください。(ただしほぼ、です。我々の y 軸は常に下向きに進みます!)
magick logo: -resize '200%' bigWiz.png
magick logo: -resize '200x50%' longShortWiz.png
magick logo: -resize '100x200' notThinWiz.png
magick logo: -resize '100x200^' biggerNotThinWiz.png
magick logo: -resize '100x200!' dochThinWiz.png
4 つのコマンドのうち最初のものは単純で、入力画像の幅と高さを各方向に 200% 引き伸ばします。全体を 2 倍に拡大するのです。2 つ目は各方向に異なるパーセンテージを指定し、幅を 200% に引き伸ばし、高さを 50% に押し縮めます。(この例では)結果の画像は 1280x240 になります。パーセント記号を繰り返す必要はない点に注意してください。200x50%、200%x50、200%x50% はすべて同等です。
既定では、ジオメトリ引数で与えた幅と高さは、パーセンテージが指定されない限り最大値です。つまり、画像はアスペクト比(高さと幅の比)を保ちながら、指定した幅と高さの値に収まるよう拡大または縮小されます。たとえば上記の 3 つ目のコマンドは、寸法を 100x200 に設定しようと「試みます」。元の画像(640x480)を、アスペクト比を一定に保ったまま 100x200 の矩形にちょうど収まるまで徐々に縮小する様子を想像してください。画像は縦より横が長いので、幅が 100 ピクセルに縮んだときに収まります。アスペクト比を保つため、高さは (480/640)×100 ピクセル = 75 ピクセルになり、最終的な寸法は 100x75 になります。
前の例では、指定した寸法のうち少なくとも 1 つ(この場合は幅 100 ピクセル)が達成される点に注意してください。結果の画像は元の寸法の内側にぴったり収まります。^ 演算子を使うと、上記 4 つ目の例のように、ちょうど逆のことができます。その場合、引数として 100x200^ を与えると、やはり少なくとも 1 つの寸法は達成されますが、今度は結果の画像が元の矩形をぴったり包含できるようになります。ここではジオメトリ引数は最小値を与えます。この例では、高さが 200 になり、幅はアスペクト比を保つよう (640/480)×200 ピクセル = 267 ピクセルに拡大されます。^ 演算子では、寸法の 1 つが要求サイズに一致しますが、アスペクト比を保つため画像は要求した寸法をはみ出すことが多いです。(^ 機能は IM 6.3.8-2 以降の新機能です。)
ImageMagick が画像のアスペクト比の保持に非常に優れており、お気に入りの写真や画像の歪みを防いでくれることが分かります。しかし、画像を引き伸ばして本当に寸法を 100x200 にしたい場合もあるでしょう。その場合は、ジオメトリに感嘆符演算子(!)を付けて、本気であることを ImageMagick に伝えます。これにより、画像サイズが指定したとおり正確に強制されます。たとえば 100x200! を指定すると、寸法は正確に 100x200 になります(小さく、縦に引き伸ばされた wizard になります)。
幅・高さ・面積の上限指定: 演算子 >、<、@
さらにいくつか例を示します:
magick logo: -resize '100' wiz1.png
magick logo: -resize 'x200' wiz2.png
magick logo: -resize '100x200>' wiz3.png
magick logo: -resize '100x200<' wiz4.png
寸法が 1 つだけ与えられた場合、それは幅とみなされます。上記 1 つ目の例のように幅だけ指定すると、幅はそのまま受け入れられ、高さは入力画像のアスペクト比を保つよう選ばれます。同様に、2 つ目の例のように高さだけ指定すると、高さが受け入れられ、幅はアスペクト比を保つよう選ばれます。
は、画像の寸法が対応する幅・高さ引数より大きい場合にのみ縮小します。< は、画像の寸法が対応する幅・高さ引数より小さい場合にのみ拡大します。どちらの場合も、変更が行われるなら、その結果は > や < 演算子が無かったかのようになります。上記 3 つ目の例では 100x200> を指定し、元の画像サイズは 640x480 なので、100x200 を指定したかのように画像サイズが縮小されます。一方、4 つ目の例では、サイズは変更されません。
最後に、@ を使うと、やはりアスペクト比を保とうとしつつ、画像の最大面積をピクセルで指定できます。(ピクセルは整数値しか取れないため、常に多少の近似が働きます。)次の例では 10000 ピクセルの面積を要求しています。結果のファイルは寸法 115x86 で、9890 ピクセルです:
magick logo: -resize '10000@' wiz10000.png
上記および下記のすべての例で、ジオメトリ引数を引用符で囲んでいます。多くの場合これは省略可能ですが、常にではありません。< や > を使うときは、これらの文字がシェルにファイルリダイレクトとして解釈されるのを防ぐため、ジオメトリ指定を引用符で囲む必要があります。Windows システムでは、キャレット ^ を引用符の中に入れる必要があり、そうしないと無視されます。安全のため、ここで示したように、すべてのジオメトリ引数を引用符で囲む習慣を保つとよいでしょう。
ジオメトリにおけるオフセット
ジオメトリ引数におけるオフセットの使い方を示すいくつかの例です。オフセットの典型的な使い方の 1 つは、-region オプションとの併用です。このオプションは、他の多くのオプションが画像内の指定した矩形のサブ領域内のピクセルを変更できるようにします。そのため、その領域の幅と高さ、および画像へのオフセット(より大きな画像内での領域の位置を示す座標の組)を与える必要があります。下記の 1 つ目の例では、xy 座標 x=10, y=20 に位置する 100x200 の領域を指定します。便宜上、通常の代数表記 (x,y)=(10,20) を使いましょう。
magick logo: -region '100x200+10+20' -negate wizNeg1.png
magick logo: -region '100x200-10+20' -negate wizNeg2.png
magick logo: -gravity center -region '100x200-10+20' -negate wizNeg3.png
オフセットには常に +/− 符号が必要な点に注意してください。オフセットは実際には画像内の真の位置ではなく、その座標は他の何らかの位置に加算される必要があります。それを現在位置(current location)と呼びましょう。上記 1 つ目と 2 つ目の例では、その位置は画像の左上隅で、座標は (0,0) です。(これは位置を変更する他の指示が無いときの既定の状況です。)上記 1 つ目の例は、100x200 矩形自身の左上隅を (10,20) に置きます。
負のオフセットも多くの場合に意味を持ちます。上記 2 つ目の例では、オフセットは (-10,20)(-10+20 で指定)です。この場合、得られる(仮想的な)矩形のうち画像内にある部分だけが反転されます。これはジオメトリを 90x200+0+20 と指定するのと同等です。
上記 3 つ目の例では、-gravity 設定が他より先に来て、画像内の現在位置を画像のちょうど中心に設定します。この場合、画像サイズが 640x480 なので、それはピクセル (320,240) です。これはオフセットがその位置に適用されることを意味し、その位置はこの場合 (320-10,240+20)=(310,260) に移動します。ただし 100x200 領域自体も -gravity 設定の影響を受けるため、その左上隅ではなく、領域自身の中心(領域内の (+50,+100))が決定されます。したがって 100x200 矩形の中心が (310,260) に移動します。反転された矩形の左上隅は今や (310-50,260-100)=(260,160) になります。
画像スタック(Image Stack)
学校で、先生はおそらく、計算用紙で問題を解いてから結果を答案用紙に書き写すことを許してくれたでしょう。画像スタックも似ています。画像や画像シーケンスを切り離して処理し、その結果をあとでコマンドラインに戻すことができます。画像スタックは括弧で区切ります。画像演算子は現在のスタック内の画像にのみ作用します。たとえば、画像の回転を wizard 画像だけに限定できます:
magick wand.gif \( wizard.gif -rotate 30 \) +append images.gif
ここでも、括弧はバックスラッシュを前に付けてエスケープしている点に注意してください。これは括弧が特殊なシェル文字である Linux で必要です。バックスラッシュは、これらの文字を解釈せず、実行するコマンドへそのまま渡すようシェルに指示します。Windows では括弧をエスケープしないでください。各括弧(またはエスケープした括弧)の両側には、上記の例のようにスペースが必要です。
すでに説明した画像演算子に加えて、画像スタック内の画像を処理する際に特に有用な画像演算子は以下です。
これらの演算子の引数は、画像シーケンスへの番号によるインデックスで、最初の画像を 0 として始まります。ただし、負のインデックスを与えると、画像は末尾(最後に追加された画像)からインデックスされます。つまり、インデックス -1 は現在の画像シーケンスの最後の画像、-2 は最後から 2 番目、というようになります。
出力ファイル名
ImageMagick は、出力ファイル名の概念を次のように拡張しています。
- 明示的な画像フォーマット
- 標準出力への書き出し
- ファイル名参照
これらの拡張は、次のいくつかの段落で説明します。
出力ファイル名の代わりに -exit を使うと、画像の書き出しを完全に抑止できます。
明示的な画像フォーマット
画像は、よく知られた JPEG、PNG、TIFF など、無数の画像フォーマットで保存できます。ImageMagick は、画像を書き出す前に希望するフォーマットを知る必要があります。ImageMagick はファイル名の拡張子を利用してフォーマットを判定します。たとえば image.jpg は、JPEG 形式で画像を書き出すよう ImageMagick に伝えます。ファイル名がフォーマットを示さない場合もあります。その場合、明示的な画像フォーマットが指定されない限り、画像は元々読み込まれた形式で書き出されます。たとえば、生の赤・緑・青の輝度形式で、画像を image というファイル名に書き出したいとします:
magick image.jpg rgb:image
標準出力
Linux では、あるコマンドの出力を別のコマンドへパイプできます。ImageMagick は、ファイル名 - で、あるコマンドを別のコマンドへパイプできます。この例では、magick の出力を display プログラムへパイプします:
magick logo: gif:- | magick display gif:-
ここでは明示的なフォーマットは省略可能です。GIF 画像フォーマットには一意に識別するシグネチャがあるため、ImageMagick はフォーマットを GIF と容易に認識できます。
ファイル名参照
オプションで、埋め込みフォーマット文字を使って連番画像リストを書き出せます。出力ファイル名が image-%d.jpg で、画像リストに 3 つの画像が含まれるとします。次の画像ファイルが書き出されると予想できます:
image-0.jpg
image-1.jpg
image-2.jpg
あるいは、画像のプロパティを取得してファイル名を変更することもできます。たとえば、次のコマンド:
magick rose: -set filename:area '%wx%h' 'rose-%[filename:area].png'
は、このファイル名で画像を書き出します:
rose-70x46.png
最後に、複数の JPEG 画像を個別の PDF ページに変換するには、次を使います:
magick *.jpg +adjoin page-%d.pdf
埋め込みフォーマット文字の解釈をバイパスし、ファイル名をそのまま使うには -define filename:literal=true を使ってください。
ストリームバッファリング
既定では、出力ストリームはバッファリングされます。書き出した情報を出力先のファイルや端末に即座に反映させるには、バッファサイズを 0 に設定します:
magick -define stream:buffer-size=0 logo: gif:- | magick display gif:-

