Color Modes

コマンドライン処理

コマンドラインの構成入力ファイル名コマンドラインオプション出力ファイル名

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シェルでは、キャレット文字(^)を行継続に使用します。上記のように、これらのウェブページではLinuxスタイルを使用しています。ただし、ブラウザのウィンドウが十分に小さい場合、ブラウザによって行が折り返されることがありますが、白で表示されるコマンドラインは、1行として入力することを意図しています。行継続文字を入力する必要はありません。上記でバックスラッシュを使用してエスケープされた括弧は、Windowsではエスケープされません。WindowsとLinuxの間には、(たとえば、引用符に関する)他にもいくつかの違いがありますが、それらの問題は発生したら後で説明します。

このサイトのコマンドライン例の大部分について、Windowsで実行するための同等の翻訳がある場合は、右下にドロップダウンが表示され、プレビューするコマンドのオペレーティングシステムを切り替えることができます。

ImageMagickコマンドラインについてあまり知らない場合でも、上記最初のコマンドはJPEG形式の画像をPNG形式の画像に変換することを推測できる可能性があります。しかし、より複雑な2番目のコマンドが、平らな2次元のラベルに豊かなテクスチャとシミュレートされた奥行き感のある3次元的な外観を与えることを知っている人はほとんどいません。

ここでは、タスクの完了率を影付きの円柱として表示します。

    Shaded Cylinder

レンダリングの複雑さを考えると、それが単一のコマンドラインによって達成されることに驚くかもしれません。

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を使用する場合の追加のヘルプについては、ImageMagickの使用例を参照してください。

コマンドラインの構成

ImageMagickコマンドラインは、以下で構成されます。

  • 1つ以上の必須入力ファイル名。
  • 0個、1個、または複数の画像設定。
  • 0個、1個、または複数の画像オペレーター。
  • 0個、1個、または複数の画像シーケンスオペレーター。
  • 0個、1個、または複数の画像スタック。
  • 0個または1個の出力画像ファイル名(magickconvertcompositemontagecompareimportconjureで必須)。

コマンドラインの各構成要素の詳細な説明は、以降のセクションで確認できます。

入力ファイル名

ImageMagickは、入力ファイル名の概念を以下に拡張します。

  • ファイル名グロビング
  • 明示的な画像フォーマット
  • 組み込みの画像とパターンを使用する
  • STDIN、STDOUT、およびファイル記述子
  • 画像から特定のフレームを選択する
  • 画像の領域を選択する
  • インライン画像のサイズ変更を強制する
  • インライン画像のトリミングを強制する
  • ファイル名参照を使用する

これらの拡張機能については、次の数段落で説明します。

デフォルトでは、コマンドラインオプションがファイル名でもある場合(例:-quality)、ファイル名として解釈されます。代わりにオプションとして解釈するには、-define registry:option:pedantic=trueを使用します。

ファイル名グロビング

Linuxシェルでは、アスタリスク(*)やクエスチョンマーク(?)などの特定の文字によって、パターンマッチに基づいてファイル名のリストが自動的に生成されます。この機能はグロビングと呼ばれます。ImageMagickは、ネイティブにサポートしていないWindowsなどのシステムに対してファイル名グロビングをサポートしています。たとえば、現在のディレクトリにある1.jpg2.jpg3.jpg4.jpg5.jpgをGIFアニメーションに変換したいとします。このコマンドを使用して、すべてのJPEGファイルに簡単に参照できます。

magick *.jpg images.gif

明示的な画像フォーマット

画像は、よく知られているJPEG、PNG、TIFFなど、無数の画像フォーマットで保存されます。ImageMagickは、画像を読み取って処理する前に、画像のフォーマットを知る必要があります。ほとんどのフォーマットには、フォーマットを一意に識別する画像内の署名があります。それができない場合、ImageMagickはファイル名拡張子を利用してフォーマットを決定します。たとえば、image.jpgまたはimage.JPGは、ImageMagickにJPEGフォーマットの画像を読み込んでいることを伝えます。

場合によっては、画像に署名が含まれていない場合や、ファイル名が画像フォーマットを識別しない場合があります。これらの場合、明示的な画像フォーマットを指定する必要があります。たとえば、画像の名前がimageで、生の赤、緑、青の強度値が含まれているとします。ImageMagickは画像フォーマットを自動的に決定する方法がないため、明示的に設定します。

magick -size 640x480 -depth 8 rgb:image image.png

組み込みの画像とパターン

ImageMagickには、いくつかの組み込み画像パターンがあります。たとえば、チェッカーボードパターンを使用するには、次のようにします。

magick -size 640x480 pattern:checkerboard checkerboard.png

STDIN、STDOUT、およびファイル記述子

