⚠️ これは 非公式の翻訳サイトです。ImageMagick Studio LLC とは無関係です。正確な情報は 原文(https://usage.imagemagick.org/basics/index.html) を参照してください。

ImageMagick 使用例 -- 基本的な使い方

ここでは、IM が従うコマンドライン処理の詳細、いくつかの新しい画像処理機能、その考え方・哲学・方法論、そして内部で実際に何が起きているのかを説明します。この背景知識があれば、これ以降の使用例ページがずっと分かりやすくなります。仮にアプリケーションプログラミングインターフェース(API)しか使わない場合でも、この節は知っておき、理解しておく価値が十分にあります。


ImageMagick のコマンドライン処理

なぜコマンドラインのスタイルが変わったのか! あるいは…

旧バージョンの IM が抱えていた問題

IM の以前のメジャーバージョン(バージョン 5.5.7 以前)では、IM ライブラリへのコマンドラインインターフェースは、操作が実行される順序に関する問題を起こしがちでした。それは非常に行き当たりばったりで、実際に何が起きているのかを理解しようとする人を混乱させるものでした。また、あるときうまく動いた順序が、別のときには同じようには動かないこともあり、IM の作者は、人々が期待するとおりに動かそうとインターフェースと絶えず格闘していました。問題の原因は、ImageMagick がごく標準的な UNIX のコマンドラインスタイルに従っていたことにありました…

**command  [options]  input_image   output_image**

時が経つにつれ、これは問題を生み出し始めました。画像は複雑なオブジェクトであり、しばしば他の画像も巻き込みながら、膨大な数の操作を施すことができるからです。その結果、上記の形式は徐々に拡張され、次のようになっていきました…

**command  [options] image1 [options] image2 [options]  output_image**

これは機能し、バージョン 5.5.7 で使われていた基本的なスタイルでした。「[-negate](https://imagemagick.org/command-line-options/#negate)」、「[-resize](https://imagemagick.org/command-line-options/#resize)」、「[-crop](https://imagemagick.org/command-line-options/#crop)」などのさまざまな画像操作は、それが適用される画像の前と後のどちらに置いても構いませんでした。たとえばバージョン 5.5.7 では、次の 2 つのコマンドはどちらも有効で、同じことを行いました。

  magick -negate  image.gif   output.gif

  magick  image.gif  -negate  output.gif

問題は、2 つの画像処理操作を扱う場合にどうなるか、ということでした! たとえば…

  magick -size 40x20 xc:red  xc:blue \
          -append   -rotate 90    append_rotate.gif

[IM Output] その結果(IM v5.5.7 では)、2 つの入力画像がまず回転され、その後に連結され、次のような画像が生成されました… つまり「[-rotate](https://imagemagick.org/command-line-options/#rotate)」演算子が「[-append](https://imagemagick.org/command-line-options/#append)」より先に適用されてしまい、これはおそらくユーザーの意図したものではありませんでした。
ImageMagick バージョン 6 では、演算子は常にユーザーが与えたコマンドラインの順序どおりに適用されます。
[IM Output] したがって、前述の例は IMv7 では次のようになります。2 つの画像が まず 連結され、その結果が回転されて、これが生成されます…
もしユーザーが本当に連結より先に回転を行いたいのであれば、IM v6 にその順序で実行するよう明示的に指示できます。

  magick -size 40x20 xc:red  xc:blue \
          -rotate 90  -append    append_rotate_bad.gif

このような細やかな制御は、以前のバージョンの IM ではとうてい及ばないもので、おそらくパイプラインや中間画像の保存が必要だったでしょう。この問題の解決には、残念ながら抜本的な手段といくらかの非互換性が必要でした。一方で、IM バージョン 5 で動いていた「単純な」コマンドのほぼすべては、IM バージョン 6 でも期待どおりに動作します。要するに、バージョン 6 より前のコマンドライン使用法は、定義が曖昧で、私の考えでは壊れており、数多くの奇妙で予期しない結果を生み出していたのです。

IMv7 のコマンド構文

少なくとも 1 枚の画像が読み込まれるか作成されるよりも前に、いかなる「操作」も与えてはならない点に注意してください。実のところ、「画像の読み込み/作成」もまた 1 つの操作だと考えてもよいでしょう。結局のところそれは画像処理操作であり、ファイル中の画像をメモリ中の画像へ翻訳する操作なのですから。したがって IMv7 でこれを正しく行う方法は、画像を読み込み、処理し、最後に最終的な「暗黙の書き込み」引数を使って結果を書き出すことです。つまり…

**command  "image" { -operation }... "output_image"**

もちろん、画像の読み込みを制御するために、実際に画像を読み込む前に与える必要のある設定もいくつかあります(設定の意味については後述)。したがって IMv7 構文 は基本的に次のとおりになります…

**command { [settings] [operation] }...  "implict_write"**

{...}」の部分は、必要なだけ多くの「読み込み」や「操作」で繰り返されます。そして「[operation]」は、画像の読み込みまたは作成か、あるいは実際に「何かを行う」画像処理操作のいずれかです。これらを、画像を処理したい順序どおりに正確に並べます。

オプションの種類 —— 演算子と設定…

以下の要約は、ImageMagick ウェブサイトコマンドラインの解剖学からも参照できるようになりました。すべてのコマンドラインオプションは、2 つの基本グループ「設定(settings)」と「画像演算子(image operators)」のいずれかに分類されます。設定は値を設定し、演算子は実際に何らかのアクションを実行します。 設定オプション

| 情報を保存するだけのコマンドラインオプションで、保存された情報は後で他の「画像演算子」によって使われます。つまり、何らかの値を設定して後で使えるようにする以外には何もしません。多くのオプションには「-」スタイルと「+」スタイルの両方があります。後者は一般に、設定を無効にしたり、通常のデフォルト状態にリセットしたりするために使われます。これにより、ある設定の効果を素早く簡単に取り除けます。たとえば「[+gravity](https://imagemagick.org/command-line-options/#gravity)」は gravity 設定を初期状態の「gravity none」に戻します。設定はさらにいくつかのサブカテゴリに分けられます… 演算子設定(Operator Settings) は、後続の演算子がどのように機能するかを制御します。演算子が使う色やフォントを設定し、画像やテキストの配置を制御し、ソース画像からの色の参照、より複雑な演算子の一部による処理方法の制御など、多くを担います。

-dither -gravity -fill -background -bordercolor -stroke -font -pointsize -strokewidth -box -virtual-pixel -interpolate

ほとんどの設定オプションはこのカテゴリに属します。 入力設定(Input Settings) は、作成または読み込みされる画像の生成を制御することに特化しています。一般的には、その設定が定義された後に作成または読み込みされる画像に関連付けるべき特定のメタデータを、割り当てたり上書きしたりするために使われます。それらの画像は外部ファイルから作成または読み込みされます。

-label -delay -dispose -page -comment -size

これらは画像が作成または読み込みされるときにのみ適用され、それ以外では完全に無視される点に注意してください。特別な演算子「[-set](https://imagemagick.org/command-line-options/#set)」は、画像がメモリに読み込まれた後、あるいは何らかの処理を施された後に、画像のメタデータを変更するために用意されています。詳細は下記のメタデータを参照してください。 出力設定(Output Settings) は、画像をディスクへ書き戻す(保存する)ときにのみ使われます。コマンドラインのどこに与えても構いませんが、画像が書き込まれるとき —— デフォルトの最後の画像ファイル名引数による操作、あるいは「[-write](https://imagemagick.org/command-line-options/#write)」や「[-identify](https://imagemagick.org/command-line-options/#identify)」操作によって —— にのみ適用されます。

-quality -loop -compression -format -path -transparent-color

設定されていない場合、あるいはプラス「+」形式で無効化された場合は、適切なデフォルトが使われます。一般にこのデフォルトは、最後に読み込まれた画像から保存された値です。現在の「[-background](https://imagemagick.org/command-line-options/#background)」色のようないくつかの「演算子設定」も、ファイル形式が必要とする場合には画像に割り当てられます。 制御・デバッグ設定(Control & Debugging Settings) は、IM が全体としてどのようにタスクを実行するかを制御します。これには次のものが含まれます…

-verbose -debug -warnings -quiet -monitor -regard-warnings

これらの特別な設定の詳細については、下記のIM 操作制御を参照してください。

画像演算子
| 画像を何らかの方法で変更するコマンドライン引数です。これらは見つかった その場で即座に 実行され、それ以前にコマンドラインで与えられた「設定オプション」を利用することがあります。これらの演算子はいくつかのサブカテゴリにまとめられます… 画像生成演算子(Image Creation Operators) は、ファイルやパイプラインから画像を読み込んだり、新しい画像を生成したりします。これには次のものが含まれます…

image.png xc: canvas: logo: rose: gradient: radial-gradient: plasma: tile: pattern: label: caption: text:

これらも「演算子」であるため、コマンドラインで見つかった時点で即座に実行されます。すでにメモリにある画像に新しい画像を追加するだけで、それ以前に読み込まれた画像には触れません。もちろん演算子であるため、それ以前に定義された「設定」が適用されます。特に、ファイルやファイルストリームからの入力を制御するために使われる入力設定です。たとえば、作成したい画像のサイズをヒントとして与える「[-size](https://imagemagick.org/command-line-options/#size)」や、「[-delay](https://imagemagick.org/command-line-options/#delay)」や「[-page](https://imagemagick.org/command-line-options/#page)」のような画像メタデータを定義または上書きする設定です。 単純画像処理演算子(Simple Image Processing Operators) は、すでにメモリに読み込まれているすべての画像を変更します。各画像は他のどの画像とも別々に変更されます。これには次のような操作が含まれます…

`-crop -repage -border -frame -trim -chop -draw -annotate -resize -scale -sample -thumbnail -magnify -adaptive-resize -liquid-resize -distort -morpohology -sparse-color -rotate -swirl -implode -wave -flip -flop -transpose -transverse -blur -gaussian-blur -convolve -shadow --radial-blur -motion-blur -sharpen -unsharp -adaptive-sharpen -adaptive-blur -noise -despeckle -median -negate -level -level-color -gamma -auto-level -auto-gamma -sigmoidial-contrast -normalize -linear-stretch -contrast-stretch -colorize -tint -modulate -contrast -equalize -sepia-tone -solarize -recolor -opaque -transparent -colors -map -ordered-dither -random-dither -raise -paint -sketch -charcoal -edge -vignette -emboss -shade -poloroid -encipher -decipher -stegano -evaluate -function -alpha -colorspace -separate

そしておそらく、私が見落とした(あるいは追加された)他の多くの演算子!`

すべての画像演算子はコマンドラインで見つかった時点で即座に実行されるため、それらを適用する対象の画像が メモリに読み込まれた後に 与えなければなりません。複数の画像が存在する場合、すべての 画像が順番に 1 枚ずつ操作されます。したがって、現在の画像リストにどの画像があるのかに注意する必要があります。これらの演算子の一部は複数の画像を生成し得る点にも注意してください。たとえば「[-crop](https://imagemagick.org/command-line-options/#crop)」は複数の「タイル」画像を生成しうるし、「[-separate](https://imagemagick.org/command-line-options/#separate)」は画像を個別のチャンネル画像へ分割します。その結果、メモリ中の画像が増えることがあります。しかしそれらはすべて、入力として一度に 1 枚の画像だけを受け取ります。多くの API は、与えられた画像リストの最初の画像にのみ、同等の操作を適用する点に注意してください。つまり、各画像をループ処理しないことがあります。一方、「magick」やその他の CLI(コマンドラインインターフェース)コマンドは、現在の画像リストの各画像に順番に演算子を適用します。 複数画像リスト演算子(Multi-Image List Operators) は、現在の画像リスト全体を 1 つの実体として変更する点で特別です。リスト全体を 1 枚の合成画像に置き換えたり、前後にある他の画像に応じて各画像を変更したりすることがあります。これらはアルファ合成、アニメーション処理、カラーチャンネル処理などに使われます…

-append -flatten -mosaic -layers -composite -combine -fx -coalesce -clut -evaluate-sequence mean -evaluate-sequence

リスト全体が 1 つの実体として扱われ、画像の一部が削除されたり置き換えられたりすることがある点を覚えておいてください。上記の演算子のほとんどは、与えられた複数の画像をすべて最終的な 1 枚の画像にマージします。レイヤー合成(Layers Composite)メソッドは現在、現在の画像リストを 2 つの完全に別々の画像リストへ分割してから、それらをマージして全く新しい画像リストを形成する唯一の演算子です。分割は、現在の画像リストのどこかにある特別な「null:」画像を探すことによって行われます。これらの演算子はいずれも「[mogrify](#mogrify)」コマンドでは使えません。なぜなら、このコマンドは(末尾で与えられた)入力画像のリストを個別の画像として処理するからです。 画像スタック演算子(Image Stack Operators) は、現在メモリにある画像リストの並び順に作用します。具体的には、画像を「脇に置いて」処理する特別な機能を提供します。これらは多くの点で前述の画像リスト演算子に似ていますが、画像そのものを変更することはなく、メモリ上での画像の並べ方だけを変更します。

( ) -delete -insert -swap -reverse -duplicate -clone

丸括弧「(」と「)」は、コマンドラインシェルインターフェース(CLI)によって特別な意味を与えられないよう、バックスラッシュでエスケープするか引用符で囲む必要がある場合がある点に注意してください。これらの演算子はいずれも「[mogrify](#mogrify)」コマンドでは使えません。なぜなら、このコマンドは(末尾で与えられた)入力画像のリストを個別の画像として処理するからです。 その他の特殊演算子(Miscellaneous Special Operators) は、(上記と比べて)通常とは異なる、あるいは非標準的な方法で何かを行う演算子です。

-geometry -version -list -bench -concurrent -preview

[-geometry](https://imagemagick.org/command-line-options/#geometry)」演算子は特別で、画像リストのすべての画像に何らかの作用を及ぼすのではなく、画像リスト中の 1 枚(最後の画像)だけに作用する唯一の演算子です。これは後方互換性と特殊なアルファ合成の要件のためにのみ提供されています。詳細はジオメトリ、最後の画像だけをリサイズを参照してください。他の 2 つ「[-version](https://imagemagick.org/command-line-options/#version)」と「[-list](https://imagemagick.org/command-line-options/#list)」は情報を生成する演算子で、要求された情報を返した後に IM を明示的に終了させます。これらのオプションの詳細については、下記のIM 特殊制御を参照してください。中には、コマンド全体を複数回実行させてしまうオプションさえあります。基本的にこれらは、何か奇妙で珍しい方法で特別に扱われます。一般に、これらは特殊な状況や、特定のグローバル情報を取得するためにしか使われません。
オプションを設定と演算子に分離することが明確であってほしいと思います。これは、IM が今どのように動作するのかにとって極めて重要だからです。バージョン 6 の ImageMagick では、次のことを覚えておいてください…

設定は後で使うために何らかの形で 保存 され、
一方、演算子は画像に対して 即座に 適用される。

これが、バージョン 6 を以前のすべての IM バージョンと異なるものにしている点です。すべてのオプションは「設定」か「演算子」のいずれかとして定義されており、その順序によって、オプションがいつ、どの画像に適用されるかが正確に決まります。何が「設定」で何が「演算子」かを識別するには、IM 使用例 オプションリファレンスが利用できます。

IM コマンドの実例

ある例を取り上げ、それが IM バージョン 6 によってどのように処理されるか見てみましょう。 |

  magick eye.gif news.gif -append    storm.gif tree.gif \
           -background skyblue +append    result.gif

[IM Output]
これを分解して、IM v6 が何をするか見てみましょう… 引数 | | 実行されるアクション | 画像
---|---|---|---


magick | 初期化し、空の「画像リスト」を作成する | 空のシーケンス
eye.gif | 画像を読み込み、現在の画像リストの末尾に追加する | 1 画像
news.gif | 2 枚目の画像をリストに追加する(これで 2 枚) | 2 画像
-append | 現在のリストにあるすべての画像を取り、垂直方向に連結する。
すべての画像が単一の画像に置き換えられる。 | 1(マージ済み)
storm.gif | さらに別の画像を画像リストに追加する | 2
tree.gif | さらにもう 1 枚 | 3
-background skyblue | 後で使う「背景色」を設定する。
どの画像にも変更は加えられない。 | 3
+append | リスト中の 3 枚の画像を水平方向に連結する
空いた領域を埋めるために現在の背景色が使われる | 1(マージ済み)
result.gif | これが最後の引数なので、この引数を使って暗黙の -write 操作が実行される。現在のリストにある単一の画像が、与えられたファイル名を使って書き込まれ、これにより使用する画像ファイル形式も決まる。 | 書き込み済み
ご覧のとおり、ImageMagick バージョン 6 におけるコマンドラインの処理は非常に分かりやすく論理的で、結果が予測可能になっています。そして、それこそが要点です…

レガシーなコマンドラインスタイル

世の中に出回っている非常に古い IM スクリプトの多くが、単一の画像演算子を次のような形式で使っているという事実があります…

**command  -operator  input_image   output_image**

つまり、演算子を適用する対象の画像を実際に読み込む前に、画像演算子を指定しているのです。このレガシーな状況に対応するため、IM は見つけたすべての画像演算子をため込んでおき、最終的にコマンドラインで最初の画像が見つかったときに、それらを最初の画像へ適用します。つまり、上記は次のように IMv7 流に書いたかのように動作します…

**command  input_image   -operator  output_image**

たとえば、この IMv5 レガシー(UNIX オプション処理)コマンド… |

  magick -flip  storm.gif   cmd_flip_legacy.gif

[IM Output]
これは、次の IM バージョン 6 コマンドと同じ結果を生み出します… |

  magick storm.gif -flip  cmd_flip_postfix.gif

[IM Output]
レガシーなコマンドラインスタイルは機能しますが、IM バージョン 5 を悩ませたのと同じ問題を抱えています(上記のなぜコマンドラインのスタイルが変わったのかを参照)。すべての設定は最初の読み込みより前に適用され、すべての演算子は最初の画像が読み込まれたとき(しかも最初の画像にのみ)実行されるよう、ただため込まれます。また、複数の演算子の順序が、与えた順序と同じになる保証もありません。とはいえ、おそらくその順序で適用されるでしょう。さらに、演算子は最初の画像が実際に読み込まれるまでため込まれるため、画像を読み込む前にコマンドを複数回繰り返すと、先のコマンドのいくつかが「消えて」しまうことがあります。これはバグではなく、IM のレガシー機能の誤用です。このスタイルのコマンドラインはレガシーサポートのためだけのものであり、したがって非推奨なので、可能な限り避けるべきです。この古いスタイルを含むスクリプトは、適用したい演算子の前に画像の読み込みを行うよう更新すべきです。 | レガシーサポートは IM バージョン 7 にも引き継がれ、これにはコマンドラインのシングルパス処理を可能にするコマンドが含まれます。これにより、スクリプトファイル、さらにはパイプラインからも画像処理オプションを実際に読み取れるようになります。しかし、シングルパス処理の技術では、演算子を適用する画像を読み込む _前に 演算子を保存しておくことはできません。実際、メモリに画像がない状態で演算子を使おうとすると、「magick」コマンドは「画像なし(no image)」型のエラーを生成します。_
---|---

コマンドライン対 API

コマンドライン版の IM と、PerlMagick、RMagick、PHP IMagick、MagickWand といった Magick API を使う場合とでは、いくつかの大きな違いがあります。

アクティブな画像リストは 1 つだけ
コマンドラインには、いかなる瞬間にも作業対象とできる画像リストが常に 1 つしかありません。画像リストを一時的に「プッシュ」したり保存したりすることはできます(丸括弧MPR: 名前付きメモリレジスタを参照)。最後に「プッシュ」したリストから画像を「クローン」(効率的なコピーを作成)することさえできます。しかし、2 つのそうしたリストを同時に作業対象とすることは本当の意味ではできません。一方、他言語の API では、好きなだけ多くの別々の画像リスト、すなわち「ワンド(wand)」を持てます。実際、より良い処理のために、各画像を別々のワンド(画像リストと設定)として保存しておき、必要に応じて、あるいは最終ステップの一部として、画像をリストにマージするのが一般的です。任意の順序で作業することもでき、ソートや後の比較のためにデータベースや他のデータ構造へ格納することもできます。一方、コマンドラインでは、単一の画像リストしかないため、操作を任意の順序で行うことはできず、一般的にはより論理的な順序で物事を進めようとし、各画像処理ステップをそのつど完全に終わらせていきます。要するに、あるセットの操作結果を使って、次にどのセットの処理操作を行うべきかを選択したり変更したりするために「後戻り」したり「後から何かを変更」したりするのが、はるかに難しいということです。とりわけ、2 つの完全に別々の画像リストをマージしたり、交互に織り交ぜたり(シャッフルしたり)して論理的な 1 つにまとめるのは、いっそう困難です。しかし、コマンドラインからこれを行えるようにする技術もいくつか編み出されています。たとえば画像リストの多層アルファ合成を参照してください。
ピクセルデータへの直接アクセス
ここでも、コマンドラインから何らかの数値処理やピクセルデータのマージを行うことはできますが、コマンドラインインターフェースを使って属性を調べたり、特定のピクセルや領域を読み取って変更したりするのは簡単ではありません。特別な FX 画像演算子を使えば、画像のピクセルデータをマージしたり数学的に変更したりできますが、一般に画像全体を変換することに限られ、しかも非常に非常に遅いです。これを容易にするため、ユーザーが FX 演算子を使って開発した多くの一般的な操作が、今では IM に組み込まれ、カラールックアップテーブルEvaluate 数学関数多引数関数といったものが作られました。さらに、汎用画像歪み演算子や、いくつかの特殊な画像合成メソッドも作られました。API は画像をはるかに直接的な方法で操作でき、API 言語が提供するフルスピードで、独自の操作をはるかに簡単に自作できます。
条件付き処理
IM のコマンドラインインターフェースでは、画像から導出した何らかの属性に基づいて画像を変更するのは簡単ではありません。たとえば、画像が明るい背景を使っているか暗い背景を使っているかによって、画像を異なる方法で処理するのは非常に困難です。確かに、FX 画像演算子を使えば、限定的かつ特定の条件付きアクションを行えますし、特定の条件に基づいて画像の向き(オリエンテーション)を IM に調整(回転)させたり、画像のリサイズ時に縮小のみ行い決して拡大しないようにしたりもできます。しかし、これらはよく知られた一般的な処理条件を扱っているにすぎません。条件付き処理を行う真に実用的な唯一の方法は、別々のコマンドと一時ファイルを使うことです。この例については、よくコメントの付いたJigsaw スクリプトを参照してください。一方、API は、関係するすべての画像をメモリに保持したまま、必要なときに特定の条件に基づいて処理を継続できる状態で、この種の条件付き処理を行えます。
ループ処理
また、制御された方法で画像を単純にループ処理したり、シーケンス中のどの画像が処理されているかに基づいて処理を簡単に変更したりすることもできません。つまり、画像の「シーン」番号や、それ以前の画像の結果に基づいて、各画像に異なることを単純に行うことはできません。たとえば、異なるサイズでテキストを描いたり、画像を徐々にぼかしたり、1 つのコマンドだけでアニメーションリストを生成したりすることはできません。確かに、画像リスト中の特定の画像を変更することはできます。たとえばアニメーションのフレーム単位の変更を参照してください。しかしそのためには、画像リストに何枚の画像があるかを知っておき、ループを「展開(un-roll)」してリスト中の各画像を別々に処理しなければなりません。コマンドラインから画像をループ処理する真に実用的な唯一の方法は、個々の画像を別々の画像ファイルとして書き出し(複数画像の書き込みを参照)、外部のスクリプト化されたループで 1 枚ずつ処理することです。たとえば画像を垂直方向に分割するよう設計されたシェルスクリプトを参照してください。あるいは、シェルスクリプトのループを使って画像を生成し、その結果を最終コマンドへパイプして、最終的な画像や画像シーケンスにマージすることもできます。この例についてはレイヤー画像の使用例や、各種のワープ画像アニメーションのシェルスクリプトジェネレータを参照してください。一方、API は、単一の画像リストであれ、複数の画像リストであれ、さらには画像リストの配列やデータ構造全体であれ、複数画像のループ処理に何の問題もありません。パイプライン処理や一時ファイルを使わずに、最終的な合成ステップに備えて、すべての画像をメモリに保持しておくこともできます。

アプリケーションがこれらのいずれかを行える必要がある場合(実際にここまで必要とするアプリケーションはほとんどありませんが)、API のほうが良い選択かもしれません。「[magick conjure](#conjure)」プログラム(後述)は、もともと複数の画像リストの利用を可能にし、ImageMagick のよりスクリプト化された利用を可能にするために設計されました。IM v7 の「magick」になされた改良により、この実験的な API は使われなくなりつつありますが、依然として利用可能で、開発も続いています。

引数の扱い

コマンドライン上のファイル名やオプションを別にすれば、使われるオプション引数の基本的なスタイルはわずかしかありません。

  • 定数名(特定の設定やメソッドの種類向け)
  • 定数名のリスト(たとえば 2 つの色、あるいはチャンネル)
  • ジオメトリ引数(フラグ付きの特別な書式の数値リスト)
  • 浮動小数点リスト(パーセントエスケープを伴うこともある)
  • 自由形式のテキスト文字列(パーセントエスケープを伴う)

定数名

定数名は、あるオプションが使える許可された設定の内部ライブラリを参照するために使われる、特定の文字列定数です。たとえば、「[-gravity](https://imagemagick.org/command-line-options/#gravity)」設定は、9 種類の異なる設定のいずれかを取れます。いったん設定されると、その設定は、コマンドラインでその設定より後に続くすべての画像処理演算子によって使われます。たとえば、「North」、「East」、「NorthEast」といった設定です。有効なすべての設定の一覧は、リスト操作オプション(後述)を使って取得できます。たとえば次のコマンドを使うと…

  magick -list gravity

許可されているのはそれらの特定の設定だけであり、別の設定を使おうとするとエラーになります。たとえば…

  magick xc: -gravity Invalid   null:

[IM Text]

設定はさまざまな方法で指定でき、そのいずれもが完全に有効です。IM はこの点について非常に寛容です。たとえば、設定は大文字、小文字、あるいはその任意の組み合わせで指定できます。(「[-list](https://imagemagick.org/command-line-options/#list)」出力で大文字によって示される)個々の単語には、余分なスペース、ハイフン、アンダースコアを含められ、それらは単純に無視されます(ただし単語と単語の間に限ります)。したがって、「North East」の「[-gravity](https://imagemagick.org/command-line-options/#gravity)」を設定するには、次の引数のすべてが有効です…

'`NorthEast`''`northeast`''`NORTHEAST`''`NorTheAst`''`north east`''`north-EAST`''`NORTH_EAST`''` North East `''`___North___East___`'

しかし、「Nor The Ast」という引数は、文字がすべて正しくても、設定として宣言された単語の内部にスペースを使っているため、有効ではありません。これらの定数名は設定だけのためのものではなく、「[-layers](https://imagemagick.org/command-line-options/#layers)」、「[-distort](https://imagemagick.org/command-line-options/#distort)」、「[-morphology](https://imagemagick.org/command-line-options/#morphology)」といった、より複雑な画像処理演算子で使う操作メソッドを宣言するためにも使われます。定数名の一部は外部の設定ファイルから読み込まれます。たとえば、「[-fill](https://imagemagick.org/command-line-options/#fill)」、「[-stroke](https://imagemagick.org/command-line-options/#stroke)」、「[-background](https://imagemagick.org/command-line-options/#background)」、「[-mattecolor](https://imagemagick.org/command-line-options/#mattecolor)」向けの色名です。あるいは、「[-ordered-dither](https://imagemagick.org/command-line-options/#ordered-dither)」で使われる特別な「しきい値」マップです。ここでも「[-list](https://imagemagick.org/command-line-options/#list)」を使って、現在インストールされているバージョンの IM がどの名前を知っているかを調べられます。

定数名のリスト

これはあまり使われない引数で、色による Level 調整のように、1 つまたは 2 つの色を必要とする設定で最もよく使われます。「[-level-colors](https://imagemagick.org/command-line-options/#level-color)」オプションは、次のいずれの引数スタイルも取れます。

color color1,color2 color1-color2

これは画像の選択、すなわち複数の画像インデックスを使う操作、たとえばDuplicateCloneにも使われます。インデックスは最初の画像を 0 として始まり、負のインデックスを使うと画像リストの末尾からのインデックスを表せます。たとえば「-2-1」は、後ろから 2 番目の画像(インデックス「-2」)から、2 番目の画像(インデックス「1」)までを取る、という意味です。そして、これは実際には画像を指定とは逆の順序で取ることを意味します! このオプションを多用するもう 1 つの例がチャンネル選択で、ここでは具体的に名前を付けたチャンネルのリストを指定できます。たとえば「Red,Green,Blue,Black,Alpha」です。ただしチャンネル設定は、1 文字ずつの文字列(例:「RGBA」)を使った短縮記法も使えます。

ジオメトリ引数

これは最も一般的な形式のオプション引数で、通常、各種操作のサイズ、矩形、オフセットを指定するために使われます。しかし、1 個から 5 個の数値のリストを必要とする任意のオプションでも、それが整数であれ浮動小数点であれ使われます。たとえば、「[-crop](https://imagemagick.org/command-line-options/#crop)」や「[-resize](https://imagemagick.org/command-line-options/#resize)」のようなオプションはジオメトリ引数の完全な構文を使う一方、「[-border](https://imagemagick.org/command-line-options/#border)」、「[-level](https://imagemagick.org/command-line-options/#level)」、「[-gamma](https://imagemagick.org/command-line-options/#gamma)」のような他のオプションは、完全なジオメトリ構文のごく一部しか使わないこともあります。この種の引数は非常に一般的なので、そうした文字列引数を数値とフラグへ解析する特別な(そして複雑な)パーサーが書かれており、ジオメトリ引数を必要とする任意の演算子が利用できるようになっています。ジオメトリ引数は基本的に、最大 5 個の浮動小数点値(ただしほとんどの演算子は整数しか使いません)を含む単一の文字列引数を、ユーザーが指定できるようにするものです。次に挙げる文字列形式のすべてが、ジオメトリ引数パーサーによって理解されます…

WxH+X+Y WxH +X+Y A A/B/C A,B,C,D,E

ユーザーは、これらのどの形式でも小さな数値リストを指定できますが、通常どの形式を使うかは、その引数が使われる操作によって決まります。最初の数個は通常、特定のサイズと位置を持つ矩形の指定や、何らかの目的のための単なるオフセットに使われます。オフセットは常に異なる数値、すなわち文字列中の「x」を挟んだ両側の数値として解読されます。つまり、「+X+Y」は常に 3 番目と 4 番目の数値として解読され、その際 1 番目と 2 番目は未定義(またはゼロ)であることを示すフラグが立ちます。最後の数個の形式は最大 5 個の入力値を許可し、通常、標準的な RGBKA 画像チャンネルそれぞれの値を指定するために使われます。これらの数値に加えて、パーサーは特別な「フラグ」文字(「%」、「^」、「!」、「<」、「>」のいずれか)が存在するかどうかも報告します。ただしパーサーは、その文字が存在するかどうかを報告するだけです。それが引数のどこにあったかは報告しません。たとえば IM は「%」が特定の数値に付いていたことを記憶しません。それが複数回現れたかどうかも報告しません。これはつまり、ジオメトリ引数「%50」は「50%」と全く同じ意味になることを意味します(ただし可読性のためには後者が好まれます)。また、「50%x30」はおそらく実際には「50%x30%」を意味するのであって、思うかもしれないような「画像幅の 50% かつ高さ 30 ピクセル」ではありません。 | _ジオメトリ引数は特別な「%」フラグを含めるため、現在のところパーセントエスケープを使って、画像属性に基づいてその値を設定することはできません。

パーセントエスケープがいつ展開されるかについては、ジオメトリ引数に関するこの問題を修正しうる将来の提案があります。そしてうまくいけば IMv7 の一部になるでしょう。

_
---|---

浮動小数点リスト

5 個を超える浮動小数点数が必要な場合、あるいは値の個数すら不明な場合は、浮動小数点リスト 引数が使われます。ただし現時点では、これらは一般に個々のオプションによって解析されており、オプションごとにわずかに異なることがあります。一般に、これらはカンマまたはスペースで区切られた浮動小数点数の(通常は引用符で囲まれた)文字列で構成されます。浮動小数点数のリストを使う演算子としておそらく最もよく知られているのはDistort 演算子です。他にはユーザー定義のモルフォロジー/畳み込みカーネルも含まれますが、これは数値の配列(カーネル)を定義するための専用の追加構文も持っています。浮動小数点数の一変種は「[-sparse-color](https://imagemagick.org/command-line-options/#sparse-color)」で使われ、一部の浮動小数点値の代わりに色を置けるようになっています。内部的には、結果の配列がコアライブラリ関数へ渡される際に、これらも依然として浮動小数点値へ変換されます。

自由形式の文字列

その他のオプションは、単に文字列を引数として取ります。ラベルの生成、テキストの注釈、あるいは画像メタデータとしての保存のためです。これらは通常、文字列中にパーセントエスケープを含み、文字列が使われる前のどこかの時点で置換(差し替え)されます。即座に置換されることもあれば、引数が実際に使われる直前まで置換が遅延されることもあります。(下記の遅延パーセントエスケープを参照。

パーセントエスケープ付きの引数

その性質上、最後の 2 種類の引数のいずれもが、文字列中の画像プロパティパーセントエスケープを展開するために、しばしば前処理されます。これは、特定の文字シーケンスが、処理対象の画像から参照または計算される別の文字列や値へ展開(文字列の置換または差し替え)されることを意味します。これは通常、演算子が特定の画像へ引数を実際に適用する直前に行われるので、その画像に固有の設定を使えます。引数でパーセントエスケープが許可されている場合、代わりに引数の先頭に「@」を付けると、引数全体が指定された外部ファイル(または標準入力)から読み込まれます。たとえば「@filename」は、ファイル「filename」の内容に置き換えられます。これが起きると、パーセントその他の特殊エスケープは一切適用されません。つまり、ファイルから読み込まれた文字列はリテラルとして扱われ、変更なしで使われます。 警告:そのファイルは、プログラムが読み取り可能なシステムファイルやパスワードファイルなど、何でもありえます。したがって、ウェブのユーザーはこの特殊なケースについて入力文字列を事前にチェックすべきであり、さらに良いのは、セキュリティ対策として、その文字列を「@filename」句を使って IM に渡すことです。
文字列がファイルや入力ストリームから読み込まれない場合、「\n」という文字列はすべて「改行」文字に置き換えられ、「%」を前に付けたラベルはすべて、適切な値に置き換えられます。置換の完全な一覧については画像プロパティパーセントエスケープを参照してください。引数でパーセントエスケープを使えることは、そうしたエスケープの使用を許可する演算子(「[-set](https://imagemagick.org/command-line-options/#set)」、「[-sparse-color](https://imagemagick.org/command-line-options/#sparse-color)」、「[-distort](https://imagemagick.org/command-line-options/#distort)」、「[-morphology](https://imagemagick.org/command-line-options/#morphology)」など、増えつつあるリスト)にとって、さまざまな画像属性やメタデータに基づいて引数を生成できることを意味します。ImageMagick バージョン 7 では、ほぼ すべての 引数でパーセントエスケープを使えます(IMv7 の重要な機能です!)。それだけでなく、画像の内容やインデックスに応じて、異なる引数を計算することさえできます! 画像ごとの設定や、あらかじめ定義したグローバル設定を使って、複雑な設定を事前に計算することさえできます。 IM v6.6.9-0 より前は、パーセントエスケープ、より具体的には「%p」、「%n」、「%[fx:t]」、「%[fx:n]」のような画像インデックスを伴う FX パーセントエスケープが壊れていました。通常、それらは「0」または「1」という役に立たない値だけを返し、現在の画像リストにおける実際のインデックスや画像数を返しませんでした。
--- ---

遅延パーセントエスケープ

一部の設定オプションでは、パーセントエスケープが見つかった時点では即座に展開されず、与えられたまま単に保存される点に注意してください。テキストが実際に使われる、より後になって初めて、それが使われる画像がついに判明したときに、文字列中に見つかったパーセントエスケープが展開されるべきなのです。つまり、これらの引数は、引数が実際に使われるまでパーセントエスケープの置換を遅延させなければなりません。これらのオプションには、入力設定である「[-label](https://imagemagick.org/command-line-options/#label)」、「[-comment](https://imagemagick.org/command-line-options/#comment)」のほか、「[-format](https://imagemagick.org/command-line-options/#format)」設定、そしてグローバルな「[-define](https://imagemagick.org/command-line-options/#define)」値が含まれます。これは、画像固有のパーセントエスケープを含む「[-label](https://imagemagick.org/command-line-options/#label)」を、それが適用される画像が実際に読み込まれるよりずっと前に指定できることを意味します。ラベルが実際に画像へ付加される(画像が読み込まれた直後)ときに初めてパーセントエスケープが展開されるので、適用先の画像の属性を利用できます。 | _パーセントエスケープのより広範な利用に対する大きな制約は、現在のところ限られたオプション引数の集合にしか適用されないことです。たとえば、現在のところ「パーセント」文字を別の目的で使うジオメトリ引数とは併用できません。

この問題は、IMv7 が修正する主要な問題の 1 つです。_
---|---


ImageMagick コマンド

これらの ImageMagick 使用例ページの大半は、画像を処理するのに「magick」コマンドを使いますが、ImageMagick には他にも多くのコマンドがあり、ここで簡単に紹介します。ただし、これらのコマンドの一部はウェブページ上では適切に実演できません。それでも、ここで出力を直接お見せできなくても、それらのコマンドに関するヒントやコツをお伝えするよう努めます。

Convert —— 画像の変換と修正

magick」コマンドは ImageMagick の主力であり、これらのページのほぼすべての使用例集がこのコマンドを使っています。そのため、ここではこのコマンドの使い方をあまり扱わず、代わりに少し歴史を見ることにします。IM が最初に作られたとき、このコマンドの当初の目的は、ある画像形式から別の画像形式への画像変換でした。実際、今もこの目的で使われており、それが「magick(旧 convert)」と呼ばれる理由です。このため、このコマンドは画像をメモリに読み込まないことすらあり、IM 本体の外部にある二次的なデリゲートプログラムを使って直接変換を行うこともあります。しかし、この完全に外部的な側面は、時の経過と必要性の欠如により、複雑な画像ファイル形式を読み書きする手段としてを除いて、使われなくなりました。長い期間をかけて、画像を形式間で、あるいは同一形式内で転送する際に小さな変更を加えるための、いくつかの追加的な画像処理機能が加えられました。これらは一般に単純なオプションでしたが、IM バージョン 5 の時点で、これらの処理機能の利用は広範になり、「magick」コマンドにとって単なる画像変換よりもはるかに重要な側面になっていました。オプションが増殖し、複数のオプションが使われ始めると、オプションの順序が奇妙で制御不能な結果を生み始めました。ユーザーにとって IM は、複数の画像処理オプションを使うと不安定で制御不能なものとして知られるようになり、不評を買い始めました。IM バージョン 6 では、単純な「オプション」スタイルから、画像処理を「見たとおりに行う」スタイルへの切り替えが行われ、その結果、画像処理機能は安定して予測可能になり、IM のコマンドライン機能ははるかに有用なものになりました。この結果、「magick」は、もはや画像をある形式から別の形式へ「変換する」ことよりも、画像処理機能にアクセスするためのコマンドライン API として、画像処理や(Perl、PHP、C のような)コンピュータ言語でのプログラミングの学位を必要とせずに、非常に複雑な方法で画像を作成・修正するためのものになりました。もちろん、いくらかのシェルスクリプトの知識は役立ちますが、厳密には必須ではありません。

identify —— IM が見ている画像の詳細を表示する

「identify」コマンドは、画像に関する情報をシンプルで有用な方法で返すよう設計されています。デフォルトでは、簡潔な要約を出力し、画像の名前、ファイル形式、画像サイズ、仮想キャンバスのサイズとオフセット、色深度、内部形式の種類、そして分かる場合はディスク上の元画像のサイズを人間に分かる単位で詳細に示します。たとえば…

  magick identify  tree.gif

[IM Text]

上記の結果中の「8c」は、この画像内の色数(実際には 6 色)ではなく、「擬似カラー」パレットのサイズである点に注意してください(実際の色数については後の例を参照)。また、画像の「仮想キャンバス」が実際の画像と同じサイズでオフセットがゼロであることにも注意してください。これは、現在それが使われていないことを意味します。-verbose操作制御を加えると、IM が知っている、あるいは容易に計算できる画像情報を可能な限り多く出力します。これには、色の統計、色数のカウント、プロファイル情報、画像の内部保存タイプなどなどが含まれます。ただし、その出力は本当に… 冗長(verbose) である点に注意してください! 「[-format](https://imagemagick.org/command-line-options/#format)」設定と、画像プロパティを出力する IM 特有のパーセント(「%」)エスケープを使えば、特定の情報を特定の方法で取得して出力できます。ただし通常は、その引数の一部として EOL(UNIX や MacOSX では改行)を指定する必要があります(IM v6.8.5-8 で変更)。たとえば、画像内の色数のカウントだけを抽出できます。

  magick identify -format '%k\n' tree.gif

[IM Text]

| IM v6.8.5-8 より前は、「[-format](https://imagemagick.org/command-line-options/#format)」は複数の画像の結果を区切るために、出力に行末文字を自動的に追加していました。これはもう行われないので、「[-format](https://imagemagick.org/command-line-options/#format)」文字列に適切な EOL 文字を自分で追加する必要があるかもしれません。
---|---

identify、Ping するかしないか

[magick identify](#identify)」はデフォルトでは、「[-ping](https://imagemagick.org/command-line-options/#ping)」として知られる技術を使い、画像に関する最小限の基本情報のみを読み取ります。これは、identify が画像全体をメモリに読み込もうとせずに、サイズなどの単純な画像情報を判断するのに十分なだけ画像ファイルを読み取ることを意味します。下記のPing、操作制御を参照してください。これは「[magick identify](#identify)」が「[magick](#magick)」に対して持つ大きな利点です。ただし、ほとんどの画像メタデータは利用できなくなります。たとえば、PNG 画像ファイル中の画像ラベルです。たとえば、ここで「ラベル」付きの画像を作成し、単純な format 設定を使ってそのラベルを表示しようとします。

|

  magick rose: -set label "rose with a label" rose.png
  magick identify -format '"%l"\n' rose.png

[IM Output]
[IM Text]


ただしこれは、ごく特定のケースでのみ起こります。より複雑なエスケープを含む「[-format](https://imagemagick.org/command-line-options/#format)」は、最小限の「ping」読み取りの使用を自動的に無効にします。

  magick identify -format '"%[label]"\n' rose.png

[IM Text]

あるいは、この最小限の「ping」読み取りを明示的に無効にして、identify に画像を「丸ごと」読み込ませ、目的の情報を得させることもできます。

  magick identify +ping -format '"%l"\n' rose.png

[IM Text]

一般に、これについてあまり気にする必要はありません。写真のような非常に大きな画像を扱っている場合を除いては。

浮動小数点計算機としての identify

FX エスケープ式を使って、いくらかの浮動小数点数学計算を行えます…

  magick identify -ping -format 'double_width=%[fx:w*2] PI=%[fx:atan(1)*4]\n' tree.gif

[IM Text]

この計算は画像そのものと関連している必要すらない点に注意してください。これにより、スクリプト内で使う単純な浮動小数点計算機として IM を使えます。ここでは基本的な情報だけが必要なので、Ping 制御を使って identify が画像全体を読み込まないようにしました。この場合、結果には影響しませんが、コマンドを大幅に高速化できます。

identify に関する補足的な注意

特定の形式の詳細
通常、IM は各種の画像ライブラリ API やデリゲートプログラムを使って、画像をメモリ(本質的には独自の内部データ形式)に読み込んでから、identify が見ている結果を出力します。つまり「magick identify」は、読み込んで格納した画像/データの内容を分析します。それは、特定のファイル形式が画像データをどのように格納または処理しているかを分析するわけではありません。これは重要です。「magick identify」が報告しない、特定のファイル形式に固有の側面がありうるからです。たとえば、GIF 画像については、存在する各画像(複数画像がありえます)の色テーブルの内容を一覧表示しますが、ファイル中のすべての画像が同じ色テーブルを共有しているかどうかは教えてくれません。特定の画像ファイル形式に関する具体的な情報が必要な場合は、その形式専用に設計されたツールを使うほうが良いかもしれません。たとえば、GIF ファイル形式向けの「giftrans」や、JPEG ファイル形式向けの「jpegtrans」です。
カラーヒストグラム出力
画像が 1024 色を超える場合、verbose 出力にはヒストグラムや色テーブルは含まれない点に注意してください。この情報の生成を強制するには、すべてを大きな画像コメントとして含める特別な「histogram:」ファイル形式を使えます。
終了ステータス

Regard Warnings 制御を加えた場合、identify プログラムは破損した画像に遭遇するとゼロ以外の終了ステータスを返します。

error=magick identify -regard-warnings image 2>&1 >/dev/null; if [ $? -eq 0 ]; then echo "The image is good" else echo "The image is corrupt or unknown format" echo "$error" fi


identify 出力の代替手段

IM v6.2.4 以降、特別な「[info:](files.html#info)」出力ファイル形式を使って、「[convert](#convert)」コマンドから identify 出力を生成することもできます。

  magick ../images/k* \
          -format 'image \"%f\" is of size %G\n'  info:

[IM Text]

Write 演算子を使うと、一連の操作の途中で、たとえばデバッグツールとして「[info:](files.html#info)」へ書き込めます。その出力を特定のファイル(またはファイルストリーム)に書き込ませることもできます。より単純な方法は、「[-identify](https://imagemagick.org/command-line-options/#identify)」オプションを使って通常の「標準出力」へ書き込むことです。

  magick ../images/k* \
          -format 'Image #%p named \"%f\" is a %m\n' -identify \
          null:

[IM Text]

これは、別のオプション「[-print](https://imagemagick.org/command-line-options/#print)」と組み合わせて、他の情報を出力することもできます。

  magick null: -print ' (50 + 25)/5  ==>  %[fx: (50+25)/5 ]\n' null:

[IM Text]

[-identify](https://imagemagick.org/command-line-options/#identify)」と「[-print](https://imagemagick.org/command-line-options/#print)」の主な違いは、前者がメモリ中の各画像について 1 回ずつ実行されるのに対し、後者は 1 回だけ実行されることです。これは、メモリ中の画像について望むほぼどんなテキストファイルでも、単一の ImageMagick コマンドの中だけで完全に生成できることを意味します。たとえば、ここでは前の例で使ったのと同じ画像集合の HTML ファイルを生成します…

  magick ../images/k* \
     -print "<HTML><BODY><CENTER>\n" \
     -print "<H1>  Display of %n Thumbnails  </H1>\n" \
     -print "\n" \
     -format "<IMG SRC=\"%i\" ALT=\"%f\" WIDTH=%w HEIGHT=%h>\n" -identify \
     -print "\n" \
     -print "<BR>That's all folks\!\n" \
     -print "\n" \
     -print "</CENTER></BODY></HTML>\n" \
     null:

[IM Text]

上記の出力の結果は、画像を表示する HTML ウェブページとして見られます。これらのオプションについて最後に一言。これらはすべて、デフォルトでは「magick」コマンドの「標準出力」へ表示されます。あらかじめ「標準出力」をリダイレクトしておかない限り、別の「パイプライン」や特定のファイルへ明示的に出力することはできません。「[info:](files.html#info)」を使って出力を書き込むと、画像ファイルへの場合と同じように、出力を特定のファイルへ向けられます。特別な「[fd:](files.html#fd)」出力ファイル形式を使って、あらかじめ用意したファイルディスクリプタへ出力を向けることもできます。もちろんそれは画像ごとに 1 回書き込むので、1 回だけ出力させるには画像の操作を工夫する必要があるかもしれません。

Mogrify —— インプレースのバッチ処理

magick mogrify」コマンドは多くの点で「magick」に似ていますが、画像をインプレースで修正する よう設計されています。つまり、その主目的は、画像(またはアニメーション)を一度に 1 ファイルずつ読み込んで修正し、画像が読み込まれたのと まったく同じファイル名 へ画像を保存し直すことです。このため…

Mogrify は危険です。元の画像を簡単に破壊しうるからです!

したがって、最終的なことを行う前に、画像の別のコピーで「magick mogrify」をテストしてください。バックアップのない元画像に対しては使わないでください。さて、「magick mogrify」は通常、修正した画像を同じファイル名へ保存しますが、画像を別のファイルへ保存できる 2 つの特別なオプションがあります。「magick mogrify」に固有の設定「[-format](https://imagemagick.org/command-line-options/#format)」は、ファイルを保存する際に使う別の形式と拡張子を定義します。したがって、次のようなコマンド…

  magick mogrify    -format jpg   *.png

これは、元の画像を破壊せずに、画像を変換またはバッチ修正できるようにします。この場合、すべての PNG ファイルを、同じファイル名で拡張子だけが異なる JPEG ファイルへ変換します。ただし、同じ名前の既存ファイルがある場合は 上書きされる 点に注意してください。なので、もう一度言わせてください…

Mogrify する前に考え、確認すること

さもないと、残しておきたかった何かを上書きしてしまったことに気づくかもしれません。IM v6.2.0 以降、新しい「[-path](https://imagemagick.org/command-line-options/#path)」オプションを使って、処理した画像を出力する別のディレクトリを指定することもできます。これによりより安全になりますが、それでもそのディレクトリに既にある同名の画像は上書きされます。また、そのディレクトリに残っていた古い画像が削除されることもありません。したがって、次のようなものを使って、IM に結果(たとえば画像サムネイル)を既存のサブディレクトリへ保存させられます…

  magick mogrify   -path thumbnail-directory   -thumbnail 100x100  *

| IM v6.3.4-3 より前は、「[-format](https://imagemagick.org/command-line-options/#format)」設定と「[-path](https://imagemagick.org/command-line-options/#path)」設定は相互排他的でした。そのバージョン以降は、形式と出力ディレクトリの場所の両方を変更できます。
---|---
複数画像を処理する機能のため、「magick mogrify」コマンドは複数画像リスト演算子画像スタック演算子を一切使えません。つまり、「magick mogrify」コマンドでは「[-fx](https://imagemagick.org/command-line-options/#fx)」、「[+swap](https://imagemagick.org/command-line-options/#swap)」、「[-composite](https://imagemagick.org/command-line-options/#composite)」、「[-append](https://imagemagick.org/command-line-options/#append)」、「[-flatten](https://imagemagick.org/command-line-options/#flatten)」、「[-layers](https://imagemagick.org/command-line-options/#layers)」のような画像処理演算子を使えません。一部の設定オプションは最初の画像が読み込まれる前に設定しておく必要があるため(たとえば「[-size](https://imagemagick.org/command-line-options/#size)」、「[-label](https://imagemagick.org/command-line-options/#label)」、「[-density](https://imagemagick.org/command-line-options/#density)」)、これらのオプションは最初の画像が読み込まれる前に処理・設定されます。その後、各画像が読み込まれ、コマンドライン順に演算子が適用されてから画像が保存され、次の画像が読み込まれます。これを念頭に置くことが重要です。シーケンスの後のほうでこれらの設定の 1 つを変更すると、IM に以前の設定を忘れさせてしまうことがあるからです。たとえば…

  magick mogrify -format gif  -size 200x200  -pointsize 18 \
          -font Candice -gravity north  -annotate 0 "%f" \
          -font Ravie   -gravity Center -annotate 0 "%f" \
          -font Gecko   -gravity south  -annotate 0 "%f" \
          -size 100x64   xc:gold  xc:orange   xc:tomato

[IM Output] [IM Output] [IM Output]

ご覧のとおり、上記で生成された画像のサイズは 2 番目の「[-size](https://imagemagick.org/command-line-options/#size)」入力設定によって決まり、最初の大きいほうの設定は完全に無視されています。一方、演算子設定の「[-font](https://imagemagick.org/command-line-options/#font)」は、個々の「[-annotate](https://imagemagick.org/command-line-options/#annotate)」操作それぞれに正しく設定されています。この複雑さが増すことは、おそらく次のことを意味します…

Mogrify はシンプルに。

magick mogrify」を使ったバッチ操作で、非常に長く複雑な「magick」ライクな操作を試みないでください。おそらく「設定」の問題が起きるでしょう。本当に複雑な処理をしたいのなら、各画像を一度に 1 枚ずつ処理するために「magick」を使うシェル/DOS/Perl スクリプトを書くか、ImageMagick API インターフェースへ移行してください。スクリプトを使って大量の画像を修正する例については、ImageMagick 高度な使用例を参照してください。とにかく、「magick mogrify」は危険なコマンドであり、本番運用に投入する前に、必ずバックアップ画像で十分にテストすべきだということを覚えておいてください。実際、私はスクリプトに「magick mogrify」のような処理について素早い「テスト」を含めて、非常に大規模な画像コレクションを処理する前に、(バージョンの変更やコンピュータインストールの違いによって)コマンドが何も壊さないことを確認することも推奨します。つまり、小さな「テストケース」を行い、正しいものを生成できなければ中断してから先へ進むのです。これは実のところ、あらゆる大規模な画像処理プロジェクトにとって良いアイデアであり、予期しない結果からユーザーを守れます。私自身、IM 使用例でこれを行っており、おかげで多くのトラブルを免れています。

magick mogrify」を使ったアルファ合成

magick mogrify」は複数画像リスト演算子を使えないため、ロゴを重ねたりアルファ合成を使って画像をマスクしたりといったことを簡単には行えません。これには 1 つだけ例外があり、「[-draw](https://imagemagick.org/command-line-options/#draw)」を使って画像のアルファ合成を行う方法です。これにより、現在の画像リストの外にある 2 枚目の画像を、演算子の引数の一部として指定できます。たとえば、ここではまず、特別な「[cp_perl](http://www.ict.griffith.edu.au/anthony/software/#mv_perl)」スクリプトを使って、処理したい元画像のコピーを作成します。次に一時的な円の「マスク」画像を作成し、それを使って「magick mogrify」と「[Dst_In](compose.html#dstin)」アルファ合成メソッドで、それらすべての画像から円形を切り出します。

  cp_perl  's/^/mogrify_/'  eye.gif news.gif storm.gif tree.gif
  magick -size 32x32 xc:none -draw 'circle 15.5,15.5 15.5,0'  circle.gif
  magick mogrify  -alpha Set -draw 'image Dst_In 0,0 0,0 "circle.gif"'  mogrify_*.gif

[IM Output] [IM Output] [IM Output] [IM Output] [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]

任意のアルファ合成メソッドをこの方法で使えますが、すべての画像に適用される一定の「ソース」または「オーバーレイ」画像とともに使う場合に限られる点に注意してください。また、「magick mogrify」は「ソース」画像を複数回読み込むことになるため、画像を何度も読み込む際のデコードのオーバーヘッドを減らすために、IM 特有の「MPC:」ファイル形式を使うことをお勧めします。この画像ファイル形式は、IM が解析する必要がなく、ディスクから(作成したのと同じマシンであれば)メモリへ直接マップされます。これにより多くの処理時間が節約され、特に大量の画像を扱う場合に効果的です。

Mogrify の代わりに Convert を使う

パーセントエスケープを使って出力ファイル名を変更する特別な技術(ファイル名パーセントエスケープを参照)を使えば、「[mogrify](#mogrify)」をより多用途な「[convert](#convert)」コマンドに置き換えられます。それだけでなく、画像の最終的な保存先名をより細かく制御でき、合成やアニメーションのような複数画像処理もよりうまく扱えます。たとえば、ここでは現在のディレクトリにある画像のサムネイルを作成し、入力ファイル名に「_tn」という文字列を挿入して、適切な出力画像ファイル名を作成します。

  magick *.jpg   -thumbnail 120x90 \
          -set filename:fname '%t_tn' +adjoin '%[filename:fname].gif'

警告。ファイル名設定そのものに別のファイル拡張子を含めないでください。IM は使う画像ファイル形式を決める際にそれを見ません。IM がファイル名から判断できない場合、読み込んだ元のファイル形式へフォールバックするので、この技術を使うときは明確な拡張子、あるいはコーダープレフィックスが重要になりえます。ソース画像の元のファイル名を正確に得るには、「%i」、「%d/%f」、または「%d/%t.%e」を使ってください。もちろんこれらはすべて、ファイル名設定中にファイル拡張子を含みますが、IM はそれを使いません。とはいえ、それは同じ画像ファイル形式なので問題ないはずです。「[mogrify](#mogrify)」の代わりに「[convert](#convert)」を使う際の本当の問題は、すべての 画像がまずメモリに読み込まれることです! Mogrify は、一度に 1 ファイル(ただしそのファイルには複数の画像が含まれうる)だけを読み込み・修正・書き込みするよう細心の注意を払います。しかし「[convert](#convert)」はそうではありません。したがって、注意しないとメモリ制限を簡単に超えてしまいます。とはいえ、それを回避する方法もあります。読み込み修飾子サムネイルの例を参照してください。また、すべての画像が単一の画像リストとしてメモリにあるため、それらの画像をどう処理するかに注意する必要があります。たとえば、通常どおりにアルファ合成を直接使うことはできず、その仕事をするには専用の複数画像リスト合成を使う必要があるかもしれません。もちろん「magick mogrify」と同様に、「magick」を使うこの方法も危険であり、元の画像ファイルを簡単に上書きして破壊しうる点に注意してください。

バッチ処理の代替手段

magick mogrify」を使った画像のバッチ処理が実用的でない場合、特にインプレースで修正するのではなく画像をコピーしている場合は、IM 以外のループ解決策を使うほうが良いかもしれません。これには次のものが含まれます…

  # 単純なシェルループを使って各画像を処理する。
  mkdir thumbnails
  for f in *.jpg
  do   magick $f -thumbnail 200x90 thumbnails/$f.gif
  done

  # find を使ってファイル名を 'convert' コマンドに置き換える。
  # -prune オプションを外せばディレクトリを再帰的にたどる機能も提供され、
  # また他のファイルチェック(画像の種類や、画像が使うディスク容量など)も行える。
  find * -prune -name '*.jpg' \
         -exec  magick '{}' -thumbnail 200x90 thumbnails/'{}'.gif \;

  # xargs を使う -- 引数を変数に入れるためのシェルラッパーとともに。
  # これは "find" や "ls" と組み合わせてファイル名を列挙できる。
  ls *.jpg | xargs -n1 sh -c 'magick $0 -thumbnail 200x90 thumbnails/$0.gif'

  # linux(素の unix ではなく)での代替手段。
  # これは引数を扱うためのシェルを必要としない。
  ls *.jpg | xargs -r -I FILE   magick FILE -thumbnail 200x90 FILE_thumb.gif

等々。再帰的、あるいは非再帰的なファイル処理を行うには、「find」と「xargs」の両方を使うことをお勧めします。それらの man ページを読んでください。手短な入門としては、この IM ディスカッション投稿や、関連する危険についての情報を含むガイド Xargs - Wikipedia を参照してください。コマンドがこれより複雑になり始めたら、複数の画像を読み込み、情報を集め、適切な引数を計算し、画像を処理するために、シェルスクリプトや API プログラムへ移行する頃合いかもしれません。また、「[parallel](http://www.gnu.org/software/parallel/)」コマンド(通常「xargs」のドロップイン置き換え)もよく見ておくことをお勧めします。これは複数のコマンドを同時に実行できるだけでなく、少し工夫すれば各コマンドを異なるコンピュータで実行でき、非常に大量のタスクをネットワーク分散処理できます。Windows ユーザーは、Windows での使用法の節、特に Windows、複数ファイルのバッチ処理を参照してください。 [mogrify](#mogrify)」やその他すべての IM コマンドも、「*」や「?」のようなシェルメタ文字を含むファイル名をすべて展開する点を覚えておいてください。これは、古い DOS コマンドラインシェルでこれらのメタ文字を使えるようにするために行われます。しかし、これがバグや、magick mogrify の繰り返し実行、あるいは使うファイル名を提供した邪悪な出所からの「ハック」さえも引き起こしかねません。注意とセキュリティ問題の完全な理解が推奨されます。

Composite —— 特別な方法で画像を重ねる

magick composite」コマンドは、2 枚の画像をさまざまな方法でシンプルにアルファ合成(重ね合わせ)するために特別に設計されています。これには、3 枚目のマスク画像を使って、画像が合成される領域を制限することも含まれます。「magick」とは異なり、「magick composite」コマンドは非常に伝統的なコマンドであり、設計された単一の画像処理操作を実際に実行する前に、すべてのオプションと設定を読み取ります。「magick composite」コマンドは、より複雑なアルファ合成モードの一部へのシンプルなアクセスも提供します。たとえば「[-dissolve](https://imagemagick.org/command-line-options/#dissolve)」、「[-blend](https://imagemagick.org/command-line-options/#blend)」、「[-watermark](https://imagemagick.org/command-line-options/#watermark)」の画像合成です。これらの引数のいずれかが与えられると、そのコマンドに対して与えられた(あるいは与えられる予定の)他の「[-compose](https://imagemagick.org/command-line-options/#compose)」設定を上書きします。また、「[-tile](https://imagemagick.org/command-line-options/#tile)」設定も、「magick」や「magick montage」「magick display」のいずれとも異なる動作をする点に注意してください。「magick composite」では、これにより重ねた画像が背景画像の全体にわたってタイル状に並べられます。これは他の IM コマンドではまだ利用できない機能です。これらの特別な機能が「magick composite」を有用なコマンドにしている一方で、アルファ合成は今では「magick」コマンドでも使えるようになっています。(詳細はIM におけるアルファ合成を参照)。2 枚以上の画像を重ね合わせる複数の異なる方法の要約については、複数の画像ペアの合成の例を参照してください。2 枚の画像をマージできる方法に関する詳細については、アルファ合成の使用例ページを参照してください。重ね合わせの制限、すなわち「マスキング」機能についても、上記の使用例ページのCompose マスクを使って合成領域を制限するで詳しく説明されています。

Montage —— サムネイルの配列を生成する

特別な IM 画像インデックスコマンド「magick montage」も、「magick」と同じ「見たとおりに行う」スタイルのコマンドライン構造に従いました。唯一の違いは、(最後の出力画像ファイル名引数を除いて)コマンドの末尾に達したとき、「magick montage」が、現在設定されている設定に従って、画像リストをサムネイルのインデックスページへと処理し始めることです。これにより「magick montage」は IM バージョン 5 のときよりはるかに多用途になりました。「magick」でと同じように画像を処理し、それから望むすべての「magick montage」設定を設定して、仕上げを任せられるからです。「magick montage」の詳細については、Montage、サムネイルの配列を参照してください。

display —— 画像のスライドショー

magick display」プログラムは、画像、あるいは画像のリストを、ループするスライドショーの形で表示するよう設計されています。これは、入念に演出され、タイミングを取られた画像のアニメーションのためのものではありません。それには「[animate](#animate)」コマンドを使ってください。各画像は、(後述する「[-geometry](https://imagemagick.org/command-line-options/#geometry)」のような)他のオプションがこの動作を上書きしない限り、画像に応じて適切にサイズ調整されたウィンドウに表示されます。画像はまた、一般に市松模様の背景の上に表示され、画像が持ちうる透明度の効果を見せます(後述)。繰り返しますが、これはアニメーションの表示のためのものではなく、実際の画像のスライドショーとしてのものです。したがって、スクリプトプログラムで display を使う際には注意が必要かもしれません。画像の表示時間、ループ、その他のオプション デフォルトでは、ユーザーが「[-delay](https://imagemagick.org/command-line-options/#delay)」設定で指定するどんな遅延に加えて、約 2 秒の遅延が使われます。ただし、「-delay 0」オプションを使えば、ユーザー入力(スペースバー)を待たせられます。しかし、デフォルトはファイル形式によっては画像自体によって上書きされることがあります。したがって、GIFMIFF のようなアニメーション形式では、一時停止になるか、あるいは 2 秒に画像のメタデータの遅延設定を加えたものになるかのいずれかになりえます。そのため、スクリプトと用途に応じて、常に適切な「[-delay](https://imagemagick.org/command-line-options/#delay)」を設定することをお勧めします(「-delay 5x1」は 5+2、すなわち約 7 秒の遅延になることを覚えておいてください)。「[-loop](https://imagemagick.org/command-line-options/#loop)」設定についても同様です。デフォルトでは「magick display」は永久にループします(「-loop 0」)が、MIFFGIF のような画像形式はこれを上書きして、ループ中の最後の画像の後に終了させられます。状況に応じて「[-loop](https://imagemagick.org/command-line-options/#loop)」オプションを適切に設定してください。「magick display」はGIF アニメーション設定を一切扱わないので、フレームは破棄(dispose)されず、仮想キャンバスのサイズとオフセットは無視される点に注意してください。言い換えれば、GIF アニメーションでは、正しく重ね合わされた画像ではなく、生の部分画像が見えます。表示目的でそうしたアニメーションをきれいにするための「[-coalesce](https://imagemagick.org/command-line-options/#coalesce)」オプションは提供されています。

透明度の扱い

完全なアルファチャンネルを含む画像(例:PNG や MIFF 形式)は、「市松模様」の背景パターンの上に重ねられ、影効果のような半透明の効果を見られるようにします。「[-texture](https://imagemagick.org/command-line-options/#texture)」で別の背景を選んで、これを変えられます。たとえば…

  magick display -texture granite: test.png

  magick display -texture xc:black test.png

GIF や PNG8 形式のような、パレット(またはブール値)透明度を持つ画像は、色テーブルで透明度を表すために使われた現在の「透明色」で表示されます。つまり、デフォルトの市松模様パターンではなく、一般にランダムな色(通常は黒)が使われることがあります。これはバグと見なされうるものの、技術的にはバグではありません。しかし、display にこうした画像を、透明度情報を含む他の画像と同じように扱わせたい場合は、画像出力形式の内部スタイルを変更する次のコマンドを使って、画像を「magick display」に与える前にパレットメタデータを取り除けます。

  magick image.gif -type truecolormatte miff:- | display -

あるいは、表示する画像を変更するほぼどんな操作も、既存のパレットメタデータを取り除きます。したがって、一部の「magick display」オプションはパレットを取り除くのに使えます。たとえば「[-coalesce](https://imagemagick.org/command-line-options/#coalesce)」を使うことです。

  magick display -coalesce image.gif

これには、存在しうる GIF アニメーションの最適化をきれいにするという追加の利点もあります。ただし、複数の無関係な画像については、他の望ましくない副作用がありえます。確かにこれらの方法は不格好ですが、機能します。

Convert を使った表示

(次に説明する「magick animate」を使う以外の)代替的な表示方法は、より単純な「x:」出力画像形式を使うことです(display 出力形式を参照)。

  magick image.png x:

この方法は、背景ウィンドウ、メニューオプション、その他の制御を提供しません。単に画像を一度に 1 枚ずつ表示するだけです。結果の画像を単に「表示」したいだけなら、特別な「show:」または「win:」出力生成デリゲートが同じことを行います。これは出力画像に対して「[display](#display)」コマンドを実行し、そのウィンドウが閉じられるのを待たずに終了します。

  magick image.png show:

表示の出力サイズ

display は、画像を X ウィンドウディスプレイに合わせて拡大縮小しません。ウィンドウサイズは、「[-geometry](https://imagemagick.org/command-line-options/#geometry)」設定で設定されない限り、各画像に合わせて調整されます。その設定は、X ウィンドウディスプレイ上のウィンドウ位置を固定するのにも使えます。画面より大きい画像もリサイズされず、画面からはみ出しますが、display はユーザーが画像をスライドさせて見られる「スクロールウィンドウ」も提供します。これは、現代の高解像度デジタル写真を見るときには厄介です。display を、たとえば 800x600 ピクセルの領域に制限する(小さくするだけで、決して大きくしない)には、次のようにします…

  magick display -resize 800x600\> photo.jpg

JPG 画像については、特別な jpeg 入力サイズヒント設定を使って画像の読み込みを高速化できます。JPEG 読み込み制御オプションを参照してください。

  magick display -define jpeg:size=1600x1200 -thumbnail 800x600\> photo.jpg

画像が現代のデジタルカメラからのものであれば、「[-auto-orient](https://imagemagick.org/command-line-options/#auto-orient)」を使って、画像ファイル形式中の EXIF メタデータを使い、表示される画像のカメラ回転を補正することもできます。メニューが不要なら、「magick display」に「[-immutable](https://imagemagick.org/command-line-options/#immutable)」設定を使って編集を許可しないことを知らせ、メニューをオフにできます。

スクリプトでの display の利用

これらのオプションを念頭に置くと、複雑なシェルスクリプトの結果を表示するために「magick display」を使う、私のお勧めは次のとおりです…

  magick display -delay 0 -loop 1 -coalesce -resize 800x600\>   some_random_image

X Windows での display

[-window](https://imagemagick.org/command-line-options/#window) root」オプションを使うと、X ウィンドウの背景(ルート)ウィンドウに画像を表示できます。この場合、「magick display」プログラムは自動的に終了します。デフォルトでは、画像は背景にタイル状に並べられます。たとえば、これを試してみてください…

  magick display -window root pattern:checkerboard

画像タイルの他の多くの例や、それらの生成については、タイルキャンバス背景画像の使用例を参照してください。X Windows の背景に単一の画像を使いたい場合は、X ウィンドウディスプレイのサイズを知る必要があるかもしれません。「xdpyinfo」プログラムは ImageMagick の一部ではありませんが、その情報を教えてくれます。

  xdpyinfo | grep dimensions:

そしてここでは、「xdpyinfo」の出力を使って、X ウィンドウ背景を完全に埋めるよう画像をリサイズします。

  screen_size=`xdpyinfo | sed '/dimensions:/!d;s/^[^0-9]*//;s/ pixels.*//'`
  magick display  -resize $screen_size! -window root photo.jpg

display のリモート制御

display は特別な「[-remote](https://imagemagick.org/command-line-options/#remote)」オプションを提供します。これは、すでに実行中の「magick display」コマンドを探し、与えられた引数をそれに渡します。たとえば…

  magick display wizard: &
  sleep 5
  magick display -remote logo: &

これは、バックグラウンドで実行されたコマンドで組み込みの「wizard」画像を表示します。スクリプトはその後 5 秒待ってから、それを組み込みの「logo」画像に置き換えます。「magick display」コマンドが実行されていない場合、現在のコマンドはウィンドウを開いて終了しない点に注意してください。したがって、念のため「display -remote」コマンドもバックグラウンドで実行すべきです。現時点では、リモートの「magick display」に終了を要求することはできません。したがって、リモート display を閉じる最良の方法は、実行中のプロセスを kill するか、何らかの X ウィンドウコマンドを使って display ウィンドウを「削除」することです。たとえば(IM 以外のコマンド「xdotool」を使って)…

  xdotool search -class "display" windowkill

animate —— 画像のアニメーションを表示する

多くの点で「magick animate」と「[display](#display)」は非常によく似ています。しかし「[display](#display)」は、与えられた画像ファイル中の画像を「そのまま」変更せずに表示するだけで、各フレームの間にユーザー入力のための最小限の 2 秒の一時停止を加えます。一方、「magick animate」は、画像とともに保存されたGIF アニメーション設定を適用し、各画像をその「時間遅延」設定に従ってのみ表示し、最初に戻ってアニメーションを繰り返します。言い換えれば、「magick animate」はアニメーション形式を正しく「アニメーション」しますが、「[display](#display)」はそうしません。ただしこのため、最初の画像の仮想キャンバスが出力画像のサイズを制御し、他の画像はその画像領域に重ねられます。もちろん、画像はアニメーションされるので、「[-delay](https://imagemagick.org/command-line-options/#delay)」のようなオプションを使って、画像の表示タイミングを細かく制御できます。このコマンドには、最後のフレームの「[-delay](https://imagemagick.org/command-line-options/#delay)」設定が指定するものを超えて、アニメーションループの末尾に追加の一時停止を加えるための、追加の引数「[-pause](https://imagemagick.org/command-line-options/#pause)」もあります。たとえば、次のようなものを使って、2 つの非常によく似た画像のフリッカー比較を生成するのに「magick animate」を使えます…

  magick image1.png image2.png -scale 400% miff:- |\
     magick animate -delay 50 -loop 0 -

私はこの方法を利用する「[flicker_cmp](../static/img/scripts/flicker_cmp)」というスクリプトを書いており、見逃してしまうような非常に微妙なピクセル強度の変化を拾い上げるのに非常に役立つと感じています。

compare —— 相違点を探す

これに関する現在の情報はすべて、IM 使用例の画像比較ページの節にあります。

stream —— 巨大な画像のパイプライン処理

magick stream」は、非常に大きな画像ファイルの一部を抽出する処理を扱うよう設計された特別なプログラムです。ImageMagick の中で唯一そのようなプログラムであり、他のすべては処理の前に画像を完全にメモリに読み込みます(例外は「[-size](https://imagemagick.org/command-line-options/#size)」経由の JPEG 画像で、このオプションは JPEG デリゲートライブラリへ渡されます)。「[-extract](https://imagemagick.org/command-line-options/#extract)」設定で画像の一部を選択できます。そして「[-depth](https://imagemagick.org/command-line-options/#depth)」設定で生のバイトの深度を指定できます。さらに、「[-channel](https://imagemagick.org/command-line-options/#channel)」オプションを使って、抽出するカラーチャンネルを選択できます。ただし「magick stream」は、画像深度で定義される生のカラーバイト(RAW 形式)しか出力しないので、抽出したセグメントの出力を convert へパイプする必要があるかもしれません。 たとえば… |

  magick stream -map rgb -storage-type char -extract 100x100+200+100 logo: - |\
    magick -depth 8 -size 100x100 rgb:-   magick stream_wand.gif

[IM Output]
詳細情報と使用例については、本当に巨大な画像の扱いを参照してください。

import —— 画面表示から画像を読み取る

magick import」コマンドは、X ウィンドウディスプレイから画像を取り込んで抽出するのに使える特別なプログラムです。たとえば、ディスプレイから選択したウィンドウを取り込んで印刷させてみましょう…

  magick import -page A4 -gravity center ps:- | lpr

特別なファイル形式「[X:](files.html#x)」も magick コマンド内からまったく同じ機能を提供するため、これは実際にはめったに使われません。両者の唯一の違いは、「magick import」のほうが、画像を取り込む元のディスプレイ、スクリーン、ウィンドウ ID の指定など、「[X:](files.html#x)」形式より多くの X ウィンドウ固有の設定を持つことです。他のオプションには、ディスプレイの「ビープ音」や繰り返しスナップショットの制御が含まれます。特定のウィンドウが指定されない場合、ユーザーが画像として取り込みたいディスプレイの部分をマウスで選択できます。

  • シングルクリックを使うと、クリックしたウィンドウ全体が取り込まれて画像として返されます。ディスプレイ上の他のウィンドウが選択したウィンドウの一部を覆っている場合、覆っている他のウィンドウが、取り込まれる選択ウィンドウを覆っている状態の画像を取り込むことになる点に注意してください。
  • ルートウィンドウでのクリック、または「-window root」の選択は、画面全体を返します。
  • マウスのクリック&ドラッグを使うと、画面全体の切り抜かれた部分が返されます。もちろんこれは、画面全体(仮想キャンバス、すなわちページのサイズ)における位置(仮想キャンバスオフセット)も返されることを意味します。

他のオプションを使うと、画面全体(「-window root」)、あるいはウィンドウタイトルや X ウィンドウ ID で指定した特定のウィンドウを取り込むことで、マウスでの人間の操作を避けられます。X ウィンドウ ID は X ウィンドウユーティリティ「xwininfo」を使って見つけられます。「[-extract](https://imagemagick.org/command-line-options/#extract)」を使って、選択したウィンドウの領域を切り詰めることもできます。「magick import」を使う代わりの手段としての特別な入力形式「[X:](files.html#x)」も参照してください。

    Windows のクリップボードから取り込むには
      magick clipboard:myimage image.png
    を使い、"import" は使わない

conjure —— IM の実験的スクリプト言語

もともとは、複数の画像リストの利用を伴う、スクリプト化された ImageMagick の利用を可能にするために設計されましたが、IM v6 の「magick」になされた改良により、この実験的な API は使われなくなりました。これは XML ベースの言語です。とはいえ、XML が欲しいのであれば、SVG のほうがニーズに合うかもしれません。私の意見では、複数画像リストを扱う際には「magick conjure」スクリプトを使うほうがおそらく良く、簡単です。そして、例やユーザーによるサポートの欠如のため、あまり広くはないものの、使われています。


画像リスト…

ImageMagick で覚えておくべき最も重要な点の 1 つ、そして新規ユーザーも経験豊富なユーザーも混乱させる点の 1 つは、次のことです…

ImageMagick は、単一の画像ではなく、画像の順序付きリストを扱う

つまり、IM は 1 枚の画像だけでなく、潜在的には画像の順序付きリストを扱うのです。それらは別々の個別画像であれ、互いに重なり合う画像の集合であれ、アニメーションのフレームであれ構いません。また一般に、すべての画像演算子は 現在のリストにあるすべての画像 に適用されます。したがって、「[-draw](https://imagemagick.org/command-line-options/#draw)」演算子を使うと、多くの新規ユーザーが思い込むようにリスト中の最後の画像にだけ描くのではなく、現在の画像リスト中の 他のすべての 画像にも描き、しかも各画像に順番に描きます。「[-coalesce](https://imagemagick.org/command-line-options/#coalesce)」や「[-layers](https://imagemagick.org/command-line-options/#layers)」のような画像レイヤー演算子は、リスト中の各画像を、リスト中の他の画像に応じて変更された新しい画像に置き換えます。余分な画像を追加したり削除したりすることさえあります! また、「[-append](https://imagemagick.org/command-line-options/#append)」、「[-mosaic](https://imagemagick.org/command-line-options/#mosaic)」、「[-fx](https://imagemagick.org/command-line-options/#fx)」のような画像リスト演算子は、現在の画像リスト中の すべての 画像を、結果として得られる合成画像に置き換えます。つまり、丸括弧を使ってあらかじめ保存され、クローン画像が使われていない限り、すべての画像を破壊します。実用的な例については、下記の画像リスト演算子を参照してください。最後に、新しい画像が読み込まれるか作成されると、IM はその新しい画像を(常に存在する)現在の画像リストの末尾に追加するだけです。一部の形式(GIF など)は、読み込む内容を制限する特別なインデックス読み込み修飾子が入力ファイル名に加えられない限り、実際には複数の画像を現在の画像リストに追加することがあります。画像を保存するとき、IM は書き込み時点でメモリにある画像リスト全体を保存します。画像形式が許せば、IM はすべての画像を単一のファイルに書き込みます。形式が複数画像を許さない場合(たとえば JPEG)、画像を別々のファイルに書き込みます(複数画像の書き込みを参照)。

丸括弧 —— 画像を「脇で」処理する

コマンドラインオプションの形式化により、処理順序が今では完全に予測可能になり、また画像処理に丸括弧(角括弧)を加えることも可能になりました。これは IM ユーザーが長らく望んできた機能で、これまで単一のコマンドでは不可能だったことを行えるようにします。開き括弧「(」は、事実上、囲まれたすべての演算子が作用する新しい画像リストを開始します。対応する閉じ括弧「)」は、その結果の画像リスト(1 枚を超える画像かもしれないし、まったくないかもしれません)を、それ以前の画像リストの末尾に追加します。言い換えれば、丸括弧を使うことは次のことを意味します…

「結果を前のリストの末尾に追加する前に、
別の画像リストでちょっと作業をする必要がある。」

これにより、すでに読み込んだり作業したりしてきた画像に影響を与えずに、スクラッチパッドのように画像のサブセットで作業し、その結果をメインの画像リストに戻せます。いくつかの簡単な例を見てみましょう… |

  magick  eye.gif  storm.gif  -negate  +append  cmd_negate.gif

[IM Output]
ご覧のとおり、「[-negate](https://imagemagick.org/command-line-options/#negate)」演算子は両方の画像の色を反転させました。そのときメモリ中の現在の画像リストに両方があったからです。しかし丸括弧を加えると、反転を 2 枚目の画像だけに限定できます… |

  magick  eye.gif \(  storm.gif  -negate \) +append  cmd_bracket.gif

[IM Output]
storm.gif」画像は(「(」画像リスト演算子によって生成された)最初の画像とは別の画像リストに読み込まれるため、最初の画像に影響を与えずに反転できます。それから、その結果をメインの画像リストに追加し(それが「)」演算子です)、以前と同じように 2 枚の画像を連結できます。 | _丸括弧は別々の引数として与えなければなりません。つまり、それらを他の引数からスペースで区切らなければなりません。隣接する引数にぴったりくっつけて加えることはできません。言い換えれば、IM のコマンドライン引数で「\(+clone」は誤りで、「\( +clone」が正しいのです。

また、最後の例では丸括弧の前にバックスラッシュ「\」を置く必要がありました。これは、UNIX(linux)マシンで IM を使うとき、丸括弧がコマンドラインシェルにとって特別な意味を持つためです。したがって、それらを使うときは括弧記号をエスケープするか引用符で囲む必要があります。

Windows の DOS スクリプトでは、丸括弧をバックスラッシュでエスケープする必要はありません。これと、linux スクリプトとの他の違いについてはWindows DOS スクリプトを参照してください。

_
---|---
丸括弧はまた、これまで単一の「magick」コマンドでは不可能だったことを可能にします。画像の配列を生成することです! |

  magick eye.gif news.gif  +append \
         \( storm.gif tree.gif +append \)   -append  cmd_array.gif

[IM Output]
このような配列はもちろん「magick montage」を使っても可能でした(Montage 連結モードを参照)が、別のコマンドを使うと画像処理スクリプトがより複雑になります。もちろん、コマンド自体をより配列らしく見せたいなら、自由に余分な丸括弧を加えられます。 |

  magick \( eye.gif    news.gif  +append \) \
          \( storm.gif  tree.gif  +append \) \
          -append  cmd_array2.gif

[IM Output]
最初の丸括弧の組は厳密には必要なく、IM の内部処理にごくわずかな余分な作業を加えますが、処理ステップを分離することで、コマンドが何をしているのかを明確にします。各処理ステップを別々の丸括弧として実行することは、適用している処理ステップを分離する手段として、画像処理スクリプトにとってより簡単かもしれません。

丸括弧と設定

オプションの「設定」は丸括弧の影響を受けず、設定が変更されるか無効化されるまで、丸括弧の画像演算子をまたいで継続します。たとえば… |

  magick -pointsize 24 \
          -font Candice label:Outside \
          \(              label:Inside \
             -font Gecko  label:Inside \) \
          label:Outside       -append   cmd_settings.gif

[IM Output]
丸括弧に入るときに最初の「-font Candice」設定がデフォルト設定に戻されないこと、また丸括弧を出るときに 2 番目の「-font Gecko」が元のフォント設定に置き換えられないことに注目してください。言い換えれば…

丸括弧は別々の画像シーケンスを作るだけです。
設定を制限するのではなく、作業対象の画像だけを制限します。

IM v6.4.1-4 以降、新しい操作制御オプション「[-respect-parentheses](https://imagemagick.org/command-line-options/#respect_parenthesis)」でこの動作を上書きできます。IM コマンドの先頭で与えると、丸括弧に、それ以前に与えられた設定を保存して取り戻させることもします。つまり、丸括弧内で与えられた設定はすべて、丸括弧が終わるまでしか維持されません。たとえば… |

  magick -respect-parentheses   -pointsize 24 \
          -font Candice label:Outside \
          \(              label:Inside \
             -font Gecko  label:Inside \) \
          label:Outside       -append   cmd_settings2.gif

[IM Output]
ご覧のとおり、丸括弧が終わると、フォント設定は丸括弧内で設定された「Gecko」フォントではなく、それ以前の「Candice」フォントに戻されました。これは、ごく短い間だけ多くの設定を変更しなければならないときに最も役立ちます…

  magick -respect-parentheses \
          -font Arial   label:"This is a line of plain text." \
          \( -font Candice -pointsize 16 -fill red -undercolor lightblue \
              label:"A line using a lot of different settings." \) \
          label:"Text is back to normal -- like Magick\!" \
          -append  cmd_settings_lots.gif

[IM Output]

画像リスト演算子

IM が画像シーケンス、特に丸括弧内の画像シーケンスをより重視するようになったことから、画像リストを操作する新しい画像演算子の集合が提供されたのは当然のことです。

これらの演算子の引数は、画像リストにインデックスを付ける数値で、最初の画像はゼロ(「0」)、2 番目の画像は 1(「1」)というように始まります。ただし、負のインデックスを与えると、画像リストの末尾(最後に追加された画像)から参照されます。つまり、インデックス「-1」は現在の画像リスト中の最後の画像(一般に最後に読み込まれた、または作成された画像)、「-2」は後ろから 2 番目、というようになります。

-delete {index_range_list}

[-delete](https://imagemagick.org/command-line-options/#delete)」リスト演算子は、画像リスト演算子の中で最も単純で、現在の画像リストから画像を削除するだけです。 |

  magick font_[0-3].gif -delete 1 +append  seq_delete.gif

[IM Output]
この演算子の「プラス」形式「[+delete](https://imagemagick.org/command-line-options/#delete)」は引数を取らず、現在の画像リスト中の最後の画像を削除するだけです。「[-delete](https://imagemagick.org/command-line-options/#delete)」演算子は、削除する数値のカンマ区切りリストや数値範囲も受け付けます。 |

  magick font_[0-7].gif -delete 1-4,6 +append  seq_delete2.gif

[IM Output]
あるいは、すべてを削除する(そして新しい画像を加える)… |

  magick font_[0-7].gif -delete 0--1  tree.gif seq_delete3.gif

[IM Output]
0--1」引数は、最初の画像(インデックス 0)から最後の画像(インデックス -1)までの画像を削除する、という意味です。言い換えれば、現在の画像リスト中の すべての 画像です。それから tree 画像が追加され、IM に実際の結果を与えて「画像なし」型のエラーを避けます。出力を生成しないようにするには、「[NULL:](files.html#null)」出力画像も使えました。画像インデックスが存在しない場合、あるいは数値範囲が逆順の場合、「[-delete](https://imagemagick.org/command-line-options/#delete)」はその特定の画像削除を黙って無視します。たとえば、引数「-25」は画像リスト中の後ろから 25 番目の画像を削除しようとしますが、25 枚未満の画像しかなければ黙って何もしません。したがって、次のようなシーケンスを使って 24 枚の画像のローリングアニメーションを生成できます…

  magick animation.gif  new_frame.gif  -delete -25  animation_new.gif

ただし、画像数が 24 枚以下なら画像は削除されません。その結果、アニメーションはコマンドが実行されるたびに 1 フレームずつ増えていき、最大 24 フレームに達します。その後は、新しいフレームが追加されると同時に、最も古い(最初の)フレームが削除されます。IM v6.3.4 以降、「[-delete](https://imagemagick.org/command-line-options/#delete)」は、番号範囲が逆順になるような画像を削除しません。つまり、その最後の例は次のように書き換えられます…

  magick long_animation.gif  new_frame.gif  -delete 0--25  animation_new.gif

今度は、「[-delete](https://imagemagick.org/command-line-options/#delete)」が最初の画像から後ろ 25 番目の画像までのすべての画像を削除し、リストに最大 24 枚の画像を残します。24 枚以下の画像しかなければ、削除対象として与えられた範囲は事実上逆順になり、「[-delete](https://imagemagick.org/command-line-options/#delete)」演算子は何も削除しません。

-insert {index}

[-insert](https://imagemagick.org/command-line-options/#insert)」操作は、いわば「[-delete](https://imagemagick.org/command-line-options/#delete)」の逆です。現在の画像リスト中の最後の画像を取り、それを与えられたインデックスの位置に挿入します。 |

  magick font_[0-3].gif tree.gif -insert 1 +append seq_insert.gif

[IM Output]
挿入インデックスは、画像が挿入された地点の前に現れるべき画像の数だと考えればよいでしょう。もちろん、そのインデックスにあった画像(とその後ろのすべての画像)は、新しい画像の場所を空けるために、次のインデックス位置へ押し上げられます。負のインデックス位置が使われる場合、挿入位置は、挿入される画像がリストの末尾から取り除かれた後に計算されます。つまり、挿入される画像が元の画像リストの一部でなかったかのように動作します。したがって「-insert -2」は最後の 3 枚の画像を「ロール」し、新しく挿入された画像と画像リストの末尾の間に 2 枚の画像を置きます。 |

  magick font_[0-3].gif tree.gif -insert -2 +append seq_insert2.gif

[IM Output]
プラス形式「[+insert](https://imagemagick.org/command-line-options/#insert)」は、最後の画像を画像リストの先頭(インデックス 0)に移動させ、事実上、画像リスト全体を 1 フレーム分ロールします。 |

  magick font_[0-3].gif tree.gif +insert +append seq_insert3.gif

[IM Output]
上記の逆(画像を画像リストの末尾に移動する)を行うには、まず「[-duplicate](https://imagemagick.org/command-line-options/#duplicate) 1,0」を使って最初の画像をコピーし、それから「[-delete](https://imagemagick.org/command-line-options/#delete) 0」を使って最初の画像を削除すればよいです。

-swap {index}[,{index}]

単純に言えば、「[-swap](https://imagemagick.org/command-line-options/#swap)」は現在の画像リスト中の 2 枚の画像の位置を入れ替えます。たとえば「-swap 0,2」は、現在の画像リスト中の 1 枚目と 3 枚目の画像を入れ替えます。 |

  magick font_[0-3].gif  -swap 0,2  +append  seq_swap.gif

[IM Output]
このオプションのプラス形式「[+swap](https://imagemagick.org/command-line-options/#swap)」は、現在の画像リスト中の最後の 2 枚の画像を入れ替えます。言い換えれば、「-swap -2,-1」と同等です。 |

  magick font_[0-3].gif  +swap  +append  seq_swap2.gif

[IM Output]
この演算子のおそらく最も一般的な用途は、「[-composite](https://imagemagick.org/command-line-options/#composite)」、「[-flatten](https://imagemagick.org/command-line-options/#flatten)」、「[-append](https://imagemagick.org/command-line-options/#append)」、「[-fx](https://imagemagick.org/command-line-options/#fx)」のような画像レイヤー演算子で使われる前に、2 枚の画像を入れ替えることです。 |

  magick tree.gif  frame.gif   +swap \
          -gravity center  -composite   framed_tree.gif

[IM Output]
IM v6.4 以降、数値を 1 つだけ指定した「[-swap](https://imagemagick.org/command-line-options/#swap)」は、最後の画像と、与えられた番号の画像を入れ替えます。つまり「-swap 1」は「-swap 1,-1」と同等です。 |

  magick font_[0-3].gif  -swap 1  +append  seq_swap3.gif

[IM Output]

-reverse

[-reverse](https://imagemagick.org/command-line-options/#reverse)」演算子(IM v6.3.4 で追加)は、ごく単純に画像リスト全体の順序を逆にします。 |

  magick font_[0-3].gif -reverse  +append seq_reverse.gif

[IM Output]
これは基本的に、究極のSwap 演算子です。

-clone {index_range_list}

この画像リスト演算子は少し異なります。画像リストの番号を与えると、「[-clone](https://imagemagick.org/command-line-options/#clone)」は「開き括弧」、すなわち「丸括弧」演算子によって保存された画像のコピーを作成します。つまり…

Clone は丸括弧内でのみ使うべきです

その理由は、最後に保存された(プッシュされた)画像リストから画像のコピーを抽出し、それをさらに処理できるようにするためです。たとえば。 |

  magick font_[0-2].gif \( -clone 1 -rotate 90 \) +append  seq_clone.gif

[IM Output]
引数なしの「プラス」形式「+clone」は、保存された(プッシュされた)画像リストの最後の画像のコピーを作成するだけで、それをさらに処理できます。 |

  magick font_[0-2].gif \( +clone -flip \) +append  seq_clone2.gif

[IM Output]
バージョン 6.2.2 のリリース以降、「[-clone](https://imagemagick.org/command-line-options/#clone)」演算子は、画像のカンマ区切りリスト、あるいは「_{index}-{index}_」形式のインデックス範囲を取れます。 |

  magick font_[0-2].gif \( -clone 1-2 \) +append  seq_clone_range.gif

[IM Output]
もちろん、負のインデックスも期待どおりに振る舞います。たとえば、画像リスト全体を複製するには、番号「0」(最初の画像)と「-1」(最後の画像)を使って、つまり範囲「0--1」を使って指定できます。奇妙に見えるかもしれませんが、理にかなっており、問題なく機能します。 |

  magick font_[0-2].gif \( -clone 0--1 \) +append  seq_clone_all.gif

[IM Output]
インデックスのカンマ区切りリストを使うと、画像は指定した順序で抽出されます。 |

  magick font_[0-2].gif \( -clone 2,0,1 \) +append  seq_clone_list.gif

[IM Output]
範囲内の画像が(負のインデックスが実際の画像インデックスに変換された後に)逆順になっている場合、抽出された画像も処理の一環として逆順になります。 |

  magick font_[0-2].gif \( -clone 2-0 \) +append  seq_clone_reversed.gif

[IM Output]

Clone 画像演算子は丸括弧なしでも使え、現在の画像リストから画像をコピーして直接連結するだけです。ただし、これは本来の用途ではなく、後でその一連の操作を丸括弧で囲んだ場合に異なる結果を生むため、推奨されません。また、上記の例では、演算子を実演するために、クローンを生成して現在の画像リストに連結しています。本来は、現在の画像リスト中の画像を複製するにはDuplicate 画像演算子を使うべきです。あなたもそうすべきで、そのほうが何をしようとしているのかが明確になります。MPR: 画像メモリレジスタも画像のクローンに使え、IM v5 でも利用できました。これは実のところ、上記の画像リスト演算子が行うような単一の個別画像だけでなく、(長さ不明の)画像リスト全体を後で使うためにクローンして格納する、今も有用な方法です。

-duplicate {count}[,{index_range}]

[-duplicate](https://imagemagick.org/command-line-options/#duplicate)」を使って、現在の画像リストから画像の追加コピー(クローン)を生成できます(IM v6.6.8-7 で追加)。新しい画像はリストの末尾に追加されます。以前の(そして古い)Clone 演算子とは異なり、丸括弧の使用を必要としません。たとえば、ある画像の N 個の追加コピーを作る(合計 N+1 枚にする)には、次のようにします… |

  magick font_5.gif   -duplicate 4   +append seq_duplicate.gif

[IM Output]
この演算子は何百もの画像を非常に素早く生成できますが、画像が処理されるまでは、画像は互いの単なる「クローン」であり、実際の画像データを互いに共有している点に注意してください。したがって、複製された画像は非常にメモリ効率が良いです。複数の画像が存在する場合、最後の画像が N 回複製されます… |

  magick font_[0-1].gif   -duplicate 3   +append seq_dup_n.gif

[IM Output]
最後の画像を 1 回だけ複製したい場合は、引数の「プラス」形式を使えます。 |

  magick font_[0-3].gif  +duplicate   +append seq_dup_last.gif

[IM Output]
特定の画像を複数回複製して選びたい場合は、2 番目の引数として画像インデックスを指定できます。 |

  magick font_[0-2].gif  -duplicate 2,0  +append seq_dup_index.gif

[IM Output]
引数のインデックス部分には、N 回複製する画像インデックスのリストや範囲を含められます。たとえば、リスト全体を 2 回複製して、元の画像数の 3 倍を作ります…

  magick font_[0-4].gif  -duplicate 2,0--1  +append seq_dup_list.gif

[IM Output]

巡回(Patrol Cycle)型のアニメーションリストも、逆順にした画像リストを使えば簡単に作れます。 |

  magick font_[0-9].gif -duplicate 1,-2-1 \
          -set delay 50 -set dispose previous -loop 0  seq_reverse_anim.gif

[IM Output]
画像リスト全体をコピーしたのではなく、ごく最初(0)と最後(-1)の画像のコピーをスキップして、画像インデックスを -2 から 1 にした点に注意してください。IM のバージョンが v6.6.8-7 より古い場合でも、Clone 画像演算子を使って複製画像を生成できますが、一度に 1 セットの画像だけです。あるいは、基本的にColor Morph 演算子を誤用する技術を使って、複数の複製画像を生成できます。コツは、まず 1 回クローンして 2 枚の同一画像を生成し、それから「[-morph](https://imagemagick.org/command-line-options/#morph)」を使ってそれらの間に残りの N-2 枚の画像を生成することです。 |

  magick font_7.gif \( +clone \) -morph 3  +append seq_dup_morph.gif

[IM Output]
ただし、Color Morph 演算子を誤用すると画像が実際に処理されるため、morph が実際に画像を処理する(変化を生まないにもかかわらず)のに時間がかかる点に注意してください。また、作成される画像は元データの実際のコピーを含み、メモリを節約する単純なクローンではありません。

画像シーケンス操作の組み合わせ

これらの演算子を使うと、特定の画像のコピーを抽出し、それを修正し、その画像を取り出した場所へ戻せます。たとえば、ここでは 2 番目の画像(画像インデックス「1」)を「[-clone](https://imagemagick.org/command-line-options/#clone)」し、画像の色を青から赤へ回転させ、それから元の画像をまず「[-delete](https://imagemagick.org/command-line-options/#delete)」して新しいものを「[-insert](https://imagemagick.org/command-line-options/#insert)」することで、修正したものに置き換えます。 |

  magick font_[0-3].gif  \( -clone 1  -modulate 100,100,166 \) \
          -delete 1  -insert 1    +append seq_update_1.gif

[IM Output]
より一般的になったと思われる別の方法は、「[-swap](https://imagemagick.org/command-line-options/#swap)」を使って元の画像を置き換え、それから末尾に来た古い画像を「[+delete](https://imagemagick.org/command-line-options/#delete)」することです。これは、画像位置を 3 回ではなく 2 回だけ与えれば済みます。1 回はクローンのため、もう 1 回は修正した画像の置き換えのためです。 |

  magick font_[0-3].gif  \( -clone 2  -modulate 100,100,166 \) \
          -swap 2  +delete     +append seq_update_2.gif

[IM Output]
これらの技術は、下記の次の節複雑な画像処理とデバッグで続けて説明します。


複雑な画像処理とデバッグ

画像シーケンス演算子(上記参照)の追加のおかげで、もはや画像を一度に 1 ステップずつ処理し、毎回画像を保存して再度読み込み直す必要はなくなりました。代わりに、中間画像をメモリに保持したまま処理を続けられます。これにより、画像をファイル形式へ変換する時間と、遅いディスクへ画像を保存する実際の IO の両方で、多くの時間が節約されます。この種の画像処理コマンドは非常に長く複雑になりえます。したがって、コマンドをスクリプトに書き、各主要操作を 1 行ずつ独立した行に置くようにして、プログラミングと編集をしやすくするほうが良いです。より良い ImageMagick シェル/PHP スクリプトのためのヒントを参照してください。たとえば、ここでは黒い背景に赤いボタンを生成するために、複雑な処理シーケンス全体をたどります。 |

  magick -size 30x30 xc:black -fill white  -draw 'circle 15,15 5,15' \
          \( +clone -shade 110x90 -normalize -negate -alpha Off \) \
          \( +clone -clone -2 -compose Plus -composite \) \
          \( -clone 0 -shade 110x50 -normalize -alpha Off \) \
          \( +clone -gamma 1,0,0 \) \
          \( -clone 2,-1  -compose Multiply -composite \) \
          -append  seq_process_fx.gif

[IM Output]
magick コマンドの各行は新しい画像を生成します。例外は最後の行で、ここでは最終画像だけでなくすべての処理ステップの結果を出力するために、作業中のすべての画像を連結しています。この技術により、(丸括弧で囲まれた)各ステップが非常に複雑なコマンドの中で何を生成したかを追え、プロセスの各ステップのデバッグがしやすくなります。ボタンの初期形状を生成するのに、最初の画像のサイズと形状だけを使っている点に注目してください。なので、好きな形状や画像を自由に使えます! コマンドの残りは、以前と同じようにそれを処理します。もちろん、通常は作業中の一時画像をすべて削除します。つまり、上記の最後の行を次のようなものに置き換えます…

          -delete 0--2  seq_process_result.gif

結果を確認する他の方法は、結果を display コマンドへパイプして、画像ファイルに保存する代わりに結果を画面で見ることです。つまり、最後の行に次のようなものを使います…

          +append  miff:- | display -

あるいは「[display](#display)」の代わりに「show:」を使うと、結果の画像を画面に表示し、それから元のコマンドを続行または終了させられます。詳細はShow、画像出力の表示を参照してください。

          +append  show:

[+append](https://imagemagick.org/command-line-options/#append)」すら実際には必要なく、その場合、IM は「スペースバー」を押すことで各画像を順番に表示します。「[montage](#montage)」コマンドを使って結果をより見やすく表示するなど、さらに凝ったこともできます…

          miff:- | montage - -bordercolor blue -border 1 -geometry +2+2 show:

この種の画像処理は、画像が作成された直後に中間画像を簡単に見ることも可能にします。基本的に、「\( ... \)」文の間に次のような行を挿入できます。

          \( +clone -write show: +delete \)\

その中間画像が表示目的で出力されると、IM は自動的に処理を続行します。Show、画像出力の表示を参照してください。あるいは、代わりにこの行を挿入すると、処理のその時点までに生成された現在のすべての画像を表示できます…

          \( -clone 0--1 -append -write show: +delete \)\

画像処理ステップをデバッグして固めた後は、コードを最適化して、丸括弧のステップをそれほど多く使わず、クローン画像も減らし、結果として最後に削除する中間画像を減らせます。また、「画像合成」や「レイヤーの平坦化」は複数の画像をマージして結果の 1 枚だけを残すので、メモリ中の中間画像の総数を減らせる点も覚えておいてください。 |

  magick -font Ravie -pointsize 48 -background black -fill white \
          label:'IM' -bordercolor black -border 5  seq_label.gif

  magick seq_label.gif -alpha Off \
          \( +clone  -shade 110x90 -normalize -negate \
             +clone  -compose Plus -composite \) \
          \( -clone 0 -shade 110x50 -normalize -gamma 1,0,0 -alpha Set \) \
          -delete 0 +swap  -compose Multiply -composite  seq_button.gif

[IM Output] [IM Output]
ImageMagick が、複数のステップをすべて 1 つのコマンドで使って、任意の画像を標準的で、プログラムされ、自動化された方法で処理できることこそ、IM をこれほど強力なツールにしている点です。非常に複雑な操作をスクリプト化し、それを多くの画像に適用できます。画像リスト演算子と丸括弧は、IM を桁違いに強力にし、より少ないコマンドでより複雑な画像操作プログラムを書けるようにしました。複雑な画像処理を一緒にスクリプト化する別の例については、使用例形状からのスクリプト化された 3D 弾丸を参照してください。また、画像処理スクリプトを改善する方法、すなわち編集や理解をしやすくし、他の人があなたのしたことをたどれるようにする方法については、より良い ImageMagick シェル/PHP スクリプトのためのヒントも参照してください。


画像メタデータ:属性、プロパティ、アーティファクト

これまで、画像と、画像を構成する実際の内容、すなわちデータを見てきました。しかし画像は、単なる「画像データ」以上のものです。画像の一部であり、その画像処理や、他のプログラムが画像をどう扱うべきかに影響する、多くの属性やメタデータがあります。たとえば、画像が「オフセット」を持っていたり、より大きな「仮想キャンバス」(ページ)の一部であったりします。つまり、1 枚の画像が、一連の他の画像から成る、より大きな絵のごく一部にすぎず、「レイヤー」や「アニメーション」を形成することがあります。IM はまた、多くの画像処理演算子がその動作を変更するために使う、多くの特別な「設定」も付加します。たとえば、使う「背景色」です。これらの一部は、画像リスト全体で同じグローバル設定であり、他のものはリスト内の各画像で異なることがあります。では、画像の一部となるものには、どんな種類のものがあるのでしょうか。多くのものがあります…

  • 画像ファイル形式において、通常(ただし常にではない)画像とともに保存される画像メタデータ。たとえば、プロファイル、ラベル、キャプション、コメント、仮想キャンバス情報(ページ)です。これらはすべて画像ごとの設定で、現在の画像リスト内の各画像で異なりえます。
  • 多くの異なる画像処理演算子が使うが、一般に画像とともには保存されないグローバル設定。background、bordercolor、fill、mattecolor といった色、また font、pointsize、gravity、compose メソッド、カラーチャンネルの扱い、カラー値の読み書きビット深度です。
  • 特定の画像処理演算子のより深い低レベルな動作を制御するために使われる、エキスパート設定とデファイン。たとえば、歪みのビューポート、特別な compose メソッド引数などです。
  • 画像が ImageMagick 内部でメモリ上に実際にどう格納されるか。たとえば RGB か CMYK か。アルファチャンネルが存在し、有効か否か、また読み込み時に画像が持っていたかもしれないパレットも。ただし、これらの格納設定の一部はコンパイル時にハードコードされています(メモリ中のカラー値の Quality など)。
  • デバッグや verbose 設定のような、いくつかの一般的な IM 操作設定。通常、情報出力やエラー処理を制御します。

つまり、保存されうる、あるいは画像がどう処理されるかに影響する、多くの情報があります。そしてそれらはいくつかのグループに分けられますが、ImageMagick がこれらの各事項をどれだけうまく扱うか、またそれらがグローバルか画像固有かは、関係する具体的な事項に大きく依存します。そう、私は曖昧に言っています。具体的な話に入るまでは、曖昧にならないのが非常に難しいからです。それはまた、非常に混乱しやすくもあります。これらの値はすべて、メモリ中の画像とともに、3 つの異なる方法で格納されます…

属性(Attributes)
これらは各画像について特別なデータ構造項目として格納され、一般に各種画像処理演算子による高速で直接的なアクセスを可能にします。たとえば、画像サイズ、仮想キャンバスのジオメトリ、background、fill、stroke、matte の各色、pointsize、density、font、compose、interpolate、virtual-pixel メソッド、プロファイルブロック、時間遅延と破棄(disposal)設定、その他多くのものです。これらの一部は各画像に「固有」である一方、他のものは CLI インターフェースによってすべての画像で同じ値に設定される「グローバル」設定として扱われますが、それでも各個別画像の一部として格納される点に注意してください。属性は通常、通常の画像処理の一環として多くのオプションを使って、あるいはより一般的にはSetを使って変更されます。
プロパティ(Properties)
これらは、各画像に個別に付加されるキーと値の自由形式の文字列の集合です。各画像は、まったく異なる文字列の集合を持てます。本質的には、定期的にアクセスやデコードされる必要のない、あるいは何らかの特別な方法で使われるメタデータ項目です。この典型例は、label、caption、comment 文字列、作成日・更新日、ユーザー定義文字列、一部の演算子の結果などです。「キー」が既知の「属性」に対応しない限り、ユーザーはSetを使ってこれらを設定または変更できます。
アーティファクト(Artifacts)
これは、すべての画像で共通の、自由形式文字列のグローバルな集合です。すべての画像の読み込みと画像処理を定義または変更する、自由形式のグローバル設定を保持するために使われます。その一例が「verbose」設定で、これは一部の操作に、より詳細な magick identify 出力を含む、その動作に関する一般的な情報を出力させます。ユーザーはDefine(後述)を使って、あるいはSetの特別なケース(Set「Option:」を使ってアーティファクトを定義するを参照)を使って、これらのグローバル値を変更できます。

これら 3 つの格納方法を理解することが、ImageMagick 内で設定とメタデータの扱いがどう機能するかを知る鍵です。そして、非常に高度で通常は達成が難しい画像処理技術を行えるようになります。

画像属性/プロパティの設定・変更

単純なメタデータは、しばしば画像処理にとって最も重要な画像属性です。あまりに重要なので、画像処理演算子による高速な利用を可能にするためにデコードされ、画像データ構造内で利用可能になっています。そうしたデータは一般に 2 つの方法で変更されます。画像が読み込まれるか作成される際に画像メタデータを直接変更する方法。あるいは、すでにメモリにある画像のメタデータを変更する方法です。たとえば、-label 'string'」は、その設定が設定された 後に 読み込まれるか作成されるすべての画像にコメントを設定します。一方、「-set label 'string'」は、すでにメモリにある現在の画像リストのすべての画像の「label」メタデータを変更します。2 つの方法がある理由は、歴史的な後方互換性と利便性のためです。基本的に「-label」は、伝統的に、それが適用される画像が読み込まれる 前に 設定されてきました。それは、設定または変更された 後に 読み込まれる(または作成される)画像にのみ影響します。たとえば…

  magick -label one  image_one.png \
          -label two  image_two.png     output_image_list

一方、「[-set](https://imagemagick.org/command-line-options/#set)」演算子は、それ以前に読み込まれたものを含め、現在の画像リストにある すべての 画像を変更します。したがって、これまでに読み込んだすべての画像に適用したい場合を除いて、一般に丸括弧を使って、オプションを適用する対象の画像を制限しなければなりません。

  magick \( image_one.png -set label one \) \
          \( image_two.png -set label two \)  output_image_list

+label」を使って設定を未定義にでき、その場合、画像が読み込まれるか作成される際に label メタデータはそのまま残されます。読み込まれた画像も label を持たない場合、IM は何らかの論理的なデフォルトへフォールバックします。label の場合、それは単に空文字列です。両方の方法のより詳細で具体的な例は、ラベル付けのためにこれを多用するMontage 画像のラベル付けで見られます。この画像メタデータ設定の「二重性」は、他のオプションにも存在します。これには…「[-comment](https://imagemagick.org/command-line-options/#comment)」、「[-caption](https://imagemagick.org/command-line-options/#comment)」、「[-page](https://imagemagick.org/command-line-options/#page)」、「[-dispose](https://imagemagick.org/command-line-options/#dispose)」、「[-delay](https://imagemagick.org/command-line-options/#delay)」が含まれます。ただし、仮想キャンバスのサイズと画像オフセット設定(ページ)には、特別な演算子「[-repage](https://imagemagick.org/command-line-options/#repage)」を使う 3 つ目の方法もあります(下記の仮想キャンバスを参照)。
たとえば、ここでは利用可能なすべての設定方法を使って、個々の画像からアニメーションを作成しながら、それらの「仮想キャンバスオフセット」すなわち「ページ」を設定します… |

  magick -delay 100 -dispose Background \
            -page 100x100+5+10  eye.gif  \
            -page +35+30        news.gif  \
            \( storm.gif  -set page +62+50 \) \
            \( tree.gif   -repage   +10+55 \) \
          -loop 0  animation_page.gif

[IM Output]
ご覧のとおり、別々の画像ファイルから複数画像リストを作成するときは、伝統的な(set でない)方法のほうがシンプルです。しかし、すでにメモリに読み込まれた、あるいは何らかの複雑な画像処理メソッドによって作成された画像を変更する必要がある場合は、「[-set](https://imagemagick.org/command-line-options/#set)」や専用の「[-repage](https://imagemagick.org/command-line-options/#repage)」演算子のほうが良いです。たとえば、最後の例で 3 番目の画像(画像インデックス「2」、すなわち「tree」)の画像オフセットを変更するには… |

  magick animation_page.gif \
          \( -clone 2 -set page +55+10 \) -swap 2  +delete \
          animation_mod.gif

[IM Output]
画像リスト内の個々の画像を抽出して変更する、より極端な例については、アニメーションのフレーム単位の変更を参照してください。ここでは「[-set](https://imagemagick.org/command-line-options/#set)」を使ってすべての画像にコメントを指定し、それから 1 つの特定の画像を変更する別の例を示します。

  magick xc: -duplicate 9 \
              -set comment 'T minus %[fx:n-t]' \
              \( -clone 7 -set comment 'We have ignition!' \) -swap 7 +delete \
              -format "image #%p : %c" info:

[IM Text]

メモリ中の画像に属性を設定する代替手段として、「[mpr:](files.html#mpr)」を使えます。たとえば、ここではメモリ中にある「Bad」コメント付きの画像を取り、そのコメントを「Good」なものに置き換えます…

  magick -comment 'Bad Comment' rose: \
          -write mpr:rose +delete \
          -comment Good   mpr:rose  rose.jpg


  magick identify -format "image comment = %c" rose.jpg

[IM Text]

これは機能しますが、特にアニメーションのような複数画像を扱うときは、極めて扱いづらく面倒です。実のところ、IM バージョン 5 では、これが画像のメタデータを変更する唯一の方法でした。(うんざりですね!)

一般的なグローバル属性

作成中(Under Construction)

これらの属性のほとんどは、一般に画像をメモリに読み込む前か後にグローバルに設定されます
(どちらでも違いはありません)。それらは通常、後続の画像処理操作の一般的な制御として使われます。

 * 多くの設定は単に、必要に応じて使うためにグローバルに保存されます
     -fill  -background  -bordercolor  -strokecolor  -mattecolor  -quantize
     +dither  -channels  -size  -gravity  -units  -density  -font  -pointsize
     -tile

 * 一部の設定は、画像がディスクに保存される方法や、画像とともに保存される
   メタデータに影響します。これには次のものが含まれます
     -loop  -compression  -quality  -depth
     -density  -background

 * -compose は厄介です。グローバルにしか設定できないからです。しかし設定されていなければ
   個々の画像が異なる設定を持てます(レイヤー化のため)。

   ただし、これらのほとんどは(+ バージョンを使って)オフにでき、これにより演算子は
   画像メタデータから設定を取得します
   (例:+background は、存在すれば元の画像のメタデータへフォールバックします)
   が、より一般的には何らかのデフォルト値へフォールバックします。(例:
   +gravity は 'None' へフォールバックし、gravity が設定されていないことを意味します)。

   これらのいくつかは、書き込み時に画像とともに保存もされます。具体的には
   GIF 形式は -background と -bordercolor を画像属性の一部として保存しますが、
   これらは通常、これらの画像を読むプログラムによって無視されます。

一部の設定が複数の場所で使われていることに気づいたかもしれません。
たとえば -density です

  * Postscript、PDF、WMF 画像形式のような多くのベクター形式画像の
    読み込みで使われます。
  * label: caption: text: のような特別な画像生成器でも使われます。
  * -annotate -draw -polaroid 演算子でのフォント描画の一部として使われます。
  * そして最後に、一部の形式は density や解像度を画像ファイル形式の一部として
    保存します。たとえば postscript で包まれたラスター画像、JPEG、TIFF です。

設定がこれほど混乱しうるのも無理はありません。

仮想キャンバス、および Page と Repage 演算子

IM 内における「ページ」すなわち「仮想キャンバス」設定の主目的は、画像の「実際の」部分(実際にカラーピクセルデータを含む部分)が、「キャンバス」というより大きな文脈にどう収まるかを定義することです。これは、複数の画像が関わり、複数画像のレイヤーGIF アニメーションのために互いに相対的に配置される必要がある場合に特に重要です。また、Postscriptテキストの「ページ」画像の生成において、画像がより大きな物理的な紙、すなわち「ページ」のどこに収まるかを定義するためにも使われます(それゆえ「ページ」という用語の名前があります)。最もよく使われるのは複数画像のレイヤーGIF アニメーションにおいてですが、画像を切り抜く(クロップ)際やトリミングする際に元の位置を記憶することにも、また複数画像リスト合成汎用画像歪みにも関わります。さて、「ページ」は 2 つの別々の部分を定義します。画像が存在するより大きな空間を定義する「仮想キャンバス」すなわち領域と、その「キャンバス」内で実際の画像が配置される「オフセット」すなわち位置です。 負の「オフセット」は許可されますが、「キャンバスサイズ」は 0,0 から与えられた幅と高さまでの領域に限定されます。つまり、正のキャンバスしか指定できません。
これら 2 つの側面、「サイズ」と「オフセット」は密接に関連していますが、通常はこれらの側面を別々に、あるいはより制御された方法で扱いたいものです。そこで、通常の「[-page](https://imagemagick.org/command-line-options/#page)」と「[-set](https://imagemagick.org/command-line-options/#page) page」メソッドに加えて、より細かい制御を可能にする別のオプション「[-repage](https://imagemagick.org/command-line-options/#repage)」も提供されています。具体的には…
+repage
引数なしで、画像の仮想キャンバスを実際の画像そのものにリセットします。つまり、画像が持ちうる仮想キャンバス情報をすべてクリアするだけです。これは、切り抜き(クロップ)トリミングのような画像細分化演算子を適用した後にしばしば重要です。GIF や PNG 画像ファイル形式に保存する前に仮想キャンバスのサイズとオフセットを取り除くことが特に重要です。多くのブラウザがキャンバス/オフセット情報を画像表示の一部として使うからです。
-repage WxH
既存の画像の仮想キャンバスサイズを変更しますが、そのキャンバス上の画像位置はリセットしません。なお、この引数を「[-page](https://imagemagick.org/command-line-options/#page)」または「[-set](https://imagemagick.org/command-line-options/#set) page」に与えると、画像位置が「+0+0」にリセットされ、これはおそらく望まれません。
-repage +X+Y
画像をキャンバスサイズを変えずに、仮想キャンバス上のこの絶対位置へ移動するだけです。
-repage +X+Y\!
与えられた数値(正または負)を画像の既存のオフセット位置に加えることで、仮想キャンバス上の画像を相対的に移動します。
-repage 0x0
画像全体を含む最良の仮想キャンバスサイズを見つけようとします。ただし、負の成分を持つ仮想キャンバスを指定する方法がないため、これは負のオフセットを持つ画像では失敗します。問題を避けるため、可能な最小のキャンバスサイズとして実際の画像のサイズを使います。つまり、ゼロ次元の仮想キャンバスを割り当てることは決してありません。
-repage 0x0+X+Y
画像のオフセットを移動し、それから画像の新しい位置に最もよく合うよう仮想キャンバスをリサイズします。
-repage 0x0+0+0
[+repage](https://imagemagick.org/command-line-options/#repage)」、または「[+set](https://imagemagick.org/command-line-options/#set) page」、または「[-set](https://imagemagick.org/command-line-options/#set) page 0x0」と同等です。すべての仮想キャンバスとオフセット情報が取り除かれます。
-repage WxH+X+Y
[-set](https://imagemagick.org/command-line-options/#set) page WxH+X+Y」と同等です。つまり、与えられた値を直接割り当てるだけです。
!」フラグを使うと、与えられたオフセットが画像の現在のオフセットに対する相対変位になる点に注意してください。つまり、「-repage +5+0\!」は、仮想キャンバスサイズを変更せずに、画像のオフセットを右に 5 ピクセル移動します。現在のところ、仮想キャンバスサイズの相対的なリサイズを直接指定することはできません。ただし、FX パーセントエスケープを使えば可能です。とはいえ、これは一般には必要ありません。一例が特定の色でのトリミングで示されています。画像に最終的な負のオフセット位置を与える際には注意が必要です。GIF ファイル形式はこれを扱えず、負であればゼロにリセットするからです。また、一部のブラウザは負のオフセットを持つ PNG 画像を与えられるとおかしくなります。どの仮想キャンバス情報が画像とともに保存されるかは形式依存です。 JPEG 多くの画像ファイル形式と同様に、JPEG 画像は仮想キャンバス情報を一切保存しません。情報は単に無視され、失われます。
GIF 仮想キャンバスのサイズとオフセットは、その GIF アニメーション処理の一部として保存されます。ただし、負のオフセットは扱いません。負のオフセットは保存時にゼロにリセットされます。
PNG オフセット、さらには負のオフセットも保存されますが、PNG ファイル形式は通常、仮想キャンバス情報を保存しません。ただし、IM によって保存される PNG 画像には仮想キャンバスのサイズ情報が含まれますが、これは他の IM コマンドによってのみ使われます。IM がこの IM 固有の属性なしの PNG 画像を読む場合、画像が仮想キャンバス上で確実に見えるよう、画像の仮想キャンバスを適切なサイズに設定します(「-repage 0x0」のとおり)。オフセットのない画像の場合、それは仮想キャンバスが実際の画像と同じサイズになることを意味します。
GIF や PNG のような一部の形式は仮想キャンバス情報を保存しますが、JPEG のような他の形式は保存しません。上記の形式はすべて、仮想キャンバス情報について独自の制約を持ちます。内部の MIFF ファイル形式だけが、そうした制約を一切持ちません。「[-page](https://imagemagick.org/command-line-options/#page)」は「text:」や「ps:」画像生成演算子に対して特別な意味を持つ点に注意してください(Text: 複数行テキストファイルPS: Postscript 形式のテキストとグラフィックスを参照)。したがって、これらの画像の作成時には、通常のキャンバスサイズとオフセットの意味は使われません。

Set と画像ごとのプロパティ

しかし、IM は画像が持ちうるあらゆる設定を扱うオプションを作れるわけではありません。それはとうてい不可能でしょう。それだけでなく、ユーザーはしばしば自分自身の設定を追加または定義したいものです。このため、「[-set](https://imagemagick.org/command-line-options/#set)」オプションは、実際には任意の設定を任意の値で定義できます。その設定が画像の特定の既知の属性(演算子による高速アクセスを可能にする形で保存されるもの)でない場合、それは「プロパティ」(文字列の配列)として画像に保存され、verbose な「magick identify」出力の末尾近くに一覧表示されるか、パーセントエスケープを使って取得・展開されます。たとえば、組み込みの rose 画像は、自動的に 3 つの「プロパティ」を生成します。2 つの日付文字列と、「signature ハッシュ」です。これに、私は自分自身のユーザー定義「プロパティ」設定も加えました。

  magick rose:  -set my_property my_value   -verbose info: |\
    sed -n '/Artifacts/q; /Properties/,$ p'

[IM Text]

一部の画像処理演算子は、特に注目すべき値を画像の「プロパティ」として返すことさえあります。それらは他の演算子には必要ないので「属性」としては保存されませんが、ユーザーが使えるかもしれない「プロパティ」文字列として保存されます。たとえば、ベストフィットラベルによって選ばれた最終的な pointsize は、特別な画像プロパティとして保存されます。 |

  magick -size 100x label:Anthony  -verbose -identify  property_label.gif |\
    sed -n '/Artifacts/q; /Properties/,$ p'

[IM Output]
| [IM Text]


| label: 生成器自体も「label」属性を設定し、それがたまたまプロパティ文字列として保存される点に注意してください。
---|---
| _すべての「プロパティ」は自由形式の文字列データ型として保存され、画像メタデータとして格納されます。

このため、すべての「属性」が「プロパティ」として保存されるわけではありません。多くの属性は、画像処理演算子によって数値データとして直接保存・使用される必要があるからです。この一例が仮想キャンバスの「page」属性です。_
---|---
ここでは identify の「[-format](https://imagemagick.org/command-line-options/#format)」設定を使って、IM に、作成して破棄したラベルの pointsize を出力させます。 |

  magick -size 100x label:Anthony \
          -format 'pointsize = %[label:pointsize]pts' info:

[IM Output]
この情報を使って新しいラベル画像を生成するのはトリッキーで、下記で見ていきます。使える最も有用なユーザー定義設定の 1 つが「filename:」設定です。たとえば…

  magick rose: -set filename:my_area '%wx%h' 'rose-%[filename:my_area].png'

上記は「rose-70x46.png」という名前の画像を生成します。セキュリティ対策として、「filename:」文字列を前に付けたユーザー定義設定だけが出力ファイル名の中で使えますが、任意の名前を使えます。この詳しい例についてはファイル名パーセントエスケープを参照してください。

Define とグローバルアーティファクト

定義された値は「アーティファクト」として知られ、すべての画像でグローバルに定義され、特別な「[-define](https://imagemagick.org/command-line-options/#define)」演算子を使って設定されます。そうした「アーティファクト」の主目的は、画像ファイル形式コーダー画像処理演算子 が追加(あるいは帯域外)の設定として使える特別な設定としてです。基本的に、別の「属性」を作る必要なく、特定の要件のための自由形式設定の追加を可能にします。また、グローバルに設定されるため、特定の画像にではなく、画像シーケンス内のすべての画像に付加され、まだ画像が読み込まれていない、あるいは作成されていない状態でも利用できます。 API は、異なるアーティファクトの集合が付加された複数の画像リストを持てますが、コマンドラインインターフェース(CLI)はアクティブな画像リストを 1 つしか持たないため、「アーティファクト」は本当にグローバルである点に注意してください。
言い換えれば、「定義されたアーティファクト」は、エキスパートユーザーが特定の演算子の通常または標準の動作を、通常の引数使用を超えて変更する方法を提供します。たとえば、そうした画像の読み書きの両方のためのJPEG コーダー設定です…
  -define jpeg:size=300x200
  -define jpeg:preserve-settings=1
  -define jpeg:optimize-coding=true

画像歪みオプション、たとえば…

  -define distort:scale=2
  -define distort:viewport=44x44+15+0

リサイズフィルター制御、たとえば

  -define filter:blur=0.75
  -define filter:support=1.25

一部のアーティファクトのデファインには、ユーザーによって非常に頻繁に使われるため、ショートカットがあります。たとえば、「[-verbose](https://imagemagick.org/command-line-options/#verbose)」操作制御(後述)は、実のところ「-define verbose」を使うのと同等で、「verbose」アーティファクトを作成します。たとえば…

  magick xc: -verbose info: |\
    sed -n '/Tainted:/q; /Artifacts:/,$ p'

[IM Text]

したがって、プラス形式「[+verbose](https://imagemagick.org/command-line-options/#verbose)」は「verbose」アーティファクトを取り除くだけで、「+define verbose」と同等です。

アーティファクトと遅延パーセントエスケープ

アーティファクトはまた、define が与えられた後に読み込まれる画像へ割り当てるべき特別な属性を保持するためにもしばしば使われます。「[-label](https://imagemagick.org/command-line-options/#label)」設定も、ユーザーが与えた引数でアーティファクトを設定するだけです。このアーティファクトは、新しい画像が読み込まれるか作成された後に、「label設定またはプロパティへ変換されます。たとえば、label を設定して「rose:」画像を作成します

  magick -label "%wx%h"  rose: -verbose info:  |\
      sed -n '/Tainted:/q; /Properties:/,$ p'

[IM Text]

つまり、「[-label](https://imagemagick.org/command-line-options/#label)」は、まず示された「label」アーティファクトを定義しました。後に rose 画像が作成された(そしてそのサイズ属性が判明した)とき、IM はそのグローバルアーティファクトを画像固有の「プロパティ」へ変換し、そのときに初めてパーセントエスケープを展開しました。これは遅延パーセントエスケープとして知られています。同じことが、「[-comment](https://imagemagick.org/command-line-options/#comment)」や「[-caption](https://imagemagick.org/command-line-options/#caption)」のような他のいくつかの設定オプションでも起こります。遅延パーセントエスケープがあるからこそ、「[-define](https://imagemagick.org/command-line-options/#define)」は文字列を保存するだけで、「[-set](https://imagemagick.org/command-line-options/#set)」演算子が展開を行うのです。

Set「option:」を使ってアーティファクトを定義する

上記で、特別な目的の個人的なプロパティを、画像ごとに「[-set](https://imagemagick.org/command-line-options/#set)」する方法を示しました。たとえば… |

  magick -size 80x40 xc:  -set myinfo 'I love IM!' \
          -gravity center -annotate 0x0 '%[myinfo]' \
          property_annotate.gif

[IM Output]
しかし、プロパティは特定の画像に付加されるため、新しい画像の作成にそれらを使うことはできません。たとえば、これは失敗します… |

  magick rose: -set myinfo 'I love IM!'  label:'== %[myinfo] ==' \
          -gravity center  -append   property_append_fail.gif

[IM Output]
ご覧のとおり、「myinfo」プロパティは、連結されたラベルで見つからなかったか、含まれませんでした。一方、グローバルに定義されたアーティファクトは画像生成器が利用できます。画像生成器や画像ファイルコーダーが各種制御設定のためにそれらを読み取れるよう、そうである必要があるのです。したがって、「[-define](https://imagemagick.org/command-line-options/#define)」を使えば期待どおりに機能します。 |

  magick rose: -define myinfo='I love IM!'  label:'== %[myinfo] ==' \
          -gravity center  -append   artifact_append.gif

[IM Output]
では、画像のプロパティや属性を使ってラベルを作成するにはどうすればよいでしょうか。「[-define](https://imagemagick.org/command-line-options/#define)」オプションは、現在のところ画像プロパティの使用を許可していません! コツは、「[-set](https://imagemagick.org/command-line-options/#set)」オプションを使うときに特別なプレフィックス「option:」を使うことです。この追加により、「[-set](https://imagemagick.org/command-line-options/#set)」が、プレフィックスに続く名前で「アーティファクト」を定義するようになります。たとえば、これは最後の例と同等です。 |

  magick rose: -set option:myinfo 'I love IM!'  label:'== %[myinfo] ==' \
          -gravity center  -append   property_option_append.gif

[IM Output]
さらに重要なことに、「[-set](https://imagemagick.org/command-line-options/#set)」オプションはパーセントエスケープを展開します。これは、何らかの画像ごとのプロパティがあれば、それをグローバルなアーティファクトへ変換できることを意味します。たとえば、ここではラベルを作成し、それから「label:」画像生成器が作成した「label:pointsize」プロパティを、グローバルアーティファクト「my_pointsize」へ変換します。アーティファクトとして、この情報は 2 枚目のラベル画像を作成するときに利用できます。それから 2 つのラベルを(区切りの「gray」線とともに)連結します。非常にトリッキーな例です。 |

  magick -size 100x -gravity center label:Anthony \
          -set option:my_pointsize '%[label:pointsize]' \
          -set option:my_height '%h' \
          -size 100x1 xc:gray \
          -size 100x label:'at %[my_pointsize]pt and %[my_height]px high' \
          -append  property_append.gif

[IM Output]
上記の「-set option:...」の配置に注目してください。もしこれを「xc:gray」の作成の 後に 置いたら、グローバルアーティファクトの設定に使われるのはその画像になってしまいます。つまり、グローバルアーティファクトに格納される値を定義するのは、最後の画像のプロパティだけだからです。その理由は、アーティファクトを定義するのに最後の画像だけが使われるからです。実際に本当に起こっているのは、「[-set](https://imagemagick.org/command-line-options/#set)」が、グローバルアーティファクトを生成しているにもかかわらず、現在の画像リスト内のすべての画像に適用される、ということです。したがって、各画像が自身のプロパティをグローバルアーティファクトへ割り当て、それ以前に割り当てられた値を置き換えます。完了したとき、最後の画像だけがアーティファクトを「定義」したことになります。 | 現時点では、「FX エスケープ」にはプロパティやアーティファクトを読み取る方法がありません。したがって、現在のところそうした値に対して算術演算を行うことはできません。
---|---

読み書き時の画像タイプ

[-type](https://imagemagick.org/command-line-options/#type)」演算子/設定は、画像が読み込まれるか書き出される際に使うスタイルや色空間を定義し、結果の画像(メモリ中、または画像ファイル中)が期待どおりのものになるようにします。これの一環として、ファイル I/O の時点で何らかの色空間の変更を行うことがありますが、それは画像が期待された形式になるようにするためだけです。たとえば、「[-type](https://imagemagick.org/command-line-options/#type)」には特別な「bilevel」設定があり、一部の画像形式で画像を 2 色のモノクロ画像として変換・保存するのに使えます。同様に、「TrueColor」や「TrueColorAlpha」を使うと、画像が実際には純粋にグレースケールであっても、TIFF 画像をフルカラー RGB 画像として強制的に保存できます。他の設定には「GrayScale」と「GrayScaleAlpha」があり、書き込まれる画像がグレースケールのみ(それぞれ透明度なし、または透明度あり)になるようにします。あるいは「Palette」は、このオプションをサポートする形式で、インデックス付きカラーマップの使用を強制します。画像ファイル形式の読み込み時には、「[-type](https://imagemagick.org/command-line-options/#type)」の「TrueColorAlpha」設定により、読み込まれる JPEG 画像に、JPEG 形式自体は透明度を扱えないにもかかわらず、メモリ格納に「Alpha」チャンネルを強制的に追加させられます。PNG ファイル形式へ書き込む際に「[-type](https://imagemagick.org/command-line-options/#type)」を「Pallette」に設定すると、色インデックス付きの「PNG8」内部画像形式の使用を強制します。同様に「BiLevel」を使うと、ほとんどの画像ファイル形式で、カラー画像を白黒へディザリングするよう IM に強制します。残念ながら、「[-type](https://imagemagick.org/command-line-options/#type)」の正確な意味と機能は、読み書きしている特定の画像形式に依存します。各種の画像ファイル形式の使用例領域を参照してください。特定の PNG の例については、PNG 出力形式を参照してください。


画像の品質を制御する

Depth —— ファイル形式のビット深度

Quality(品質)Depth(深度) は、ディスカッションフォーラムやこれらの使用例ページでしばしば語られる 2 つの用語なので、少し説明したいと思います。Quality は ImageMagick のコンパイル時設定で、IM のメモリ中および処理中に画像を格納するために使う値のサイズを決定するために使われます。基本的に、それは特定の IM がコンパイルされた 処理の品質(Quality of Processing) を意味します。Depth は、画像が画像ファイル形式へ/から読み書きされる際に使われる値のサイズです。したがって、より変動しやすいものです。そして「[-depth](https://imagemagick.org/command-line-options/#depth)」設定、あるいは読み込まれた画像の元の「depth」によって制御されます。これについてはこの後すぐに詳しく述べます。覚えておいてください…

Quality は「メモリ中」の値のサイズで、IM にコンパイルされる。
Depth はファイル形式の値のサイズで、可変である。

さて、ほとんどの画像形式は depth 8 です。つまり、画像で使われる各カラー値を保持するのに 8 ビット(すなわち 0 から 2^8-1 までの値)を使います。これは、red が 0 から 255、green が 0 から 255、blue チャンネルが 0 から 255 の値です。より一般的には、この種の画像は 24 ビット画像と呼ばれます(つまり「ピクセルあたりのビット数」であって、「[-depth](https://imagemagick.org/command-line-options/#depth)」設定で使われる「値あたりのビット数」ではありません)。これには JPEG のような形式が含まれます。アルファチャンネルも関わる場合は、4 × 8 ビット値、すなわち 32 ビット/ピクセルの画像になります。これは PNG 画像が通常使うもので、そうした画像は値あたり 16 ビットでも保存できます。多くの人が 8 ビット画像(8 ビット/ピクセル)と呼ぶものは、実際には 8 ビットのパレットすなわちカラーマップを持つ画像です(画像全体で最大 256 色の制限を与えます)。実際のピクセルデータは 8 ビットのインデックス値(0〜255)で、それがそのピクセルの色をカラーテーブルから参照するのに使われます。つまり「ラスター」(ピクセル配列)は、別の色テーブルから実際のピクセル色を参照するために使われるインデックスにすぎません。言い換えれば、8 ビット画像も 8 ビット深度を持つものの、その 8 ビットはカラールックアップテーブルへのインデックスであって、実際の色ではありません。GIF 画像はこの良い例です。そうした画像の透明度は通常、GIF 形式のように、(「[-transparent-color](https://imagemagick.org/command-line-options/#transparent-color)」メタデータ設定で設定される)特定の色を透明度を表すものとして指定するか、あるいは一部の PNG8 画像(これも GIF のようなカラー画像です)で使われるように、カラーテーブル内の特定の色数のための特別なプロファイルを使うことで扱われます。一般に…

24 ビット画像3 × 8 ビット値 - カラーチャンネル 3 つのみ
32 ビット画像4 × 8 ビット値 - 3  + アルファチャンネル
8 ビット画像8 ビットのカラーインデックス画像256 色制限あり

ほとんどの画像形式はカラー値を 8 ビット/値の深度でしか保存しないため、多くの人が「Q」すなわち Quality レベルを depth 8 にして IM をインストールしており、これはより通常の Q16 版 IM よりはるかに少ないメモリで済み、画像をより速く処理します。しばしば 3 倍以上速いです。これらの Q8 版は、一般的な画像処理(切り抜きなど)や形式間の変換にうまく機能し、単純な画像の生成、注釈付け、画像の重ね合わせにもうまく機能します。しかし、低品質の IM は速くてメモリ効率が良い一方で、複数のカラー変更、リサイズ、暗くする、明るくする、ガンマやヒストグラムのカラー補正などを含む複雑な操作シーケンスを使い始めると、うまく機能しません。Q8 では、メモリ中の中間画像が 8 ビット品質で格納されたままになるため、複数の操作がそれぞれ小さな増分的なカラー歪みを導入します。その結果、特に白と黒に近い極端な色で、丸め効果が生じうるのです。(後述)。

Quality —— メモリ中のビット品質

繰り返しますが、Quality は ImageMagick のコンパイル時設定で、IM のメモリ中および処理中に画像を格納するために使う値のサイズを決定するために使われます。ソースから ImageMagick を再コンパイルする以外に、変更することはできません。したがって「Q16」の ImageMagick(IMv7 のデフォルト)は、「Q8」版 ImageMagick と同じ量の画像データを保持するのに少なくとも 2 倍のメモリを使い、CPU によってはかなり遅くなりますが、今日のプロセッサではそれはあまりありそうにありません。同様に「Q32」や「Q64」版もコンパイルできますが、これらはあまり一般的ではなく、通常はごくハイエンドの画像処理でしか使われません。下記の新しい HDRI コンパイル品質オプションも参照してください。「Q16」の ImageMagick はまた、各ピクセル値についてより多くのビット情報を保存できます。つまり、カラー値は「0」から「2^_quality_ -1」までの範囲の整数として保存されます。その最後の値は、IM プログラミングでは現在の「QuantumRange」(あるいは古い廃止された名前「MaxRGB」)として知られています。IM のコンパイル時に使われる Quality 設定が高いほど、メモリに画像を格納する際のカラー値がより正確になります。これは、画像の処理中に多くの非常に小さな、わずかな色の変化を生成した場合、それらの変化が ImageMagick のメモリ内格納で保存され、後の処理ステップで使えることを意味します。リサイズ、ノイズフィルター、ぼかし、シャープ化、平均化、グローバルカラー、ガンマ、ヒストグラムの変更、あるいは多くの複雑な画像合成操作のような操作は、すべて Q8 の IM で望ましくないカラーエラーを生み、結果の画像に非常にはっきりしたカラーアーティファクトを作りえます。もちろん、最終画像を 8 ビット「depth」の画像形式に保存すると、それらのカラー値は 8 ビットへ「量子化」されますが、メモリ中の画像処理中は、画像の中間的な品質が保たれます。IM が使うより高い品質レベルの情報を保つ形式もいくつかあります。たとえば、MIFF IM 形式、列挙ピクセルの TXT 形式、そして NetPBM 画像形式です。ただし、Q8 版の IM では 16 ビット深度の画像を出力できるものの、そうした画像は依然として 8 ビット深度相当の情報しか持ちません。保存すべき品質がメモリに存在しないからです。 | _IM が 8 ビット値を使って画像を読み込む場合(多くの画像形式がそうします)、画像の「depth」は 8 ビットに設定され、保存時には、Q16 版の IM で画像を処理しても、IM は通常その同じ 8 ビット値深度で画像を保存します。この設定を上書きするか、その画像の「[-depth](https://imagemagick.org/command-line-options/#depth)」設定をクリアすると、IM はその画像を IM のメモリ内品質に合う可能な限り最良の深度で保存します。

また、画像のリサイズのように追加の色を生成する多くの演算子も、メモリ中の画像の「depth」をコンパイル時の品質設定にリセットするので、IM は可能であればより高い深度で保存しようとする点に注意してください。

_
---|---

HDRI —— 浮動小数点品質

HDRI、すなわち High Dynamic Range Imaging(ハイダイナミックレンジイメージング)は、もともと、シーンの明るい領域と暗い領域を同時に見られる私たちの目の能力を、より自然に表現するために設計されました。実用的な画像処理の観点では、それ以上のことを多く行います。HDRI 版の IM(デフォルトのビルド)は、メモリに格納される画像に浮動小数点値を使うようコンパイルされており、画像操作のより正確な HDRI 処理を行えるようにし、そうした操作が画像の色を極端な値で「クリップ」しないようにします。HDRI は、メモリ内格納のためのデフォルトのコンパイル時Quality 設定と同じ色範囲を使います。つまり、値は依然として「0」から「Quantum Range」までの範囲で、黒から白を意味します。しかし、値は整数ではなく浮動小数点(C プログラミングの用語で「doubles」)を使って保存されるので、値を整数へ丸めることによる「量子化」効果が見られません。値はまた、「Quantum Range」を超えても負の値に入っても「クリップ」されません。基本的に、処理ステップ間で失われる情報がはるかに少なくなります。したがって HDRI は、一時的に負の値を使ったり、非常に小さい値や非常に大きい値への強いスケーリングを伴ったりする、極めて重い数学的処理を画像に施す予定がある場合に 不可欠 です。特に、高速フーリエ変換(FFT)機能をフル活用したいユーザーにとって重要で、これらのページで HDRI 版 IM の例を最も多く目にするのは、まさにこの場面です。HDRI 版の IM のコンパイルに関する情報については、メインの IM ウェブサイトの ImageMagick で HDRI を有効にするを、また Windows と Ubuntu Linux 固有の情報については、ユーザーフォーラムのフーリエ変換アナウンス討論を参照してください。HDRI を使う際に念頭に置いておくべき重要な演算子の 1 つが「[-clamp](https://imagemagick.org/command-line-options/#clamp)」です。このオプションは、画像の通常範囲外に収まる値をクリップします。つまり、任意の負の値はゼロにクリップされ、「QuantumRange」より大きい任意の値はその値に設定されます。ただし、浮動小数点値を整数へ「丸める」ことはしません。

量子化効果、HDRI 対 非 HDRI

量子化丸め… たとえば、ここでは LevelReverse Level 演算子を使って、グラデーション画像の色範囲を 0 から 15 の値だけを使うよう圧縮し、それから再び伸長します。結果のグラデーションは、追いやすくするために、(スクリプト「[im_profile](../static/img/scripts/im_profile)」を使って)画像プロファイルとしても表示されています。 |

  # 通常の非 HDRI 版 IM を使用…
  magick -size 20x600 gradient:  -rotate 90 \
          +level 0,15  -level 0,15  level_rounding.png
  im_profile -s level_rounding.png  level_rounding_pf.gif

[IM Output]

[IM Output]

今や見える深刻な丸め(量子化効果)に注目してください。グラデーションのプロファイルに段差を形成しています。16 段階のグレーレベル値しか使われなかったため、事実上、画像をわずか 4 ビットの色深度へ変換したことになります! この種の量子化丸め問題は、画像の基本的なリサイズや切り抜きを超えた複数の画像処理タスクを行うだけで、IM Q8 版で非常によく起こる点に注意してください。これは、より通常の IM Q16 が追加のメモリ使用で解決するものです。量子化丸めが IM Q16 で問題になるのは、高速フーリエ変換(FFT)や、ハイダイナミックレンジ画像を生成するための異なる露光時間(光強度)の画像のマージのような、本当に重い画像処理を使うときだけです。これこそ、そもそも HDRI が ImageMagick に追加された理由です。焼き付きとクリッピング… そしてここでは、元の黒と白のカラー値が「Quantum Range」を大きく超えるようグラデーションを「引き伸ばし」、それから再び復元します。 |

  # 通常の非 HDRI 版 IM を使用…
  magick -size 20x600 gradient:  -rotate 90 \
          -level 20%  +level 20%    level_clipping.png
  im_profile -s level_clipping.png  level_clipping_pf.gif

[IM Output]

[IM Output]

通常の IM は両端で情報を失っていることが分かります。下端の値は、値が負になると「焼き付き(burned)」、上端の値は、値を格納するのに使われる整数の最大「Quantum Range」限界を超えると「クリップ」されます。HDRI 版 ImageMagick の結果… HDRI 版 ImageMagick を使ってこれら 2 つの操作を繰り返しても、上記の丸め、焼き付き、クリッピングのいずれも生じませんが、メモリの面で追加のコストがかかります(doubles は整数より多くの領域が必要です)。速度の面では、あまりコストはかからず、浮動小数点アクセラレータのおかげで、今日の多くの現代的なコンピュータハードウェアではむしろ速くなることさえあります。

  # HDRI 版 IM を使用…
  magick -size 20x600 gradient:  -rotate 90 \
          +level 0,15  -level 0,15  level_rounding_hdri.png
  magick -size 20x600 gradient:  -rotate 90 \
          -level 20%  +level 20%    level_clipping_hdri.png
  im_profile -s level_rounding_hdri.png  level_rounding_hdri_pf.gif
  im_profile -s level_clipping_hdri.png  level_clipping_hdri_pf.gif

[IM Output] [IM Output]

ご覧のとおり、画像を重く圧縮または引き伸ばしてから元に戻しても、グラデーションは完全に無傷のまま残ります。

HDRI で画像境界を強制する Clamp

2 つの level オプションの間に「[-clamp](https://imagemagick.org/command-line-options/#clamp)」を使うことで、HDRI 画像を通常の画像値範囲で「クリップ」するよう強制できます。たとえば… |

  # HDRI 版 IM を使用…
  magick -size 20x600 gradient:  -rotate 90 \
          -level 20%    -clamp   +level 20%   level_hdri_clamp.png
  im_profile -s level_hdri_clamp.png  level_hdri_clamp_pf.gif

[IM Output]

上記での「[-clamp](https://imagemagick.org/command-line-options/#clamp)」の使用は、基本的に、通常の非 HDRI 版 ImageMagick で得られたであろうものと同じ画像を生成しました。ただし、この画像は非 HDRI の結果とまったく同じにはなりません。「[-clamp](https://imagemagick.org/command-line-options/#clamp)」は画像の値を焼き付かせ、クリップするものの、量子化丸め効果を加えないからです。したがって、値が整数へ丸められるのは、非 HDRI 画像ファイル形式への最終保存の間だけです。「[-clamp](https://imagemagick.org/command-line-options/#clamp)」オプションは、HDRI を使う際に、望む結果を得るために決定的に重要になりえます。

HDRI ファイル形式

もちろん、非常に小さい値、大きい値、または負の値を含む画像を通常の画像ファイル形式に保存すると、上記と同じ理由で、クリップ、量子化、さらにはカラー削減もされます。したがって、0 から「Quantum Range」のスケールに「正規化」されていない画像を保存する必要がある場合は、まれな浮動小数点画像ファイル形式の 1 つを使う必要があります。(クリッピングや丸めなしで)浮動小数点値を扱える画像形式には、NetPBM PFM が含まれます。これは、追加の特別なオプションを一切必要としない唯一の画像ファイル形式です。
他の画像ファイル形式も使えますが、ファイルが浮動小数点値を保存することを指定する特別なスイッチが必要です。具体的には、これらのファイル形式で浮動小数点値を要求するために、コーダーオプション「**-define quantum:format=floating-point**」を指定する必要があります。「-depth」設定を使って、どの種類の浮動小数点値を使うかを定義することもできます。「-depth 32」以下(ほとんどのバージョンの IM ではデフォルト)が使われると、通常の「floats」が使われます。しかし「-depth 64」が設定されると、画像ファイル形式へ書き込まれる、あるいはそこから読み込まれる浮動小数点データに「doubles」が使われます。この特別なフラグとともに使って浮動小数点値を保存できる画像ファイル形式には、次のものが含まれます… TIFF、FITS、MIFF。生データファイル形式 RGB も浮動小数点を保存(および読み込み)しますが、その形式は画像サイズを保存せず、読み込み時にも浮動小数点設定を指定する必要があります。
もう 1 つの特別なコーダーオプションは「-define quantum:scale=65535.0」です。これは画像ファイルから読み取られた値に乗算され、0.0 から 1.0 の正規化浮動小数点値から、0.0 から 65535.0 の内部値範囲へスケールします。したがって、浮動小数点画像を読み込んだときにほぼ純黒の画像になる場合は、読み込まれる値を適切な範囲へスケールするために、このオプションを加えてみてください。
メモリからディスクへの直接ファイル形式 MPC も、HDRI 版 IM が使う浮動小数点値を保存し、特別なフラグを必要としません。しかし、どんな MPC 画像ファイルとも同様に、同じマシン上の、まったく同じバージョン(特定のコンパイル)の IM だけが、そうしたファイルを正しく読めます。したがって、これはスクリプト化された画像処理のための一時的な「素早い読み込み」ファイルにのみ適しており、長期保存には適しません。

どの Q レベルを使うべきか

要約すると、どの種類の ImageMagick を使うべきでしょうか。Q8、Q16、HDRI? Q8 は、画像値がほとんどの画像ファイル形式と同じく 8 ビット値としてメモリに保存されるため、より小さなメモリフットプリントです。基本的な合成、画像形式の変換、単純な「一度きりのリサイズ」、あるいは画像への描画には、Q8 で「十分」です。Q16 は、カラー値が 16 ビット値(より高い精度)で保存されるため、メモリフットプリントが倍になります。しかし、色空間の変更(単なる sRGB ↔ RGB でも)、リサイズ、歪み、ぼかし、影など、多くのレベルの操作を同じ画像に、同じコマンドで(同じ理由で推奨されます)行う重い画像処理を行う予定があるなら、16 ビットがあるほうが良いです。処理ステップ間で画像の低精度を保つからです。さらに、最終保存が ICO や JPEG のような 8 ビット画像ファイル形式へ戻る場合でも、コマンド間で 16 ビットファイル形式(PNG、MIFF、PbmPlus)に保存できます。(この理由でこれがデフォルトです)次のレベルは Q16 HDRI で、これは精度を 32 ビット浮動小数点値まで高め、画像の丸めやクリッピング効果なしに、非常に小さくなったり非常に大きくなったりする画像値を扱えます。特に一部の色空間では、負の値さえ扱えます。本質的には、HDRI 画像、フーリエ変換、あるいは生データの数学的処理で生じうる高レベルの圧縮・伸長のような極端な状況で画像を処理する際に、画像データの損失を防ぐために使われます。要するに、それがすべてです。Q16 は、歪み、複数画像合成、画像処理効果を伴うほとんどの操作にとって良い中間点です。メモリが厳しいが単純な操作しかしないなら Q8、極端な操作をするなら HDRI です。

画像の Density(密度)または解像度

画像の Density は、画像の空間(スペース)解像度です。つまり、密度(一般に dpi、すなわち 1 インチあたりのドット数で表現されます)は、個々のピクセルがどれだけ離れているか(あるいはどれだけ大きいか)、したがって実世界での画像の全体サイズを定義し、一般に実世界のデバイスでの画像の表示や印刷に使われます。それは単に画像とともに格納される何らかの数値で、プリンターやディスプレイのような出力デバイスに、画像を 1 インチあたり何ドット(またはピクセル)で表示すべきかを伝えます。あるいは、postscript、PDF、MWF、SVG のようなベクター形式の場合は、画像内で使われうる実世界座標を使って描画する際のピクセルスケールを伝えます。それは、画像の「色」解像度を定義する実際の画像のピクセルサイズや、メモリ内Quality、保存ファイル形式の Depth とは完全に無関係です。画像が IM に読み込まれる際に、画像の読み書きの 前に[-density](https://imagemagick.org/command-line-options/#density)」関数を使って、あるいは画像の読み込み後に「[-set](https://imagemagick.org/command-line-options/#set) density」を使って、画像の解像度すなわち密度を設定できます。「[-units](https://imagemagick.org/command-line-options/#units)」設定を使って、密度の数値がデフォルトの(伝統的な印刷の)「PixelsPerInch」で表現されるか、より現代的なメートル法単位の「PixelsPerCentimeter」(PNG は後者を使います)で表現されるかを定義できます。たとえば、600 dpi の 200x200 ピクセル画像は、したがって実世界では 1/3 インチ四方で表示されます。一方、72 dpi のはるかに小さい 72x72 ピクセル画像は、実世界で 1 インチ四方に表示されますが、その空間品質は比べると良くありません。前者は「写真品質」であり、後者は「表示解像度」です。実用的な観点では、72 dpi の画像はプリンターでは「デジタル」あるいは「ドットっぽく」見えます。一方、1200 dpi で撮影された大きな現代のデジタル写真は、おそらくディスプレイに表示するには再サンプリングが必要で、さもないと画像のごく一部しか見えないかもしれません。画像の解像度と密度に関する詳細情報については、Resample リサイズ演算子の注記を参照してください。テキストとフォントの解像度と密度に関する情報については、Pointsize と実際のフォントサイズを参照してください。

Photoshop と Density

「Photoshop」画像エディタは、画像の解像度の追加コピーを、画像内の別のプロファイル(「8BIM」という名前)に保存し、IM はこれに触れません。したがって、IM で画像の解像度を変更する場合は、「photoshop」に画像を読み込み直す前に、おそらく画像からプロファイルも取り除くべきです。さもないと、密度の変更が見えないかもしれません。「+profile 8bim」を使って、画像からそのプロファイルだけを取り除けます。IM フォーラムの討論で、Jesper Nilsson(別名 stroker)は、プログラム「[exiftool](http://www.sno.phy.queensu.ca/~phil/exiftool/)」を使って画像の Photoshop タグを直接変更することを提案しています。たとえば

  exiftool -g -Photoshop:XResolution=300 -Photoshop:YResolution=300 file.tif

品質に基づく速度テスト

いくつかの速度テストが IM フォーラム、Q8 対 Q16 速度(および HDRI)に投稿されました。上記の記事からのおおまかな結果は次のとおりです

  • ピクセルあたり・チャンネルあたりに使われるメモリ量は、予想どおりです。Q8 - 1 バイト、Q16 - 2 バイト、Q32 と任意の HDRI - 4 バイト、Q64(HDRI)- 8 バイト。
  • 64 ビットは浮動小数点演算で大幅な精度向上がありますが、他の任意の HDRI 版 ImageMagick も同様です。
  • 速度の面では、Q8、Q16、HDRI はすべてほぼ同じ速度(コンピュータに浮動小数点 MPU があると仮定して)で、Q32 は約 25% 遅く、Q64(HDRI)は約 50% 遅いです。

| Q64 は 64 ビット整数ではなく、「double long float」を自動的に使う点に注意してください。いわば倍精度 HDRI ですが、非常に精密である一方、メモリ内品質設定の中で最も遅く、最もメモリを消費します。
---|---
| _実際の速度は、コンピュータの仕様と、数学コプロセッサがあるか否かに依存します。重要でないなら、デフォルトの Q16、あるいは標準の HDRI を使うのがおそらく最良です。

重要なら、自分の機材で、画像処理に通常使うと予想される操作を使って、速度の同様のテストを行うべきです。

_
---|---


ImageMagick の特殊制御

IM には、その操作動作、情報の報告、デバッグ目的のために使う特別なオプションもいくつかあります。 -version | IM のバージョン、使っている画像品質、いつビルドされたかを出力します。IM はこの情報を出力した後、暗黙的に終了します。 | | IMv7 では、「[-version](https://imagemagick.org/command-line-options/#version)」はコマンドライン上の _唯一の オプションである場合に終了します。つまり、最後の「暗黙の書き込み」引数を省略可能にします。他の引数が存在する場合、または(ファイルやパイプラインの)スクリプトから読み込まれた場合は、magick コマンドは終了せず、続行します。
---|---
-list | これは情報用のオプションにすぎず、要求された項目を一覧表示してから終了します。つまり、これを他のオプションや画像処理と一緒に使うことはできません。純粋に情報目的で、特にスクリプトで入力オプションをチェックしたり、IM が特定のオプションを実装しているかを確認したりするために提供されています。与えられた引数は、一覧表示したい情報を定義します。たとえば、使える「color」名のリスト(「[-fill](https://imagemagick.org/command-line-options/#fill)」、「[-background](https://imagemagick.org/command-line-options/#background)」、「[-mattecolor](https://imagemagick.org/command-line-options/#mattecolor)」、「[-bordercolor](https://imagemagick.org/command-line-options/#bordercolor)」で使われるような)です。一方、「font」は IM が具体的に知っているフォントを一覧表示します。ここでは、より興味深いリストのいくつかだけを挙げます… | list | 「[-list](https://imagemagick.org/command-line-options/#list)」がどんなリストを一覧表示できるか!
---|---
font | 既知のフォント(IM は X や PS のフォントも知っています)
type | ファイル画像タイプ(「[-type](https://imagemagick.org/command-line-options/#type)」)(IM v6.3.5-7 以降)
あるいはフォントリスト(それより前の IM バージョン)
color | 各種カラーオプション向けの既知のカラー名。
dispose | すべての GIF 破棄設定(「[-dispose](https://imagemagick.org/command-line-options/#dispose)」)
compose | 利用可能なアルファ合成(内部メソッドを含む)
layers | どの複数画像「[-layers](https://imagemagick.org/command-line-options/#layers)」メソッドが実装されているか
distort | 利用可能な画像歪みメソッド。
morphology | 利用可能な画像モルフォロジーメソッド。
kernel | 利用可能なモルフォロジー/畳み込みカーネル。
command | どのコマンドラインオプション(設定と演算子の両方)が利用可能か
configure | ImageMagick をビルドする際に使われた設定パラメータは何か
その最後の「list」設定「Configure」は非常に重要です。IM がビルドされたときにどのライブラリやデリゲートが利用可能だったかを教えてくれるからです。また、古いバージョンの通常の「[-version](https://imagemagick.org/command-line-options/#version)」出力には欠けていた「ポイント」リリース番号も含まれます。(この情報を使う一例についてはスクリプトのバージョン処理を参照してください。IM はこの情報を出力した後、暗黙的に終了します。 | _IMv7 では、「[-list](https://imagemagick.org/command-line-options/#list)」はコマンドライン上の _唯一の
オプションである場合に終了します。つまり、最後の「暗黙の書き込み」引数を省略可能にします。他の引数が存在する場合、または(ファイルやパイプラインの)スクリプトから読み込まれた場合は、magick コマンドは終了せず、続行します。
---|---
-verbose | より複雑な操作の一部について追加情報を報告します。
たとえば「[-segment](https://imagemagick.org/command-line-options/#segment)」は、多くのカラー量子化の詳細を出力します。
また「[-distort](https://imagemagick.org/command-line-options/#distort)」は、要求された画像歪みに対する追加情報や「FX」相当を出力します。さらに、「[-morphology](https://imagemagick.org/command-line-options/#morphology)」操作を反復する際の変更回数の監視もします。これは、「[info:](files.html#info)」や「[-identify](https://imagemagick.org/command-line-options/#identify)」の出力から、より詳細な画像情報を生成するのに特に役立ちます。オプションの「プラス」形式「[+verbose](https://imagemagick.org/command-line-options/#verbose)」を使って、この設定をオフにできます。
-regard
-warnings
| 「-regard-warnings」は、一部の画像ファイル形式に関する情報的な警告の一部を致命的にします。また、そうしたエラー条件に応じて、IM に適切な終了ステータスを返させます。これは、制御されていないソースから提供される画像ファイルを「サニタイズ」するためにスクリプトで使えます。つまり、このオプションは、JPEG や TIFF 画像が正しくない、不完全である、あるいは「未知の」プロファイルを含む場合に、IM を失敗させて終了させます。
-precision
_ | 有効桁数を制御します。
IM が各種のデバッグ、verbose、書式設定の要求に応じて浮動小数点値を出力する際、この設定はその出力をどれだけ精密にしたいかを設定します。デフォルトでは、そうした数値を有効 6 桁に制限しますが、この演算子はこのデフォルトを増減させます。デフォルトの 6 は、「MAGICK_PRECISION」環境変数を使って変更することもできます。これは次のものからの出力に影響します…

  • verbose な「[identify](#identify)」コマンド、あるいは「[-identify](https://imagemagick.org/command-line-options/#identify)」、「[-print](https://imagemagick.org/command-line-options/#print)」、「[-format](https://imagemagick.org/command-line-options/#format)」設定。
  • [-fx](https://imagemagick.org/command-line-options/#fx)」演算子からの「debug()」出力、および「%[fx:...]」文字列エスケープ。(FX、DIY 画像処理演算子を参照)
  • -set option:showkernel 1」が有効になっているときの「[-morphology](https://imagemagick.org/command-line-options/#morphology)」カーネルの浮動小数点値。カーネルの表示を参照。

-quiet | 情報的な警告メッセージを報告しません。I/O エラーや不正なオプションなどの適切なエラーのみを報告します。これは、演算子が結果として「実際の」画像を生成しないときに通常「画像が見つからない(missed images)」警告を報告する「[-crop](https://imagemagick.org/command-line-options/#crop)」や「[-trim](https://imagemagick.org/command-line-options/#trim)」、「[-layers](https://imagemagick.org/command-line-options/#layers) optimize」に特に役立ちます。これはまた、IM が通常無視する「未知のチャンク」を含みうる一部の複雑な画像ファイル形式のコーダーを静かにさせます。たとえば、IM が TIFF 画像や奇妙な MPEG(AVI)ビデオ形式を読むときです。
-respect
-parenthesis
| 丸括弧に、現在の画像リストを保存・復元するだけでなく、現在のすべての操作設定も保存・復元させます。つまり、与えられた場合、丸括弧内で設定された設定はすべて、丸括弧が終わるとリセットされます。上記の丸括弧と設定の例を参照してください。
-ping | 「[identify](#identify)」コマンド向けです。IM は、画像のサイズのような基本情報のために、完全な画像ファイル形式を完全に読み込んでデコードすることを避けようとします。
-monitor | 特に非常に大きい、あるいは長い画像処理タスクについて、画像処理の各段階での処理の割合を報告します。より低レベルの API では、SetImageInfoProgressMonitor() または SetImageProgressMonitor() を使うことになります。
-debug | IM が各種の領域で正確に何をしているかを冗長に報告します。引数は、次のようなオプションのカンマ区切りリストです… | exception | IM がコマンドについて何を理解していないか
---|---
cache | IM がどれだけのディスク容量をキャッシュしているか
configure | IM が設定ファイルを見つけるための検索の試みを表示します。
trace | 各ライブラリ関数の開始時にトレースポイントを報告します
annotate | フォントが「[-annotate](https://imagemagick.org/command-line-options/#annotate)」で使われるときのフォントメトリクスを報告します。
command | IMv7 -- コマンドラインオプション(またはスクリプト)が処理される様子を表示します。例:オプション処理。
all | 処理中のすべてのトレースポイントを表示します
これは非常に非常に非常に冗長で、推奨されません
[-debug](https://imagemagick.org/command-line-options/#debug)」が使われる場合、ログ出力の場所は「log.xml」ファイルによって制御されます。これはデフォルトで「console」に設定されています。ファイルに保存させるには、<log output="console"/><log output="file"/> に変更してください。コマンドラインと API の利用では、IM によるアクションを使ってデバッグレベルを設定する環境変数を定義することもできます。

  export MAGICK_DEBUG=all

画像サイズの制限(簡単なメモ)

過剰なメモリ使用を防ぐため、メモリ制限をたとえば 16GB に設定します。そして
ディスク制限を 4GB に設定します。ディスク制限を超えると、ImageMagick は
"cache resource exhausted" 例外とともに終了します。