LinuxとWindowsでは、1つのコマンドの出力を別のコマンドの入力にパイプできます。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つのコマンドでは、単一の画像が書き込まれていることに注意してください。この場合、画像の種類がMNGであるため、出力はマルチフレームファイルになります。MNGフォーマットは複数のフレームをサポートしているためです。出力フォーマットが単一フレームのみをサポートするJPGであった場合、出力は個別のフレームで構成されます。出力ファイル名に関するセクションで、詳細について説明します。

画像領域の選択

生の画像は、幅、高さ、または画像署名などの追加のメタ情報のない、色の強度シーケンスです。生の画像フォーマットでは、画像の幅と高さを指定する必要がありますが、読み取る画像の領域を指定することもできます。この例では、画像は生の8ビットRGBフォーマットで、幅6000ピクセル、高さ4000ピクセルです。ただし、画像の中央付近の600 x 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.jpgframe002.jpg、およびframe003.jpgの画像を読み取り、GIF画像シーケンスに変換することを期待します。

画像パスに1つ以上のスペースが含まれている場合は、パスを引用符で囲みます。

'my title.jpg'

ImageMagickのコマンドラインオプションの中には、コマンドラインプロセッサの能力を超えるものがあります。例えば、Windowsではコマンドラインの長さが8192文字に制限されています。例えば、ポリゴンの点がコマンドラインの長さ制限を超えるdrawオプションがある場合、drawオプションをファイルに記述し、@を使用してファイルを参照してください(例:@mypoly.txt)。

他の画像ファイルを参照するもう一つの方法は、ファイル名にフォーマット文字を埋め込み、シーン範囲を指定することです。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ユーティリティの動作を制御できます。オプションの動作は、次のいずれかのカテゴリに分類されます。

画像設定

画像設定は、コマンドラインに表示されたとおりに保持され、画像の読み込み、画像オペレータ、または必要に応じて画像の書き込みなどの後続処理に影響を与える可能性があります。画像設定は、リセットされるか、コマンドラインが終了するまで有効です。画像設定には以下が含まれます。

この例では、前述のように設定が保持されるため、-channelは各画像に適用されます。

magick -channel RGB wand.png wizard.png images.png

画像オペレータ

画像オペレータは、設定とは異なり、コマンドラインに表示された時点で画像にすぐに影響を与えます。オペレータとは、画像設定または画像シーケンスオペレータとしてリストされていないコマンドラインオプションです。コマンドラインが終了するまで保持される画像設定とは異なり、オペレータは現在の画像セットに適用され、その後忘れられます。画像オペレータには以下が含まれます。

この例では、-negateはワンド画像を反転しますが、ウィザードは反転しません。

magick wand.png -negate wizard.png images.png

画像オペレータは、画像シーケンス内の各画像に適用されることに注意してください。例えば、-resizeオプションを使用してGIF画像のサイズを変更する場合、各フレームが指定されたサイズに変更されます。ただし、一部のフレームは画像全体よりも小さく、すべてのフレームを同じサイズにリサイズすると、予期しない出力になる可能性があります。そのような場合は、-coalesceを使用して、これらのフレームを準備する必要があります。

画像チャンネルオペレータ

画像チャンネルを直接操作します。

画像シーケンスオペレータ

画像シーケンス演算子は、設定とは異なり、コマンドラインに表示されるとすぐに画像シーケンスに影響を与えます。以下の画像シーケンス演算子から選択してください。

この例では、-append は3つの画像を1つに連結します。

magick mikayla.png picnic.png beach.png -append vacation.png

画像ジオメトリ

多くのコマンドラインオプションは、画像の目的の幅と高さ、その他の寸法量などを指定するためのgeometry引数を取ります。ユーザーは結果として得られる画像の寸法、サイズ、位置に多くのバリエーションを求めるため(そしてImageMagickもそれらを提供したいと考えているため)、geometry引数は多くの形式を取ることができます。このセクションでは、それらの多くについて説明します。

何らかの形式のgeometry引数を取る画像オプションと設定を以下に示します。これらのいくつかは、引数をわずかに異なる方法で解析することに注意してください。詳細については、個々のオプションまたは設定のドキュメントを参照してください。

geometry引数は、以下の表にリストされている形式のいずれかを取ることができます。これらについては、表の後の小節でより詳細に説明します。通常の形式はsize[offset]です。sizeは必須で、offsetはオプションです。場合によっては、[size]offsetも可能です。geometry引数内にスペースを使用することはできません。

サイズ 一般的な説明(実際の動作は、異なるオプションや設定によって異なる場合があります)
スケール% 高さおよび幅を指定された割合でスケーリングします。
scale-x%xscale-y% 高さおよび幅を個別に指定された割合でスケーリングします。(%記号は1つだけで十分です。)
幅が与えられ、アスペクト比を維持するために高さが自動的に選択されます。
xheight 高さが与えられ、アスペクト比を維持するために幅が自動的に選択されます。
widthxheight 高さおよび幅の最大値が与えられ、アスペクト比が維持されます。
widthxheight^ 幅および高さの最小値が与えられ、アスペクト比が維持されます。
widthxheight! 幅と高さが明確に指定され、元の縦横比が無視されます。
widthxheight> 対応するwidthおよび/またはheight引数よりも大きい寸法を持つ画像を縮小します。
widthxheight< 対応するwidthおよび/またはheight引数よりも小さい寸法を持つ画像を拡大します。
面積@ 画像を指定されたピクセル数の面積にサイズ変更します。アスペクト比は維持されます。
x:y ここでxとyはアスペクト比を示します(例:3:2 = 1.5)。
x:y^ 指定されたアスペクト比を実現するために行または列を削除します。
x:y# 指定されたアスペクト比を実現するために行または列を追加します。
{size}{offset} offsetを指定します(デフォルトは+0+0)。以下では、{size}は上記のいずれかの形式を指します。
{size}{+-}x{+-}y ピクセル単位で指定された水平方向と垂直方向のオフセットxy。両方に符号が必要です。オフセットは-gravity設定の影響を受けます。オフセットは%やその他のsize演算子の影響を受けません。正のXとYのオフセットは、'center'を除くすべての-gravityオプションで、画像の中心に向かって内側方向になります。Eastの場合、+Xは左です。Southの場合、+Yは上です。SouthEastの場合、+Xは左で+Yは上です。centerの場合、通常のXとYの方向の規則が使用されます(+Xは右で+Yは下です)。

幅と高さの基本的な調整;演算子%^、および!

以下に、geometryの簡単な例をいくつか示し、-resizeオプションの引数としてどのように使用できるかを示します。入力画像には内部画像logo:を使用します。この素晴らしい画像は、幅640ピクセル、高さ480ピクセルです。そのdimensionsは640x480です。画像の寸法を指定する場合、幅(水平方向の寸法)は常に高さ(垂直方向の寸法)の前にきます。これは、画像への座標またはoffsetsについて話す場合にも当てはまり、常に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%x50200%x50%

デフォルトでは、geometry引数で指定された幅と高さは、パーセンテージが指定されていない限り、最大値です。つまり、画像のアスペクト比(高さの幅に対する比率)を維持しながら、指定された幅と高さの値に合わせて画像が拡大または縮小されます。例えば、上記3番目のコマンドは、寸法を100x200に「設定しよう」とします。元の画像(640x480)を徐々に縮小し、アスペクト比を一定に保ちながら、100x200の長方形にぴったり収まるまで縮小することを想像してください。画像の方が縦長であるため、幅が100ピクセルに縮小されるとぴったり収まります。アスペクト比を維持するには、高さが(480/640)×100ピクセル=75ピクセルになるため、最終的な寸法は100x75になります。

前の例では、指定された寸法の少なくとも1つは達成されます(この場合は幅100ピクセル)。結果として得られる画像は、元の画像の中にぴったり収まります。上記4番目の例のように^演算子を呼び出すことで、これの正反対を行うことができます。100x200^を引数として与えた場合、やはり寸法の少なくとも1つは達成されますが、この場合は結果として得られる画像に元の画像をぴったり収めることができます。ここでは、geometry引数は最小値を与えます。この例では、高さが200になり、幅はアスペクト比を維持するようにスケーリングされ、(640/480)×200ピクセル=267ピクセルになります。^演算子を使用すると、これらの寸法の1つは要求されたサイズと一致しますが、アスペクト比を維持するために、画像が要求された寸法を超える可能性があります。(^機能は、IM 6.3.8-2から新たに追加されました。)

ImageMagickは、お気に入りの写真や画像の歪みを防ぐために、画像のアスペクト比を維持することに非常に優れています。しかし、寸法を100x200にすることを本当に望んでいるかもしれません。この場合は、ジオメトリに感嘆符演算子を追加することで、ImageMagickに本当にそのつもりであることを伝えましょう。これにより、画像のサイズが正確に指定したサイズになります。そのため、例えば100x200!を指定すると、寸法は正確に100x200になります(小さな縦長のウィザードが作成されます)。

幅、高さ、面積の境界;演算子><、および@

さらにいくつかの例を示します。

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つだけ指定されている場合、それは幅とみなされます。上記最初の例のように幅のみが指定されている場合、幅は指定されたとおりに受け入れられ、入力画像のアスペクト比を維持するために高さが選択されます。同様に、上記2番目の例のように高さのみが指定されている場合、高さは受け入れられ、アスペクト比を維持するために幅が選択されます。

>を使用して、画像の寸法が対応するwidthおよび/またはheight引数よりも大きい場合にのみ画像を縮小します。<を使用して、画像の寸法が対応するwidthおよび/またはheight引数よりも小さい場合にのみ画像を拡大します。いずれの場合も、変更が行われた場合、結果は>または<演算子が存在しない場合と同じです。そのため、上記3番目の例では100x200>を指定し、元の画像サイズは640x480であるため、100x200を指定した場合と同じように画像サイズが縮小されます。ただし、上記4番目の例では、サイズに変更はありません。

最後に、@を使用して、アスペクト比を維持しようとする際に、画像のピクセルの最大面積を指定します。(ピクセルは整数値のみを取るため、常に何らかの近似が行われます。)次の例では、10000ピクセルの面積が要求されています。結果として得られるファイルの寸法は115x86で、9890ピクセルです。

magick logo: -resize '10000@' wiz10000.png

上記の例および以下の例では、すべてgeometry引数を引用符で囲んでいます。多くの場合、これはオプションですが、必ずしもそうではありません。シェルによってファイルのリダイレクトとして解釈されるのを防ぐために、<または>を使用する場合は、ジオメトリ仕様を引用符で囲む必要があります。Windowsシステムでは、キャレット^は引用符で囲む必要があります。そうでないと無視されます。安全のため、ここでは行っているように、すべてのgeometry引数を引用符で囲う習慣を身につけるのが良いでしょう。

ジオメトリのオフセット

geometry引数におけるオフセットの使用を示すいくつかの例を次に示します。オフセットの一般的な用途の1つは、-regionオプションと併用することです。このオプションを使用すると、画像の指定された長方形のサブ領域内のピクセルを変更する多くの他のオプションを使用できます。そのため、その領域の幅と高さを指定する必要があり、また、画像へのオフセットも必要です。これは、画像内の領域の位置を示す座標のペアです。最初の例では、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

オフセットには常に+/-記号が必要です。オフセットは実際には画像内の真の位置ではありません。その座標は、他の場所に追加する必要があります。それを現在位置と呼びましょう。ただし、上記の最初の2つの例では、その位置は画像の左上隅であり、座標(0,0)です。(他の指示がそれを変更するように指示されていない場合のデフォルトの状態です。)上記の最初の例では、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)です。

画像スタック

学校では、先生は多分、メモ用紙で問題に取り組み、その結果をテスト用紙に写すことを許可していたでしょう。画像スタックも同様です。画像または画像シーケンスを独立して処理し、その結果を後でコマンドラインに導入できます。画像スタックは括弧で区切られます。画像演算子は、現在のスタック内の画像のみに影響します。たとえば、画像の回転をウィザード画像のみに制限することができます。

magick wand.gif \( wizard.gif -rotate 30 \) +append images.gif

括弧の前にバックスラッシュを付けることでエスケープされていることに再び注意してください。これは、括弧が特別なシェル文字であるLinuxで必要です。バックスラッシュは、シェルがこれらの文字を解釈せず、実行中のコマンドに直接渡すように指示します。Windowsでは括弧をエスケープしないでください。各括弧(またはエスケープされた括弧)の前後には、上記の例のようにスペースが必要です。

すでに説明した画像演算子に加えて、次の画像演算子は、画像スタック内の画像を処理する場合に最も役立ちます。

これらの演算子の引数は、最初の画像を0から始まる番号で、画像シーケンスへのインデックスです。ただし、負のインデックスを指定すると、画像は最後からインデックス付けされます(最後に追加された画像)。つまり、インデックス-1は現在の画像シーケンスの最後の画像であり、-2は最後から2番目の画像です。

出力ファイル名

ImageMagickは、出力ファイル名の概念を次のように拡張します。

  1. 明示的な画像フォーマット
  2. 標準出力への書き込み
  3. ファイル名参照

これらの拡張機能は、次の数段落で説明します。

出力ファイル名ではなく、-exitを使用して、画像の書き込みを完全に防止します。

明示的な画像フォーマット

画像は、よく知られているJPEG、PNG、TIFFなどを含む無数の画像形式で保存できます。ImageMagickは、画像が書き込まれる前に、目的の形式を知る必要があります。ImageMagickは、ファイル名拡張子を利用して形式を決定します。たとえば、image.jpgは、ImageMagickにJPEG形式で画像を書き込むように指示します。場合によっては、ファイル名が画像形式を識別しません。これらの場合、明示的な画像形式が指定されていない限り、画像は元の読み取り形式で書き込まれます。たとえば、画像をimageというファイル名で生の赤、緑、青の強度形式で書き込みたいとします。

magick image.jpg rgb:image

標準出力

Linuxでは、1つのコマンドの出力を別のコマンドにパイプできます。ImageMagickでは、ファイル名-を使用して、1つのコマンドを別のコマンドにパイプできます。この例では、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:-