ImageMagickの例 --
基本操作

目次
ImageMagickの例:はじめに と 目次
ImageMagickのコマンドライン処理
 
ImageMagickコマンド
イメージリスト
複雑な画像処理とデバッグ
 
メタデータ:属性、プロパティ、およびアーティファクト
 
画像の品質の制御
 
ImageMagickの操作制御
ここでは、IMが従うコマンドライン処理、新しい画像処理機能、アイデア、哲学、および方法論、そして内部で実際に何が起こっているかを詳細に説明します。この背景知識があれば、提供された例の残りのページがはるかに明確になります。アプリケーションプログラミングインターフェイス(API)のみを使用する場合でも、このセクションは知っておく価値があり、理解しておく必要があります。

ImageMagickコマンドライン処理

なぜコマンドラインのスタイルが変わったのか? または...
以前のバージョンのIMの問題点

以前のImageMagickのメジャーバージョン(バージョン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」、「-resize」、および「-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」オペレータは「-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つの画像が読み込まれるか作成される前に、「操作」を与えるべきではないことに注意してください。実際には、「画像の読み取り/作成」も操作と見なすこともできます。結局のところ、それはファイル内の画像をメモリ内の画像に変換するという画像処理操作です。したがって、IMv7でこれを行う正しい方法は、画像を読み取り、処理してから、最終的な「暗黙的な書き込み」引数を使用して結果を書き出すことです。それは...

command  "image" { -operation }... "output_image"
もちろん、実際には画像を読み取る前に指定する必要がある画像読み取りを制御するために必要な設定がいくつかあります(設定の意味については下記を参照してください)。したがって、IMv7構文は基本的に以下に従います...

command { [settings] [operation] }...  "implict_write"
{...}」の部分は、必要なだけ多くの「読み取り」または「操作」で繰り返されます。そして、「[operation]」は、画像読み取りまたは作成、または実際に「何かを行う」画像処理操作です。そして、それらを画像処理したい正確な順序で実行します。

オプションの種類 - オペレータと設定...

以下の概要は、ImageMagickのWebサイトコマンドラインの構造からも入手できるようになりました。すべてのコマンドラインオプションは、次の2つの基本グループに分類されます。「設定」と「画像オペレータ」です。設定は値を設定し、オペレータは実際にあるアクションを実行します。
設定オプション
は、後で他の「画像オペレータ」によって使用される情報を保存するだけのコマンドラインオプションです。つまり、後で使用される値を設定することを除いて、何も実行しません。オプションの多くには、「-」スタイルと「+」スタイルの両方があります。後者は一般に、設定をオフにするか、通常の状態にリセットするために使用されます。これにより、設定の影響をすばやく簡単に削除できます。たとえば、「+gravity」は、重力設定を最初の「重力なし」の状態に戻します。設定は、いくつかのサブカテゴリにさらに分類できます... オペレータ設定は、後続のオペレータがどのように機能するかを制御します。オペレータで使用される可能性のある色とフォントを設定し、画像とテキストの配置を制御し、ソース画像からの色のルックアップを制御し、より複雑なオペレータの一部の処理方法を制御します。などなど。
-dither  -gravity  -fill  -background  -bordercolor  -stroke  -font  -pointsize  -strokewidth  -box  -virtual-pixel  -interpolate 
ほとんどの設定オプションはこのカテゴリに属します。 入力設定は、作成または読み込まれる画像の作成を制御することに特に制限されています。通常、それらは、その設定が定義された後に作成された画像に関連付けられる特定のメタデータを割り当てるか、オーバーライドするために使用されます。外部ファイルから作成または読み込まれます。
-label  -delay  -dispose  -page  -comment  -size 
注意点として、これらの設定は画像の作成時または読み込み時にのみ適用され、それ以外の場合は完全に無視されます。特別なオペレーター「-set」が提供されており、画像をメモリに読み込んだ後、または何らかの方法で処理した後に画像のメタデータを変更できます。詳細については、後述のメタデータを参照してください。 出力設定は、画像をディスクに書き込んだり保存したりするときにのみ使用されます。コマンドラインのどこに記述しても構いませんが、画像の書き込み時、つまりデフォルトの最後の画像ファイル名引数操作、または「-write」や「-identify」操作時のみ適用されます。
-quality  -loop  -compression  -format  -path  -transparent-color 
設定されていない場合、またはプラス記号「+」形式でオフにされている場合は、適切なデフォルト値が使用されます。一般的に、このデフォルト値は最後に読み込まれた画像から保存された値です。現在の「-background」カラーなどのいくつかの「操作設定」も、ファイル形式で必要な場合は画像に割り当てられます。 制御およびデバッグ設定は、IMが一般的にタスクを実行する方法を制御します。これらには以下が含まれます...
-verbose  -debug  -warnings  -quiet  -monitor  -regard-warnings
これらの特別な設定の詳細については、後述のIM操作制御を参照してください。
 
画像オペレーター
画像に何らかの方法で変更を加えるコマンドライン引数です。これらは、コマンドラインで記述された際に即座に実行され、コマンドラインで以前に指定された他の「設定オプション」を使用する場合があります。これらのオペレーターは、いくつかのサブカテゴリーに分類できます... 画像作成オペレーターは、ファイルまたはパイプラインから画像を読み込んだり、新しい画像を生成したりします。これらには以下が含まれます...
image.png  xc:  canvas:  logo:  rose:  gradient:  radial-gradient:  plasma:  tile:  pattern:  label:  caption:  text: 
「オペレーター」として、コマンドラインに記述された際に即座に実行されます。これらは、すでにメモリにある画像に新しい画像を追加するだけで、以前に読み込まれた画像には触れません。もちろん、オペレーターであるため、以前に定義された「設定」が適用されます。特に、ファイルまたはファイルストリームからの入力を制御するために使用される入力設定です。たとえば、作成したい画像のサイズを暗示する「-size」、または「-delay」や「-page」などの画像メタデータを定義またはオーバーライドする設定です。 単純な画像処理オペレーターは、すでにメモリに読み込まれているすべての画像を修正します。各画像は、他のすべての画像とは別々に修正されます。これらには、次のような操作が含まれます...
-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」は複数の画像「タイル」を生成したり、「-separate」は画像を別々のチャンネル画像に分割したりする可能性があります。そのため、メモリ内の画像が増える可能性があります。ただし、それらはすべて一度に1つの画像をインプットとして受け取ります。多くのAPIは、与えられた画像リストの最初の画像にのみ同等の操作を適用することに注意してください。つまり、各画像をループ処理しない可能性があります。ただし、「magick」およびその他のCLI(コマンドラインインターフェース)コマンドは、現在の画像リスト内の各画像に順番にオペレーターを適用します。 マルチイメージリストオペレーターは、現在の画像のリスト全体を単一のエンティティとして修正するという点で特別です。リスト全体を単一の結合画像に置き換えたり、前後に見つかった他の画像に応じて各画像を修正したりする可能性があります。これらは、アルファ合成、アニメーション処理、カラーチャンネル処理などに使用されます...
-append  -flatten  -mosaic  -layers  -composite  -combine  -fx  -coalesce  -clut  -evaluate-sequence mean  -evaluate-sequence 
リスト全体が単一のエンティティとして扱われること、および一部の画像が削除または置換される可能性があることに注意してください。上記のオペレーターのほとんどは、与えられた複数の画像を最終的な単一の画像に結合します。レイヤー合成メソッドは、現在の画像リストを2つの完全に分離した画像リストに分割してから、それらを結合してまったく新しい画像リストを形成する唯一のオペレーターです。これは、現在の画像リストのどこかに特別な「null:」画像を探すことによって分割を行います。このオペレーターは、入力画像のリスト(最後に指定)を個別の画像として処理する「mogrify」コマンドでは使用できません。 イメージスタックオペレーターは、現在メモリにある画像のリストの順序に影響を与えます。具体的には、画像の特別な「横方向」処理を提供します。これらは、前のイメージリストオペレーターと多くの点で似ていますが、画像自体を実際に修正するのではなく、メモリ内での画像の配置方法のみを修正します。
(  )  -delete  -insert  -swap  -reverse  -duplicate  -clone 
括弧「(」と「)」は、コマンドラインシェルインターフェース(CLI)によって特別な意味が与えられないように、バックスラッシュまたは引用符で囲む必要がある場合があることに注意してください。このオペレーターは、入力画像のリスト(最後に指定)を個別の画像として処理する「mogrify」コマンドでは使用できません。 その他の特殊オペレーターは、上記のオペレーターと比較して、通常ではない、または非標準的な方法で動作するオペレーターです。
-geometry  -version  -list  -bench  -concurrent  -preview 
-geometry」オペレーターは、画像リスト内のすべての画像に何らかの影響を与えるのではなく、1つの画像(最後)のみに影響を与える唯一のオペレーターであるため、特別です。これは、下位互換性と特別なアルファ合成要件のためにのみ提供されています。詳細については、ジオメトリ、最後の画像のみをリサイズを参照してください。他の2つの「-version」と「-list」は情報生成オペレーターであり、リクエストされた情報を返した後、IMが明示的に終了します。これらのオプションの詳細については、後述のIM特殊制御を参照してください。一部のオプションは、コマンド全体が複数回実行される可能性があります。基本的に、それらは奇妙で異常な方法で特別に処理されます。一般的に、これらは特別な状況や特定のグローバル情報を回復する場合を除いて使用されません。
オプションを「設定」と「オペレーター」に分離することが、IMの動作方法にとって不可欠であることが明確になることを願っています。ImageMagickのバージョン6では、次の点に注意してください...
設定は、後で使用するために何らかの方法で保存されます。
一方、オペレーターは画像に即座に適用されます。
これが、バージョン6が以前のすべてのバージョンのIMと異なる点です。すべてのオプションは「設定」または「オペレーター」として定義されており、その順序によって、オプションがいつ、どの画像に適用されるかが正確に決まります。IM Examples Options Referenceを使用すると、「設定」と「オペレーター」を識別できます。

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 そして別の画像を 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」コマンドは、メモリに画像がない状態でオペレーターを使用しようとすると、「画像なし」タイプのエラーを生成します。

コマンドライン vs API

コマンドラインIMと、PerlMagick、RMagick、PHP IMagick、MagickWandなどのMagick APIを使用する場合では、いくつかの大きな違いがあります。
アクティブな画像リストは1つのみ
コマンドラインでは、常に一度に操作できる画像リストは1つだけです。画像リストを一時的に「プッシュ」または保存できます(括弧およびMPR:名前付きメモリレジスタを参照)。最後に「プッシュ」されたリストから画像を「複製」(効率的なコピーを作成)することもできます。ただし、実際には2つのそのようなリストを同時に操作することはできません。一方、他の言語APIでは、必要な数だけ個別の画像リストまたは「ワンド」を持つことができます。実際、通常、各画像を別々のワンド(画像リストと設定)として保存し、より適切に処理し、必要に応じて、または最終ステップの一部としてのみ画像をリストにマージします。また、任意の順序で操作したり、データベースやその他のデータ構造に保存して、ソートや後での比較に使用したりすることもできます。一方、コマンドラインでは、単一の画像リストがあるため、任意の順序で操作を行うことはできませんが、一般的に、より論理的な順序で、各画像処理ステップを完全に完了するように試みます。基本的に、後で「戻る」ことや、ある操作セットの結果を使用して、次の処理操作セットをどのように実行するかを選択または変更することは非常に難しいことを意味します。2つの完全に分離された画像リストをマージしたり、論理的な全体にインターリーブ(シャッフル)したりすることは特に困難です。ただし、コマンドラインからこれを行うためのいくつかの手法が開発されています。たとえば、画像リストの多層アルファ合成を参照してください。
ピクセルデータへの直接アクセス
ここでも、コマンドラインからピクセルデータの数学処理とマージを行うことはできますが、コマンドラインインターフェースを使用して属性を簡単に検索したり、特定のピクセルや領域を読み書きしたりすることはできません。特別なFX画像オペレーターを使用して画像のピクセルデータをマージおよび数学的に変更できますが、一般的には画像全体の変換に限定され、非常に遅いです。ユーザーがFXオペレーターを使用して開発した多くの一般的な操作を容易にするために、カラー検索テーブル数学関数の評価多重引数関数などのIMに組み込まれるようになりました。また、一般的な画像歪みオペレーター、およびいくつかの特別な画像合成方法もあります。APIはより直接的な方法で画像を操作できるため、API言語が提供するフルスピードで、独自の一意の操作をDIYで簡単に行うことができます。
条件付き処理
IMコマンドラインインターフェースでは、画像から派生した属性に基づいて画像を簡単に変更することはできません。たとえば、画像が明るい背景を使用しているか、暗い背景を使用しているかによって、画像を異なる方法で処理することは非常に困難です。はい、FX画像オペレーターを使用して、いくつかの制限付きの特定条件付きアクションを実行したり、特定の条件に基づいて画像の向きを調整(回転)するようにIMに指示したり、画像のサイズ変更時に縮小のみで拡大しないようにすることができます。ただし、これらは、特殊なよく知られた一般的な処理条件を処理しているだけです。条件付き処理を行うための唯一の真に実用的な方法は、個別のコマンドと一時ファイルを使用することです。この例については、よくコメントされたジグソーパズルスクリプトを参照してください。一方、APIは、このタイプの条件付き処理を、関連するすべての画像をメモリに保持しながら実行できます。特定の条件に基づいて処理を続行する準備が整い、必要に応じて実行できます。
ループ処理
また、制御された方法で画像を単純にループしたり、シーケンス内のどの画像が処理されているかに基づいてプロセスを簡単に変更したりすることもできません。つまり、画像「シーン」番号や以前の画像の結果に基づいて、各画像に対して異なることを単純に行うことはできません。たとえば、異なるサイズでテキストを描画したり、画像を徐々にぼかしたり、1つのコマンドでアニメーションリストを生成したりすることはできません。はい、画像リスト内の特定の画像を修正できます。たとえば、アニメーションのフレームごとの変更を参照してください。ただし、画像リストにいくつの画像があるかを知っておく必要があり、リスト内の各画像を個別に処理するためにループを「展開」する必要があります。コマンドラインから画像をループするための唯一の真に実用的な方法は、個々の画像を個別の画像ファイルとして書き出し(複数の画像書き込みを参照)、外部スクリプト化されたループで一度に1つずつ処理することです。たとえば、画像を垂直方向に分割するように設計されたシェルスクリプトを参照してください。あるいは、シェルスクリプトループを使用して画像を生成し、その結果を最終コマンドにパイプして、最終的な画像または画像シーケンスにマージすることもできます。この例については、レイヤー化された画像例、またはさまざまなワープ画像アニメーションシェルスクリプトジェネレーターを参照してください。ただし、APIは、単一の画像リスト、または複数の画像リスト、さらには画像リストの配列やデータ構造全体で複数の画像をループすることに問題はありません。また、パイプラインや一時ファイルを使用せずに、最終的な結合ステップの準備ができた状態で、すべての画像をメモリに保持することもできます。
アプリケーションでこれらのいずれかのことを実行する必要がある場合(実際にはここまで実行する必要があるアプリケーションはほとんどありません)、APIの方が適切な選択肢となる可能性があります。「magick conjure」プログラム(下記参照)は、元々、ImageMagickのより優れたスクリプト化された使用を可能にするように設計されており、複数の画像リストの使用を可能にしていました。IM v7の「magick」の改善により、この実験的なAPIは使用されなくなりましたが、引き続き利用可能であり、開発中です。

引数の扱い

コマンドラインのファイル名とオプションに加えて、使用されるオプション引数の基本スタイルはいくつかしかありません。
  • 定数名(特定の設定およびメソッドタイプの場合)
  • 定数名のリスト(たとえば、2つの色またはチャネル)
  • ジオメトリ引数(フラグ付きの特殊な形式の数値リスト)
  • 浮動小数点リスト(パーセントエスケープ付きの場合もあります)
  • 自由形式のテキスト文字列(パーセントエスケープ付き)

定数名

定数名とは、オプションで使用できる許可された設定の内部ライブラリを検索するために使用される特定の文字列定数です。たとえば、「-gravity」設定は、9つの異なる設定のいずれかを取ることができます。設定すると、その設定は、コマンドライン上の設定に続くすべての画像処理オペレーターで使用されます。たとえば、「North」、「East」、または「NorthEast」などの設定です。リスト操作オプション(下記参照)を使用して、すべての有効な設定のリストを取得できます。たとえば、次のコマンドを使用します...

  magick -list gravity
これらの特定の設定のみが許可されており、他の設定を使用しようとするとエラーが発生します。たとえば...

  magick xc: -gravity Invalid   null:
[IM Text]
設定はさまざまな方法で指定でき、すべて完全に有効です。IMはこれに関して非常に寛容です。たとえば、設定は大文字、小文字、または両方の組み合わせで指定できます。(「-list」出力で大文字で指定された)個々の単語には、追加のスペース、ハイフン、またはアンダースコアを含めることができ、それらは単純に無視されます(ただし、単語間のみ)。したがって、次のすべての引数は、「North East」「-gravity」を設定するために有効です...
NorthEast」、「northeast」、「NORTHEAST」、「NorTheAst」、「north east」、「north-EAST」、「NORTH_EAST」、「 North East 」、「___North___East___」。
しかし、'Nor The Ast' という引数は、設定で宣言された単語内にスペースを使用しているため、すべての文字が正しくても有効ではありません。これらの定数名は設定だけでなく、"-layers"、"-distort"、"-morphology" など、より複雑な画像処理演算で使用する操作メソッドを宣言するためにも使用されます。一部の定数名は、外部構成ファイルから読み込まれます。たとえば、"-fill"、"-stroke"、"-background"、"-mattecolor" などの色の名前や、"-ordered-dither" に使用される特別な「しきい値」マップなどがあります。繰り返しになりますが、"-list" を使用して、現在インストールされている IM のバージョンが認識している名前を調べることができます。

定数名リスト

これはあまり使用されない引数であり、色によるレベル調整など、1つまたは2つの色が必要な設定で最も一般的に使用されます。"-level-colors" オプションは、次のいずれかの引数スタイルを取ることができます。
color   color1,color2   color1-color2
また、複製クローンなど、複数の画像インデックスを使用する操作の画像選択にも使用されます。インデックスは最初の画像でゼロから始まり、負のインデックスは画像リストの最後から始まる画像インデックスを示すために使用できます。たとえば、'-2-1' は最後から2番目の画像(インデックス '-2')から2番目の画像(インデックス '1')を取得することを意味します。そして、これは実際に指定された逆順で画像を取得することを意味します!これを多用するもう1つのオプションは、チャンネル選択で、特定の名前付きチャンネルのリストを指定できます。たとえば、'Red,Green,Blue,Black,Alpha' です。ただし、チャンネル設定では、1文字の文字列(例:'RGBA')を使用した短縮形を使用することもできます。

ジオメトリ引数

これはオプション引数の最も一般的な形式であり、通常、さまざまな操作のサイズ、長方形、およびオフセットを指定するために使用されます。しかし、整数または浮動小数点数のいずれであっても、1〜5個の数値のリストを必要とする任意のオプションでも使用されます。たとえば、"-crop" や "-resize" などのオプションはジオメトリ引数の完全な構文を使用しますが、"-border"、"-level"、"-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% で、高さ 30 ピクセルではなく、実際には '50%x30%' を意味します。
ジオメトリ引数は特別な '%' フラグを含めることができるため、現在、パーセントエスケープを使用して、画像属性に基づいて値を設定することはできません。

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

浮動小数点リスト

5つ以上の浮動小数点数が必要な場合、場合によっては不明な数の値が必要な場合は、浮動小数点リスト引数が使用されますが、現時点では、オプションごとにわずかに異なる可能性があるため、一般的に個々のオプションによって解析されます。一般に、それらはコンマまたはスペースで区切られた浮動小数点数の文字列(通常は引用符付き)で構成されています。歪み演算子は、浮動小数点数のリストを使用する最も有名な演算子でしょう。その他には、ユーザー定義のモルフォロジーと畳み込みカーネルがありますが、数値(カーネル)の配列を定義するための追加の構文もあります。浮動小数点数の1つのバリエーションは、"-sparse-color" で使用され、一部の浮動小数点値の色を置き換えることができます。内部的には、結果の配列がコアライブラリ関数に渡されるときに、これらは依然として浮動小数点値に変換されます。

自由形式の文字列

他のオプションは、引数として文字列を受け取るだけです。ラベルを生成したり、テキストに注釈を付けたり、画像メタデータとして保存したりするために使用されます。これらには、文字列内のパーセントエスケープが含まれることが多く、文字列が使用される前に(置換)されます。即時置換の場合もあれば、引数が実際に使用される直前に後で実行される置換の場合もあります(下記の遅延パーセントエスケープを参照)。

パーセントエスケープを使用した引数

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

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

一部の設定オプションでは、パーセントエスケープは検出されたときにすぐに展開されるのではなく、指定されたとおりに保存されることに注意してください。テキストが実際に使用されるときになって初めて、文字列内にあるパーセントエスケープは、それらが使用される画像が最終的にわかったときに展開される必要があります。つまり、これらの引数は、引数が実際に使用されるまで、パーセントエスケープの置換を遅延させる必要があります。これらのオプションには、"-label"、"-comment" などの入力設定、"-format" 設定、およびグローバル "-define" 値が含まれます。これは、適用する画像が実際に読み込まれるずっと前に、画像固有のパーセントエスケープを含む "-label" を指定できることを意味します。ラベルが画像に実際に添付されたとき(読み込まれた直後)にのみ、パーセントエスケープが展開され、適用されている画像の属性を利用できるようになります。
パーセントエスケープのより広範な使用に対する主な制限は、現在、限られたオプション引数セットにのみ適用されることです。たとえば、ジオメトリ引数でそれらを使用することはできません。ジオメトリ引数も 'パーセント' 文字を使用しますが、目的が異なります。

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

ImageMagick コマンド

これらの ImageMagick のサンプルページのほとんどは、画像を処理するために "magick" コマンドを使用していますが、他にもいくつかの ImageMagick コマンドがあり、ここでは簡単に紹介します。ただし、これらのコマンドの一部は Web ページで適切に実証できません。ただし、ここでそれらのコマンドに関するヒントとコツを提供しようとします。たとえ、その出力を直接表示することができなくてもです。

Convert -- 画像を変換および変更する

magick」コマンドは ImageMagick の主要な働き手であり、そのためこのページに掲載されているほとんどすべての例でこのコマンドが使用されています。したがって、ここではこのコマンドの使用法についてはあまり触れませんが、代わりに少し歴史を振り返ります。IM が最初に作成されたとき、このコマンドの本来の目的は、ある画像形式の画像を別の画像形式に変換することでした。実際、それは今でもこの目的で使用されており、なぜ「magick」と呼ばれるのかの理由でもあります。このため、コマンドは画像をメモリに読み込まないことさえあり、代わりに、変換を直接行うために 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 が知っている、または簡単に計算できる画像に関する多くの情報が出力されます。これには、色の統計、色の数、プロファイル情報、画像の内部画像保存タイプなどが含まれます。ただし、出力は本当に...冗長であることに注意してください!特定の情報は、「-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」は、複数の画像の結果を分離するために、自動的に行末文字を出力に追加していました。これはもはや行われないため、「-format」文字列に適切な EOL 文字を追加する必要がある場合があります。

Identify、Ping するか Ping しないか

IM の「magick identify」は、デフォルトでは「-ping」と呼ばれる手法を使用して、画像に関する最小限の基本情報のみを読み取ります。つまり、identify は、画像全体をメモリに読み込もうとせずに、サイズなどの簡単な画像情報を判断するために十分な量の画像ファイルのみを読み取ります。以下のPing、操作制御を参照してください。これは、「magick identify」が「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」は、最小限の「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 は、identify を使用して表示する結果を出力する前に、さまざまな画像ライブラリ API とデリゲートプログラムを使用して、(基本的に独自の内部データ形式に)画像をメモリに読み込みます。つまり、「magick identify」は、読み込んで保存した画像/データの内容を分析します。特定のファイル形式が画像データをどのように保存または処理するかについては分析しません。これは、特定のファイル形式には、「magick identify」が報告しない非常に特定な側面がある可能性があるため重要です。たとえば、GIF 画像のカラーテーブルの内容を各画像に対してリストしますが(複数の画像が可能)、ファイル内のすべての画像が同じカラーテーブルを共有しているかどうかはわかりません。特定の画像ファイル形式に関する特定の情報が必要な場合は、その形式用に特別に設計されたツールを使用する方が良い場合があります。たとえば、GIF ファイル形式の場合は「giftrans」、JPEG ファイル形式の場合は「jpegtrans」などです。
カラーヒストグラムの出力
画像に 1024 色を超える色がある場合、詳細出力にヒストグラムまたはカラーテーブルは含まれないことに注意してください。この情報の生成を強制するには、すべてを大きな画像コメントとして含む特別な「histogram:」ファイル形式を使用できます。
終了ステータス
破損した画像が検出され、警告を考慮する制御を追加した場合、identify プログラムは 0 以外の終了ステータスを返します。

  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:」出力ファイル形式を使用して、「convert」コマンドから identify 出力を生成することもできます。

  magick ../images/k* \
          -format 'image \"%f\" is of size %G\n'  info:
[IM Text]
デバッグツールとして、一連の操作の途中で「書き込み演算子」を使用して「info:」に書き込むことができます。また、その出力を特定のファイル(またはファイルストリーム)に書き込むこともできます。より簡単な方法は、「-identify」オプションを使用して、通常の「標準出力」に書き込むことです。

  magick ../images/k* \
          -format 'Image #%p named \"%f\" is a %m\n' -identify \
          null:
[IM Text]
これは、「-print」という別のオプションと組み合わせて、その他の情報を出力することもできます。

  magick null: -print ' (50 + 25)/5  ==>  %[fx: (50+25)/5 ]\n' null:
[IM Text]
-identify」と「-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 Web ページとして確認できます。これらのオプションに関する最後に一つ。それらのすべては、デフォルトで「magick」コマンドの「標準出力」に出力されます。以前に「標準出力」をリダイレクトしない限り、別の「パイプライン」や特定のファイルに明示的に出力することはできません。「info:」を使用して出力を書き込むと、画像ファイルの場合と同じように、出力を特定のファイルに送ることができます。また、特別な「fd:」出力ファイル形式を使用して、以前に準備したファイル記述子に出力を送ることもできます。もちろん、それは画像ごとに 1 回書き込むため、1 回のみ出力するように画像を操作する必要がある場合があります。

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

magick mogrify」コマンドは、多くの点で「magick」に似ていますが、画像をインプレースで変更するように設計されている点が異なります。つまり、その主な目的は、画像(またはアニメーション)を一度に 1 つずつファイルから読み込み、変更してから、画像を読み込んだまったく同じファイル名に保存することです。このため...
Mogrify は、元の画像を簡単に破壊する可能性があるため、危険です!
そのため、最終的な処理を行う前に、画像の別のコピーで「magick mogrify」をテストしてください。バックアップがない元の画像では使用しないでください。さて、「magick mogrify」は通常、変更された画像を同じファイル名に保存しますが、画像を別のファイルに保存できる 2 つの特別なオプションがあります。「magick mogrify」固有の設定「-format」は、ファイルの保存時に使用する異なる形式とサフィックスを定義します。そのため、次のようなコマンドは...

  magick mogrify    -format jpg   *.png
元の画像を破壊することなく、画像の変換またはバッチ変更を行うことができます。この場合、すべての PNG ファイルを同じファイル名だが異なるサフィックスを持つ JPEG ファイルに変換します。ただし、同じ名前の既存のファイルがある場合は、上書きされることに注意してください。ですので、もう一度繰り返します...
Mogrify の前に考えて確認してください
そうしないと、保存したいものを上書きしてしまう可能性があります。IM v6.2.0 以降では、新しい「-path」オプションを使用して、処理された画像を出力する別のディレクトリを指定することもできます。これにより安全性が向上しますが、そのディレクトリにすでに存在している同じ名前の画像を上書きします。また、そのディレクトリに残っている古い画像は削除されません。そのため、IM に次のようなものを使用して、結果(たとえば、画像のサムネイル)を既存のサブディレクトリに保存させることができます...

  magick mogrify   -path thumbnail-directory   -thumbnail 100x100  *
IM v6.3.4-3 より前では、「-format」と「-path」の設定は相互に排他的でした。そのバージョンから、形式と出力ディレクトリの場所を変更できます。
magick mogrify」コマンドはマルチイメージ処理機能のため、マルチイメージリスト演算子イメージスタック演算子を使用できません。つまり、「-fx」、「+swap」、「-composite」、「-append」、「-flatten」、「-layers」のような画像処理演算子を「magick mogrify」コマンドで使用することはできません。一部の設定オプション(例えば「-size」、「-label」、「-density」など)は、最初の画像が読み込まれる前に設定する必要があるため、これらのオプションは最初の画像が読み込まれる前に処理および設定されます。その後、各画像が読み込まれ、コマンドラインの順序で演算子が適用されてから、画像が保存され、次の画像が読み込まれます。シーケンスの後半でこれらの設定のいずれかを変更すると、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」入力設定によって決定され、最初の大きな設定は完全に無視されていることがわかります。一方、操作設定の「-font」は、個々の「-annotate」操作ごとに正しく設定されています。この複雑さが増すということは、おそらく次のことを行うのが良い考えであることを意味します...
画像を単純にMogrifyすること。
magick mogrify」を使用したバッチ操作で、非常に長く複雑な「magick」のような操作を実行しようとしないでください。設定の問題が発生する可能性があります。複雑な処理を本当に実行したい場合は、「magick」を使用して各画像を一度に1つずつ処理するシェル/dos/perlスクリプトを作成するか、ImageMagick APIインターフェイスを使用してください。スクリプトを使用して多数の画像を修正する例については、高度なImageMagickの例を参照してください。ただし、「magick mogrify」は危険なコマンドであり、本番環境に投入する前に、必ずバックアップイメージで十分にテストする必要があることを覚えておいてください。実際には、スクリプトに「magick mogrify」のようなものの簡単な「テスト」を含めて、コマンドが(バージョンの変更やコンピュータのインストールの違いにより)何も壊さないことを確認してから、非常に大規模な画像のコレクションを処理することをお勧めします。つまり、小さな「テストケース」を実行し、正しい結果が得られない場合は、続行する前に中止します。これは、予期せぬ結果からユーザーを保護するために、実際には大規模な画像処理プロジェクトすべてにとって良い考えです。IMの例でも自分自身でこれを行っており、多くのトラブルから救われています。

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

magick mogrify」は、マルチイメージリスト演算子を使用できないため、アルファ合成を使用してロゴを重ねたり、画像をマスクしたりするのは簡単ではありません。これには1つの例外があります。「-draw」を使用して画像アルファ合成を実行することです。これにより、現在の画像リストの外で、演算子引数の一部として2番目の画像を指定できます。例えば、ここではまず、特別な「cp_perl」スクリプトを使用して、処理したい元の画像のコピーを作成します。次に、一時的な円形の「マスク」画像を作成し、次に「Dst_In」アルファ合成メソッドを使用した「magick mogrify」を使用して、それらのすべての画像から円形を切り抜きます。

  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によって解析する必要はありません。これにより、特に多数の画像を扱う場合に、多くの処理時間を節約できます。

Morgifyの代わりにConvertを使用する

パーセントエスケープファイル名のパーセントエスケープを参照)を使用して、出力ファイル名を変更する特別な手法を使用すると、「mogrify」をより汎用性の高い「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」の代わりに「convert」を使用することの本当の問題は、すべての画像が最初にメモリに読み込まれることです!Mogrifyは、一度に1つのファイル(ただし、そのファイルに複数の画像を含めることができる)のみを読み取り/修正/書き込みに非常に苦労します。しかし、「convert」はそうではありません。そのため、注意しないとメモリ制限を簡単に超えてしまう可能性があります。ただし、これを回避する方法はあります。読み取り修飾子サムネイルの例を参照してください。また、すべての画像は単一の画像リストとしてメモリ内にあるため、それらの画像をどのように処理するか注意する必要があります。例えば、通常のようにアルファ合成を直接使用することはできませんが、ジョブを実行するには、特殊なマルチイメージリスト合成を使用する必要がある場合があります。もちろん、「magick mogrify」と同様に、「magick」のこの使用方法は、元の画像ファイルを簡単に上書きして破壊する可能性があるため、危険な可能性があります。

バッチ処理の代替手段

magick mogrify」を使用した画像のバッチ処理が実際的でない場合、特に画像をその場で修正するのではなくコピーする場合は、他のIM以外のループソリューションを使用する方が良い場合があります。これらには、以下が含まれます...

  # Use a simple shell loop, to process each of the images.
  mkdir thumbnails
  for f in *.jpg
  do   magick $f -thumbnail 200x90 thumbnails/$f.gif
  done

  # Use find to substitute filenames into a 'convert' command.
  # This also provides the ability to recurse though directories by removing
  # the -prune option, as well as doing other file checks (like image type,
  # or the disk space used by an image).
  find * -prune -name '*.jpg' \
         -exec  magick '{}' -thumbnail 200x90 thumbnails/'{}'.gif \;

  # Use xargs -- with a shell wrapper to put the argument into a variable
  # This can be combined with either "find" or "ls" to list filenames.
  ls *.jpg | xargs -n1 sh -c 'magick $0 -thumbnail 200x90 thumbnails/$0.gif'

  # An alternative method on linux (rather than plain unix)
  # This does not need a shell to handle the argument.
  ls *.jpg | xargs -r -I FILE   magick FILE -thumbnail 200x90 FILE_thumb.gif
などがあります。再帰的なファイル処理または非再帰的なファイル処理を行うには、「find」と「xargs」の両方を使用することをお勧めします。それらのmanページを読んでください。簡単な紹介については、IMディスカッションポストと、関連する危険性に関する情報を含むガイドXargs - Wikipediaを参照してください。コマンドがこれよりも複雑になり始めた場合は、シェルスクリプトまたはAPIプログラムに移行して、複数の画像を読み込み、情報を収集し、適切な引数を計算し、画像を処理する時期かもしれません。「parallel」コマンド(通常は「xargs」のドロップイン代替)をよく見てみることもお勧めします。これにより、複数のコマンドを同時に実行できるだけでなく、少しの作業で各コマンドを異なるコンピュータで実行して、非常に多数のタスクのネットワーク分散処理を実行できます。Windowsユーザーの場合は、Windowsの使用方法セクション、特にWindows、複数のファイルのバッチ処理を参照してください。
mogrify」および他のすべてのIMコマンドも、「*」や「?」などのシェルメタ文字を含むすべてのファイル名を展開します。これは、古いDOSコマンドラインシェルでこれらのメタ文字を使用できるようにするために行われます。ただし、これによりバグ、magick mogrifyの繰り返し実行、または使用するファイル名を提供した悪意のあるソースからの「ハック」が発生する可能性もあります。セキュリティ問題に関する注意と完全な理解をお勧めします。

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

magick composite」コマンドは、2つの画像をさまざまな方法でシンプルにアルファ合成(重ね合わせ)するために特別に設計されています。これには、3番目のマスク画像を使用して、画像を結合する領域を制限することも含まれます。「magick」とは異なり、「magick composite」コマンドは、設計された単一の画像処理操作を実際に行う前に、すべてのオプションと設定を読み込むという点で非常に伝統的なコマンドです。「magick composite」コマンドは、より複雑なアルファ合成モードへの簡単なアクセスも提供します。たとえば、「-dissolve」、「-blend」、および「-watermark」の画像合成があります。これらの引数が指定された場合、そのコマンドに指定された(または指定される)他の「-compose」設定よりも優先されます。また、「-tile」設定は、「magick」または「magick montage」および「magick display」のいずれとも異なる動作をします。「magick composite」では、これにより、オーバーレイされた画像が背景画像全体にタイル状に配置されます。これは、他のIMコマンドではまだ利用できない機能です。これらの特別な機能により「magick composite」は便利なコマンドになりますが、アルファ合成は「magick」コマンドでも使用できるようになりました。(詳細については、IMでのアルファ合成を参照してください)。2つ以上の画像を重ね合わせる複数の異なる方法の概要については、複数の画像ペアの合成の例を参照してください。2つの画像を結合する方法の詳細については、アルファ合成の例のページを参照してください。オーバーレイの制限または「マスキング」機能についても、上記の例のページの合成マスクを使用して合成領域を制限するで詳しく説明されています。

Montage -- サムネイルの配列の生成

特別なIM画像インデックスコマンド「magick montage」も、「magick」と同様に、「見たままに実行する」スタイルのコマンドライン構造に従いました。唯一の違いは、コマンドの最後に達したとき(最後の出力画像ファイル名引数以外)、「magick montage」は、現在設定されている設定に従って、画像リストをサムネイル画像インデックスページに処理し始めることです。これにより、「magick montage」はIMバージョン5よりもはるかに汎用性が高くなり、「magick」で行うように画像を処理してから、必要なすべての「magick montage」設定を設定し、ジョブを完了させることができます。「magick montage」の詳細については、モンタージュ、サムネイルの配列を参照してください。

表示-- 画像のスライドショー

magick display」プログラムは、画像または画像のリストをループスライドショーの形式で表示するように設計されています。慎重に構成され、タイミングが調整された画像のアニメーション用には設計されていません。その場合は、「animate」コマンドを使用します。他のオプション(ウィンドウ「-geometry」、下記参照)がこの動作を上書きしない限り、各画像は画像に合わせて適切なサイズに調整されたウィンドウに表示されます。画像には、一般的に、画像の透明度の効果を示すために、チェッカーボードの背景にも表示されます(下記参照)。これはアニメーションの表示用ではなく、実際の画像のスライドショーとして設計されていることに注意してください。そのため、スクリプトプログラムで表示を使用する場合は注意が必要な場合があります。画像表示時間、ループ、およびその他のオプション デフォルトでは、ユーザーが「-delay」設定を使用して指定した遅延に加えて、約2秒の遅延が使用されます。ただし、オプション「-delay 0」を使用すると、ユーザー入力(スペースバー)を待機させることができます。ただし、デフォルトは、ファイル形式によっては画像自体によって上書きされる可能性があります。そのため、GIFMIFFなどのアニメーション形式では、一時停止するか、2秒プラス画像のメタデータ遅延設定が発生する可能性があります。したがって、スクリプトとニーズに合わせて、常に適切な「-delay」を設定することをお勧めします(「-delay 5x1」は5 + 2または約7秒遅延することに注意してください)。「-loop」設定についても同様です。デフォルトでは、「magick display」は永久にループしますが(「-loop 0」)、MIFFGIFなどの画像形式では、ループ内の最後の画像の後に終了するように上書きされる可能性があります。状況に応じて「-loop」オプションを参照してください。「magick display」はGIFアニメーション設定を処理しないため、フレームは破棄されず、仮想キャンバスサイズとオフセットは無視されることに注意してください。つまり、GIFアニメーションでは、正しくオーバーレイされた画像ではなく、未加工の部分的な画像が表示されます。表示目的でそのようなアニメーションをクリーンアップするための「-coalesce」オプションが用意されています。

透明度の処理

完全なアルファチャンネル(例:PNGおよびMIFF形式)を含む画像は、影の効果などの半透明の効果を確認できるように、「チェッカーボード」の背景パターンに重ねて表示されます。「-texture」で別の背景を選択することで変更できます。たとえば、次のような背景を選択できます。

  magick display -texture granite: test.png

  magick display -texture xc:black test.png
GIFやPNG8形式など、パレット(またはブール)の透明度を持つ画像は、カラーテーブルで透明度を表すために使用された現在の「透明色」で表示されます。つまり、デフォルトのチェッカーボードパターンではなく、一般的にランダムな色(通常は黒)が使用される場合があります。これはバグと見なされる可能性がありますが、技術的にはそうではありません。ただし、他の透明度情報を含む画像と同じように表示を処理したい場合は、次のコマンドを使用して「magick display」に画像を供給する前に、パレットメタデータを削除して、画像出力形式の内部スタイルを変更できます。

  magick image.gif -type truecolormatte miff:- | display -
または、表示される画像を修正するほぼすべての操作で、既存のパレットメタデータも削除されます。そのため、一部の「magick display」オプションを使用してパレットを削除できます。たとえば、「-coalesce」を使用します。

  magick display -coalesce image.gif
これにより、GIFアニメーションに存在する可能性のある最適化をクリーンアップするという追加の利点があります。ただし、複数の関係のない画像の場合、他の望ましくない副作用が生じる可能性があります。はい、これらの方法は不器用ですが、機能します。

変換を使用した表示

(次の「magick animate」を使用する以外に)代替の表示方法として、より単純な「x:」出力画像形式を使用します(表示出力形式を参照)。

  magick image.png x:
この方法では、背景ウィンドウ、メニューオプション、その他のコントロールは提供されません。画像を1つずつ表示するだけです。結果の画像を単純に「表示」したい場合は、特別な「show:」または「win:」出力スポーンデリゲートが、出力画像に対して「display」コマンドを実行することで同じことを行い、そのウィンドウが閉じられるのを待たずに終了します。

  magick image.png show:

出力サイズの表示

表示では、画像をXウィンドウディスプレイに合わせて拡大縮小することはありません。ウィンドウサイズは、「-geometry」設定を使用して設定しない限り、各画像に合わせて調整されます。その設定は、Xウィンドウディスプレイ上のウィンドウの位置を固定するためにも使用できます。画面よりも大きい画像はサイズ変更されませんが、画面からはみ出します。ただし、表示では、ユーザーが画像をスライドできる「スクロールウィンドウ」も提供されます。これは、最新の高解像度デジタル写真を表示する場合に厄介な場合があります。表示を800x600ピクセル領域(より小さくのみサイズ変更し、大きくはしない)に制限するには、次を使用します。

  magick display -resize 800x600\> photo.jpg
JPG画像の場合、特別なjpeg入力サイズヒント設定を使用することで、画像読み取りを高速化できます。JPEGコントロールオプションの読み取りを参照してください。

  magick display -define jpeg:size=1600x1200 -thumbnail 800x600\> photo.jpg
画像が最新のデジタルカメラからのものである場合は、「-auto-orient」を使用して、画像ファイル形式のEXIFメタデータを使用して、表示される画像のカメラの回転を修正することもできます。メニューが不要な場合は、「-immutable」設定を「magick display」に設定してオフにすることができ、編集を許可しないことを認識させることができます。

表示のスクリプトによる使用

これらのオプションを念頭に置いて、複雑なシェルスクリプトからの結果を表示するために「magick display」を使用するための推奨事項を次に示します。

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

X Windowsでの表示

オプション「-window root」を使用すると、Xウィンドウの背景(ルート)ウィンドウに画像を表示できます。この場合、「magick display」プログラムは自動的に終了します。デフォルトでは、画像は背景全体にタイル状に表示されます。たとえば、これを試してください。

  magick display -window root pattern:checkerboard
画像のタイルや生成に関するその他の多くの例については、タイル状キャンバスおよび背景画像の例を参照してください。X Windowsの背景に単一の画像を使用する場合は、Xウィンドウディスプレイのサイズを知る必要がある場合があります。ImageMagickの一部ではありませんが、「xdpyinfo」プログラムを使用すると、その情報を取得できます。

  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

リモート制御の表示

表示には、特別な「-remote」オプションが用意されています。これは、既に実行中の「magick display」コマンドを探し、指定された引数を渡します。たとえば、

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

  xdotool search -class "display" windowkill

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

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

  magick image1.png image2.png -scale 400% miff:- |\
     magick animate -delay 50 -loop 0 -
私はこの方法を利用するスクリプト "flicker_cmp" を作成しました。これは、そうでなければ見逃してしまうような、ピクセル強度の非常に微妙な変化を拾うのに非常に役立ちます。

比較-- 相違点を探す

これに関する現在のすべての情報は、IMの例の画像比較ページセクションにあります。

ストリーム-- 大規模な画像のパイプライン処理

"magick stream" は、非常に大きな画像ファイルの一部分を抽出するように設計された特別なプログラムです。これは、ImageMagick内の唯一のそのようなプログラムであり、他のすべてのプログラムは、処理の前に画像を完全にメモリに読み込みます(例外は、"-size" を介したJPEG画像です。このオプションはJPEGデリゲートライブラリに渡されるためです)。 "-extract" 設定を使用して画像の一部を選択できます。また、"-depth" 設定で生のバイトの深度を指定できます。最後に、"-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]
詳細と例については、本当に大規模な画像処理を参照してください。

インポート-- 画面表示から画像を読み取る

"magick import" コマンドは、Xウィンドウ表示から画像を取得および抽出するために使用できる特別なプログラムです。たとえば、ディスプレイから選択したウィンドウを取得して印刷してみましょう...

  magick import -page A4 -gravity center ps:- | lpr
実際には、特別なファイル形式 "X:" もmagickコマンド内からまったく同じ機能を提供するので、めったに使用されません。2つの唯一の違いは、"magick import" には、表示、画面、またはウィンドウIDを指定するなど、"X:" 形式よりも多くのXウィンドウ固有の設定があることです。画像はそこから取得されます。その他のオプションには、表示「ビープ音」の制御や、繰り返しのスナップショットが含まれます。特定のウィンドウが指定されていない場合、マウスを使用して、ユーザーが画像として取得したいディスプレイの部分を選択できます。
  • シングルクリックを使用すると、クリックしたウィンドウ全体が取得され、画像として返されます。表示上の他のウィンドウが選択されたウィンドウの一部を隠している場合、取得されている選択されたウィンドウを隠している他のウィンドウの画像を取得することに注意してください。
  • ルートウィンドウでクリックするか、"-window root" を選択すると、画面全体が返されます。
  • マウスクリックとドラッグを使用すると、画面全体の切り抜きセクションが返されます。これはもちろん、ディスプレイ全体の場所(仮想キャンバスオフセット)(仮想キャンバスまたはページサイズ)も返されることを意味します。
他のオプションを使用すると、画面全体("-window root")または特定のウィンドウを、ウィンドウタイトルまたはXウィンドウIDを指定して取得することで、マウスとの人間のやり取りを回避できます。これは、Xウィンドウユーティリティ "xwininfo" を使用して見つけることができます。"-extract" を使用して、選択したウィンドウの領域を削減することもできます。"magick import" の代替として、特別な入力形式 "X:" も参照してください。
    Note to import from the Windows clipboard use
      magick clipboard:myimage image.png
    and not "import"

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

元々は複数の画像リストを使用して、スクリプト化されたImagemagickの使用を可能にするように設計されましたが、IM v6 "magick" に加えられた改善により、この実験的なAPIは使用されなくなりました。これはXMLベースの言語です。XMLが必要な場合は、SVGの方がニーズに適している可能性があります。私の意見では、複数画像リストを扱う場合は、"magick conjure" スクリプトを使用する方がおそらく優れており、簡単です。ユーザーによる例とサポートが不足しているため、広くではありませんが、使用されています。

画像リスト...

ImageMagickで覚えておくべき最も重要な点の1つであり、新規ユーザーと経験豊富なユーザーの両方を混乱させるのは...
ImageMagickは、単一の画像ではなく、順序付けられた画像のリストで動作します
つまり、IMは単一の画像だけでなく、個々の画像、互いに重ね合わさる画像のセット、またはアニメーションのフレームなど、順序付けられた画像のリストを扱う可能性があります。また、一般的に、すべての画像演算子は、現在のリスト内のすべての画像に適用されます。したがって、"-draw" 演算子を使用すると、多くの新規ユーザーが想定するように、リスト内の最後の画像に描画するだけでなく、現在の画像リスト内の他のすべての画像に描画し、順番に各画像に描画します。"-coalesce" や "-layers" などの画像レイヤー演算子は、リスト内の各画像を、リスト内の他の画像に従って変更された新しい画像に置き換えます。追加の画像を追加または削除することさえあります!また、"-append"、"-mosaic"、"-fx" などの画像リスト演算子は、現在の画像リスト内のすべての画像を、結果として結合された画像に置き換えます。つまり、括弧を使用して以前に保存し、複製された画像を使用しない限り、すべての画像を破棄します。実際の例については、以下の画像リスト演算子を参照してください。最後に、新しい画像が読み込まれるか作成されると、IMはその新しい画像を現在の画像リストの最後(常に存在します)に追加するだけです。一部の形式(GIFなど)では、読み込まれるものを制限するために、特別なインデックス付き読み取り修飾子が入力ファイル名に追加されない限り、現在の画像リストに複数の画像が実際に追加される場合があります。画像を保存する場合、IMは書き込み時にメモリ内にある画像リスト全体を保存します。画像形式で許可されている場合、IMはすべての画像を単一のファイルに書き込みます。形式が複数の画像を許可していない場合(たとえばJPEG)、画像を別々のファイルに書き込みます(複数画像の書き込みを参照)。

括弧 -- 「片側」での画像処理

コマンドラインオプションの形式化により、処理順序が正確に予測可能になり、画像処理に括弧(または角かっこ)を追加することも可能になりました。これは、IMユーザーが長い間望んでいた機能であり、単一のコマンドでこれまで不可能だったことを実行できます。開始括弧 '(' は、実際には新しい画像リストを開始し、囲まれたすべての演算子が機能します。一致する閉じ括弧 ')' は、結果の画像リスト(複数の画像、またはまったく画像がない場合もあります)を、前の画像リストの最後に追加します。言い換えれば、括弧を使用することは、次のことを意味します...
「別の画像リストで少し作業を行う必要があります
結果を前のリストの最後に追加する前に。」
これにより、スクラッチパッドのように画像のサブセットで作業してから、以前に読み込んだり作業したりした画像に影響を与えることなく、結果をメインの画像リストに戻すことができます。いくつかの簡単な例を見てみましょう...

  magick  eye.gif  storm.gif  -negate  +append  cmd_negate.gif
[IM Output]
わかるように、"-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" を使用して可能でした(モンタージュ連結モードを参照)。ただし、別のコマンドを使用すると、画像処理スクリプトがより複雑になります。もちろん、コマンド自体を配列のように見せたい場合は、いくつかの追加の括弧を自由に追加できます。

  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」がこの動作を上書きできます。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」リスト演算子は、画像リスト演算子の中で最も単純で、現在の画像リストから画像を削除するだけです。

  magick font_[0-3].gif -delete 1 +append  seq_delete.gif
[IM Output]
演算子の「plus」形式「+delete」は引数を取らず、現在の画像リストの最後の画像を削除するだけです。「-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)までの画像を削除することを意味します。言い換えれば、現在の画像リストのすべての画像です。次に、ツリー画像が追加され、IM に実際の結果が与えられ、「画像なし」タイプのエラーを回避しました。「NULL:」出力画像を使用して、出力を生成しないこともできました。画像インデックスが存在しない場合、または数値範囲が反転している場合、「-delete」はその特定の画像削除を無視します。たとえば、引数 '-25' は画像リストの最後から 25 番目の画像を削除しようとしますが、25 枚未満の画像しか存在しない場合は何もせずに無視します。したがって、次のようなシーケンスを使用して、24 枚の画像のローリングアニメーションを生成できます...

  magick animation.gif  new_frame.gif  -delete -25  animation_new.gif
ただし、画像の数が 24 枚以下の場合、画像は削除されません。その結果、アニメーションは、コマンドが実行されるたびに 1 フレームずつ増加し、最大 24 フレームに達します。その後、最も古い(最初の)フレームが削除され、新しいフレームが追加されます。IM v6.3.4 以降、「-delete」は、数値範囲が反転する結果になる画像を削除しません。つまり、最後の例は次のように書き直すことができます...

  magick long_animation.gif  new_frame.gif  -delete 0--25  animation_new.gif
今回、「-delete」は、最初から最後から25番目の画像までのすべての画像を削除し、リストに最大24枚の画像を保持します。画像が24枚以下しかない場合、削除される画像の範囲は事実上反転し、「-delete」演算子は何も削除しません。

-insert {index}

-insert」操作は、ある意味で「-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]
plus 形式「+insert」は、最後の画像を画像リストの先頭(インデックス0)に移動し、事実上、画像リスト全体を 1 フレームずつロールします。

  magick font_[0-3].gif tree.gif +insert +append seq_insert3.gif
[IM Output]
上記と逆のことを行う(画像を画像リストの末尾に移動する)には、最初に「-duplicate 1,0」を使用して最初の画像をコピーし、次に「-delete 0」を使用して最初の画像を削除します。

-swap {index}[,{index}]

簡単に言うと、「-swap」は、現在の画像リスト内の 2 つの画像の位置を入れ替えます。たとえば、「-swap 0,2」は、現在の画像リストの最初と3番目の画像を入れ替えます。

  magick font_[0-3].gif  -swap 0,2  +append  seq_swap.gif
[IM Output]
このオプションの plus 形式「+swap」は、現在の画像リストの最後の 2 つの画像を入れ替えます。言い換えれば、「-swap -2,-1」と同等です。

  magick font_[0-3].gif  +swap  +append  seq_swap2.gif
[IM Output]
この演算子の最も一般的な用途は、「-composite」、「-flatten」、「-append」、または「-fx」などの画像レイヤリング演算子で使用する前に、2つの画像を入れ替えることです。

  magick tree.gif  frame.gif   +swap \
          -gravity center  -composite   framed_tree.gif
[IM Output]
IM v6.4 以降、「-swap」を1つの数値で使用すると、最後の画像が指定された数値と入れ替わります。つまり、「-swap 1」は「-swap 1,-1」と同等です。

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

-reverse

-reverse」演算子(IM v6.3.4 に追加)は、画像リスト全体の順序を単純に反転します。

  magick font_[0-3].gif -reverse  +append seq_reverse.gif
[IM Output]
基本的に、究極のSwap Operatorです。

-clone {index_range_list}

この画像リスト演算子は少し異なります。画像リスト番号が指定された場合、「-clone」は、'開き括弧'または'括弧'演算子によって保存された画像のコピーを作成します。つまり...
Clone は括弧内でのみ使用する必要があります
この理由は、最後に保存(プッシュ)された画像リストから画像のコピーを抽出して、さらに処理できるようにするためです。たとえば。

  magick font_[0-2].gif \( -clone 1 -rotate 90 \) +append  seq_clone.gif
[IM Output]
引数のない「plus」形式「+clone」は、保存(プッシュ)された画像リストの最後の画像のコピーを作成して、さらに処理できるようにします。

  magick font_[0-2].gif \( +clone -flip \) +append  seq_clone2.gif
[IM Output]
バージョン6.2.2のリリース以降、「-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 Image Operatorは括弧なしで使用でき、現在の画像リストから画像をコピーして直接追加するだけです。ただし、これは意図された使用法ではなく、後でその一連の操作を括弧で囲むと異なる結果になるため、推奨されません。また、上記の例では、演算子を示すために、クローンを生成して現在の画像リストに追加しています。実際には、Duplicate Image Operatorを使用して、現在の画像リスト内の画像を複製する必要があります。そうすることで、何をしようとしているかが明確になります。MPR:Image Memory Registerを使用して画像をクローンすることもでき、IM v5で利用できました。実際には、上記の画像リスト演算子のように単一の画像だけでなく、後で使用するために画像リスト全体(長さ不明)を複製して保存するための便利な方法です。

-duplicate {count}[,{index_range}]

-duplicate」を使用して、現在の画像リストから画像の追加コピー(クローン)を生成できます(IM v6.6.8-7が追加されました)。新しい画像はリストの末尾に追加されます。以前の(より古い)Clone Operatorとは異なり、括弧を使用する必要はありません。たとえば、画像の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回だけ複製する場合は、引数の「plus」形式を使用できます。

  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]
パトロールサイクルタイプのアニメーションリストも、反転した画像リストを使用することで簡単に作成できます。

  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 Image Operatorを使用して、一度に1セットの画像のみを複製できます。または、Color Morph Operatorを基本的に誤用する手法を使用して、複数の複製画像を生成することもできます。トリックは、最初に1つのクローンを作成して2つの同一の画像を生成し、次に「-morph」を使用して、最後のN-2個の画像をそれらの間に生成することです。

  magick font_7.gif \( +clone \) -morph 3  +append seq_dup_morph.gif
[IM Output]
ただし、Color Morph Operatorを誤用すると、画像が実際に処理されるため、モーフが実際に画像を処理するのに時間がかかります(変更は発生しません)。また、作成された画像には元のデータの実際のコピーが含まれており、単純なメモリ節約クローンではありません。

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

これらの演算子を使用すると、特定の画像のコピーを抽出したり、変更したり、その画像を取得した場所に戻したりできます。たとえば、ここでは、2番目の画像(画像インデックス'1')の「-clone」を作成し、画像の色の青を赤に変更し、元の画像を最初に「-delete」して、次に新しい画像を「-insert」することで、元の画像と置き換えます。

  magick font_[0-3].gif  \( -clone 1  -modulate 100,100,166 \) \
          -delete 1  -insert 1    +append seq_update_1.gif
[IM Output]
より一般的になってきていると思われる別の方法は、元の画像を置き換えるために "-swap" を使用し、次に、末尾に移動した古い画像を "+delete" で削除する方法です。これにより、画像をクローンするために3回指定する必要があったのが、変更された画像を置き換えるために2回だけ、画像の場所を指定するだけで済みます。

  magick font_[0-3].gif  \( -clone 2  -modulate 100,100,166 \) \
          -swap 2  +delete     +append seq_update_2.gif
[IM Output]
これらのテクニックは、次のセクションの「複雑な画像処理とデバッグ」で引き続き説明します。

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

画像シーケンス演算子(上記参照)が追加されたおかげで、画像をステップごとに処理し、毎回画像を保存して再度読み込む必要はなくなりました。代わりに、中間画像をメモリに保持し、処理を続けることができます。これにより、画像のファイル形式への変換と、低速なディスクへの画像の保存という、時間のかかる両方の処理を大幅に節約できます。このタイプの画像処理コマンドは非常に長く複雑になる可能性があります。そのため、コマンドをスクリプトに記述し、プログラミングと編集を容易にするために、各主要な操作を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" の代わりに、'show:' を使用することもできます。これにより、結果の画像が画面に表示され、元のコマンドを続行または終了させることができます。詳細については、「表示、画像出力の表示」を参照してください。

          +append  show:
実際には、"+append" を使用する必要さえありません。その場合、IMは「スペースバー」を押すことで、各画像を順番に表示します。「montage」コマンドを使用して、より良い方法で結果を表示することもできます...

          miff:- | montage - -bordercolor blue -border 1 -geometry +2+2 show:
このタイプの画像処理では、画像が作成された直後の中間画像を簡単に表示することもできます。基本的には、"\( ... \)" ステートメントの間にこの行を挿入できます。

          \( +clone -write show: +delete \)\
IMは、中間画像が表示目的で出力されると、自動的に処理を続行します。「表示、画像出力の表示」を参照してください。あるいは、代わりにこの行を挿入することで、処理のその時点で生成されたすべての現在の画像を表示できます...

          \( -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には、多くの画像処理演算子が動作方法を変更するために使用する多くの特別な「設定」も添付されています。たとえば、使用する「背景色」です。これらのいくつかはグローバル設定であり、画像リスト全体で同じですが、他のものはリスト内の各画像で異なる場合があります。それでは、どのようなものが画像の一部なのでしょうか?たくさんのものがあります...
  • 画像ファイル形式で画像とともに通常(必ずしも常にではない)保存される画像メタデータ。たとえば、プロファイル、ラベル、キャプション、コメント、および仮想キャンバス情報(ページ)。これらはすべて画像ごとの設定であり、現在の画像リスト内の各画像で異なる場合があります。
  • 多くの異なる画像処理演算子で使用されますが、一般的に画像とともに保存されないグローバル設定:背景、ボーダーカラー、塗りつぶし、マットカラーなどの色、フォント、ポイントサイズ、グラビティ、合成方法、カラーチャネル処理、カラー値の読み取り/書き込みビット深度。
  • 特定の画像処理演算子のより深く、より低いレベルの操作を制御するために使用される、専門的な設定と定義。たとえば、歪みビューポート、特殊な合成メソッド引数。
  • ImageMagick内で画像が実際にメモリに保存される方法:たとえば、RGBまたはCMYKとして。アルファチャネルが存在し、有効になっているかどうか、また、読み込まれたときに画像が持っていた可能性のあるパレット。ただし、これらのストレージ設定の一部は、コンパイル時にハードコードされています(メモリ内のカラー値の品質など)。
  • デバッグ設定や詳細設定など、通常は情報出力またはエラー処理を制御する、一般的なIM操作設定。
つまり、保存したり、画像が処理される方法に影響を与えたりする可能性のある情報がたくさんあります。また、それらはいくつかのグループに分類できますが、ImageMagickがこれらの各事項をどれだけうまく処理するか、また、それらがグローバルか画像固有かは、関係する特定の事項に大きく依存します。はい、具体的になるまであいまいなままにせざるを得ないため、あいまいな言い方をしています。また、非常に混乱する可能性もあります。これらのすべての値は、3つの異なる方法でメモリ内の画像とともに保存されます...
属性
これらは、さまざまな画像処理演算子による高速で直接的なアクセスを可能にするために、一般的に、各画像の特別なデータ構造項目として保存されます。たとえば、画像サイズ、仮想キャンバスジオメトリ、背景、塗りつぶし、ストローク、マットカラー、ポイントサイズ、密度、フォント、合成、補間、仮想ピクセルメソッド、プロファイルブロック、時間遅延と破棄設定など、その他多くのもの。これらのいくつかは各画像に「固有」であることに注意してください。一方、他のものは、CLIインターフェイスによってすべての画像で同じ値に設定される「グローバル」設定として扱われますが、個々の画像の一部として保存されています。属性は通常、通常の画像処理の一部として、またはより一般的には設定を使用して、多くのオプションを使用して変更されます。
プロパティ
これらは、個々のベースで各画像に添付される、自由形式のキーと値の文字列のセットです。各画像には、完全に異なる文字列セットを含めることができます。本質的に、それらは定期的にアクセスまたはデコードする必要のないメタデータ項目、または何らかの特別な方法で使用されるメタデータ項目です。これの一般的な例は、ラベル、キャプション、コメント文字列、作成日と変更日、ユーザー定義文字列、一部の演算子からの結果です。ユーザーは、「キー」が既知の「属性」に対応していない限り、設定を使用してこれらを設定または変更できます。
アーティファクト
これは、すべての画像で共通の自由形式の文字列のグローバルセットです。これは、すべての画像の読み取りと画像処理を定義または変更する自由形式のグローバル設定を保持するために使用されます。その例としては、詳細なmagick identify出力を含む、いくつかのアクションに関する一般的な情報を出力させる「verbose」設定があります。ユーザーは、定義(下記参照)、または設定の特別なケース(設定「Option:」を使用した定義とアーティファクトを参照)を使用して、これらのグローバル値を変更できます。
これらの3つのストレージ方法を理解することは、ImageMagick内での設定とメタデータの処理方法を知るための鍵です。そして、非常に高度で、通常は達成困難な画像処理テクニックを実行できるようにします。

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

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

  magick -label one  image_one.png \
          -label two  image_two.png     output_image_list
一方、「-set」演算子は、以前に読み込まれたものを含め、現在のイメージリストにあるすべてのイメージを変更します。したがって、これまでに読み込まれたすべてのイメージに適用する場合を除き、オプションを適用するイメージを制限するには、通常は括弧を使用する必要があります。

  magick \( image_one.png -set label one \) \
          \( image_two.png -set label two \)  output_image_list
設定を解除するには、「+label」を使用します。その場合、ラベルのメタデータは、イメージが読み込まれるか作成されるときにそのままにされます。読み込まれたイメージにラベルがない場合、IMは論理的なデフォルトにフォールバックします。ラベルの場合、それは空の文字列になります。この両方の方法の詳細で具体的な例については、画像のモンタージュのラベル付けを参照してください。これは、ラベル付けの目的で多用されています。イメージのメタデータを設定するこの「二重性」は、他のオプションにも存在します。これには、「-comment」、「-caption」、「-page」、「-dispose」、および「-delay」が含まれます。ただし、仮想キャンバスのサイズとイメージのオフセット設定(ページ)には、特別な演算子「-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」または特殊な「-repage」演算子は、すでにメモリに読み込まれているイメージ、または複雑な画像処理手法によって作成されたイメージを変更する必要がある場合に適しています。たとえば、最後の例の3番目のイメージ(イメージインデックス「2」、つまり「木」)のイメージオフセットを変更する場合などです。

  magick animation_page.gif \
          \( -clone 2 -set page +55+10 \) -swap 2  +delete \
          animation_mod.gif
[IM Output]
イメージリスト内の個々のイメージを抽出および変更するより極端な例については、アニメーションのフレームごとの変更を参照してください。ここでは、「-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:」を、メモリ内のイメージに属性を設定する代替方法として使用できます。たとえば、メモリ内にある「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でイメージのメタデータを変更する唯一の方法です。(不快!)

一般的なグローバル属性

建設中
Most of these attributes are generally set globally either before or after
reading images into memory (it makes no difference).  They are typically used
as a general control of the later image processing operations.

 * Many settings are simpley globally saved for use as needed
     -fill  -background  -bordercolor  -strokecolor  -mattecolor  -quantize
     +dither  -channels  -size  -gravity  -units  -density  -font  -pointsize
     -tile

 * Some settings affect the way an image is saved to disk, or the meta-data
   saved with the image.  This includes
     -loop  -compression  -quality  -depth
     -density  -background

 * -compose is awkward, as it can only be set globally. But if unset
   then individual images can have a different setting (for layering).

   Most of these however can be turned off, (using a + version) which
   causes the operator to retrieve the setting from image meta-data
   (eg: +background falls back to the original images meta-data if present)
   but more generally it falls back to some default value. (eg:
   +gravity falls back to 'None' to mean no gravity has been set).

   A few of these also get saved with images when written. Specifically
   the GIF format will save an the -background and -bordercolor as part of the
   images attributes, however these are normally ignored by programs which
   read these images.

You may have noticed that some settings are used in multiple places.
for example  -density

  * used in reading in many vector format images like
    Postscript, PDF, and WMF image formats.
  * also in special image generators such as label: caption: and text:
  * used as part of font drawing in -annotate -draw and -polaroid  operators.
  * And finally some formats save the density or resolution as part
    of the the image file format. For example postscript wrapped raster
    images, JPEG, and TIFF.

Is it any wonder then why settings can be so confusing.

仮想キャンバス、ページオペレータとリページオペレータ

IMにおける「ページ」または「仮想キャンバス」設定の主な目的は、イメージの「実際の」部分(実際にカラーピクセルデータを含む部分)が、より大きな「キャンバス」のコンテキストにどのように適合するかを定義することです。これは、複数のイメージが関係し、複数のイメージのレイヤーGIFアニメーションで互いに対して相対的に配置する必要がある場合に特に重要です。また、Postscriptや、テキストの「ページ」のイメージを生成する場合に、イメージがより大きな物理的な紙や「ページ」のどこに収まるかを定義するために(したがって、「ページ」という用語の名前)使用されます。多くの場合、複数のイメージのレイヤーGIFアニメーションに使用されますが、トリミングトリミングの際にイメージの元の位置を記憶したり、複数イメージリストの合成一般的なイメージの歪みにも関与します。ここで、「ページ」は、「仮想キャンバス」または領域(イメージが存在するより大きな空間を定義)と、「キャンバス」内の実際のイメージが配置される「オフセット」または位置という、2つの異なる部分を定義します。
負の「オフセット」は許可されますが、「キャンバスサイズ」は0,0から指定された幅と高さまでの領域に制限されます。つまり、正のキャンバスのみを指定できます。
これら2つの側面である「サイズ」と「オフセット」は密接に関連していますが、通常はこれらの側面を別々に、またはより制御された方法で処理する必要があります。したがって、通常の「-page」および「-set page」メソッドに加えて、より細かく制御できるように、別のオプション「-repage」も提供されています。具体的には...
+repage
引数がない場合、イメージの仮想キャンバスを実際のイメージ自体にリセットします。つまり、イメージが持つ可能性のある仮想キャンバス情報をクリアするだけです。これは、トリミングトリミングなどのイメージサブ分割演算子を適用した後に重要になることがよくあります。特に、多くのブラウザがキャンバス/オフセット情報をイメージ表示の一部として使用するため、GIFまたはPNGイメージファイル形式に保存する前に、仮想キャンバスのサイズとオフセットを削除することが重要です。
-repage WxH
既存のイメージの仮想キャンバスサイズを変更しますが、そのキャンバス上のイメージの位置はリセットしません。「-page」または「-set page」にこの引数を指定すると、イメージの位置が「+0+0」にリセットされます。これはおそらく望ましくないことです。
-repage +X+Y
イメージのキャンバスサイズを変更せずに、仮想キャンバス上のイメージをこの絶対位置に移動するだけです。
-repage +X+Y\!
イメージの既存のオフセット位置に指定された数値(正または負)を加算することにより、仮想キャンバス上のイメージを相対的に移動します。
-repage 0x0
イメージ全体を包含する最適な仮想キャンバスサイズを見つけようとします。ただし、負のオフセットを持つイメージの場合、負のコンポーネントを持つ仮想キャンバスを指定する方法がないため、これは失敗します。問題を回避するために、可能な限り最小のキャンバスサイズとして実際のイメージのサイズを使用します。つまり、ゼロ次元の仮想キャンバスを割り当てることはありません。
-repage 0x0+X+Y
イメージのオフセットを移動し、次にイメージの新しい場所に最適になるように仮想キャンバスのサイズを変更します。
-repage 0x0+0+0
+repage」または「+set page」または「-set page 0x0」と同等です。すべての仮想キャンバスとオフセット情報が削除されます。
-repage WxH+X+Y
-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」は、「text:」および「ps:」イメージジェネレーター演算子に対して特別な意味を持ちます(テキスト:複数行のテキストファイルおよびPS:Postscript形式のテキストとグラフィックを参照)。そのため、これらのイメージの作成中には、通常のキャンバスサイズとオフセットの意味は使用されません。

設定とイメージごとのプロパティ

ただし、IMは、イメージが持つ可能性のあるすべての設定を処理するためのオプションを作成することはできません。それは不可能です。それだけでなく、ユーザーは独自の追加または設定を定義することを好むことがよくあります。このため、「-set」オプションは、実際には任意の値を持つ任意の設定を定義できます。設定がイメージの特定の既知の属性(演算子による高速アクセスを可能にする方法で保存される)でない場合、'プロパティ'(文字列の配列)としてイメージに保存され、詳細な「magick identify」出力の下部にリストされるか、パーセントエスケープを使用して取得および展開されます。たとえば、組み込みのroseイメージは、2つの日付文字列と「署名ハッシュ」という3つの「プロパティ」を自動的に生成します。これに加えて、独自のユーザー定義の「プロパティ」設定も追加しました。

  magick rose:  -set my_property my_value   -verbose info: |\
    sed -n '/Artifacts/q; /Properties/,$ p'
[IM Text]
一部の画像処理演算子は、特別な関心のある値をイメージ「プロパティ」として返します。それらは他の演算子には必要ないため、「属性」として保存されませんが、ユーザーが使用する可能性のある「プロパティ」文字列として保存されます。たとえば、最適フィットラベルで選択された最終ポイントサイズは、特別なイメージプロパティとして保存されます。

  magick -size 100x label:Anthony  -verbose -identify  property_label.gif |\
    sed -n '/Artifacts/q; /Properties/,$ p'
[IM Output]
[IM Text]
なお、label:ジェネレーター自体も「label」属性を設定しますが、これはプロパティ文字列として保存されることがあります。
すべての「プロパティ」は、フリーフォームの文字列データ型として保存され、イメージメタデータとして格納されます。

このため、すべての「属性」が「プロパティ」として保存されるわけではありません。多くの属性は、画像処理演算子によって数値データとして直接保存および使用される必要があるためです。この例は、仮想キャンバスの「ページ」属性です。
ここでは、identify「-format」設定を使用して、作成されて破棄されたラベルのポイントサイズをIMに出力させます。

  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"演算子を使用して設定されます。このような「アーティファクト」の主な目的は、画像ファイルフォーマットコーダー画像処理演算子によって追加(または帯域外)の設定として使用できる特別な設定としてです。基本的に、別の「属性」を作成する必要なく、特定の要件に合わせて自由形式の設定を追加できます。また、グローバルに設定されているため、特定の画像に付随するのではなく、画像シーケンス内のすべての画像に付随し、まだ画像が読み込まれたり作成されたりしていない場合でも使用できます。
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"操作制御(下記参照)は、実際には"-define verbose"を使用することと同じであり、したがって「verbose」アーティファクトを作成します。例えば...

  magick xc: -verbose info: |\
    sed -n '/Tainted:/q; /Artifacts:/,$ p'
[IM Text]
したがって、プラス形式の"+verbose"は、「verbose」アーティファクトを削除するだけであり、"+define verbose"と同じです。

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

アーティファクトは、定義が与えられた後、読み込まれた画像に割り当てる必要がある特別な属性を保持するためにもよく使用されます。"-label"設定も、ユーザーが提供した引数を持つアーティファクトを設定するだけです。このアーティファクトは、新しい画像が読み込まれるか作成された後、「label設定またはプロパティに変換されます。たとえば、ラベルセット付きの「rose:」画像を作成します。

  magick -label "%wx%h"  rose: -verbose info:  |\
      sed -n '/Tainted:/q; /Properties:/,$ p'
[IM Text]
つまり、"-label"は、最初に示された「label」アーティファクトを定義しました。後で、rose画像が作成され(そのサイズ属性が認識された)、IMはそのグローバルアーティファクトを画像固有の「プロパティ」に変換し、その時点でパーセントエスケープを展開しました。これは遅延パーセントエスケープとして知られています。"-comment"や"-caption"などの他のいくつかの設定オプションでも同じことが起こります。遅延パーセントエスケープのため、"-define"は文字列のみを保存し、"-set"演算子は展開を実行します。

"option:"を設定してアーティファクトを定義する

上記では、画像ごとに特別な目的の個人のプロパティを"-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"を使用すると、期待どおりに動作します。

  magick rose: -define myinfo='I love IM!'  label:'== %[myinfo] ==' \
          -gravity center  -append   artifact_append.gif
[IM Output]
では、画像プロパティまたは属性を使用してラベルを作成するにはどうすればよいでしょうか?"-define"オプションでは、現在画像プロパティを使用できません!秘訣は、"-set"オプションを使用するときに、特別なプレフィックス"option:"を使用することです。この追加により、"-set"はプレフィックスに続く名前で「アーティファクト」を定義します。たとえば、これは最後の例と同等です。

  magick rose: -set option:myinfo 'I love IM!'  label:'== %[myinfo] ==' \
          -gravity center  -append   property_option_append.gif
[IM Output]
さらに重要なことに、"-set"オプションはパーセントエスケープを展開します。これは、画像ごとのプロパティがある場合、それをグローバルアーティファクトに魔法をかけることができることを意味します。たとえば、ここでラベルを作成し、次に「label:pointsize」プロパティを「label:」画像ジェネレーターが作成した、グローバルアーティファクト「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」が、グローバルアーティファクトを生成しているにもかかわらず、現在の画像リスト内のすべての画像に適用されます。したがって、各画像は独自のプロパティをグローバルアーティファクトに割り当て、以前に割り当てられた値を置き換えます。完了すると、最後の画像のみがアーティファクトを「定義」します。
現時点では、「FXエスケープ」にはプロパティまたはアーティファクトを読み取る方法はありません。そのため、現在そのような値に対して算術演算を実行することはできません。

読み込みと書き込み時の画像タイプ

"-type"演算子/設定は、画像が読み込まれるとき、または書き出されるときに使用するスタイルまたはカラースペースを定義して、結果の画像(メモリ内または画像ファイル内)が期待どおりであることを保証します。この一部として、ファイルI/O時にカラースペースの変更を実行する場合がありますが、画像が期待される形式であることを保証するためだけです。たとえば、"-type"には、一部の画像形式で2色モノクロ画像として画像を魔法で保存するために使用できる特別な「bilevel」設定があります。同様に、「TrueColor」および「TrueColorAlpha」を使用すると、画像が実際には純粋なグレースケールであっても、TIFF画像をフルカラーRGB画像として強制的に保存できます。その他の設定には、「GrayScale」および「GrayScaleAlpha」があり、書き込まれた画像がグレースケールのみであることを保証します(それぞれ透明の有無にかかわらず)。または、「Palette」を使用すると、このオプションをサポートする形式でインデックス付きカラーマップの使用を強制します。画像ファイル形式の読み取り中に、"-type"設定の「TrueColorAlpha」を使用すると、読み込まれるJPEG画像に、JPEG形式自体は透明度を処理できませんが、メモリ内ストレージに追加される「アルファ」チャネルが強制的に追加されます。PNGファイル形式に書き込む場合、「-type」を「Pallette」に設定すると、カラーインデックス付きの"PNG8'内部画像形式の使用が強制されます。同様に、「BiLevel」を使用すると、IMはほとんどの画像ファイル形式でカラー画像を白黒にディザリングします。残念ながら、"-type"の正確な意味と機能は、読み取りまたは書き込みを行っている特定の画像形式によって異なります。さまざまな画像ファイル形式の例の領域を参照してください。特定のPNGの例については、PNG出力形式を参照してください。

画像の品質の制御

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

品質深度は、フォーラムやこれらのサンプルページでの議論でよく話題になる2つの用語であるため、少し説明したいと思います。品質はImageMagickのコンパイル時の設定であり、IMメモリ内および処理中に画像を格納するために使用される値のサイズを決定するために使用されます。基本的に、特定のIMがコンパイルされた処理の品質を意味します。深度は、画像が画像ファイル形式との間で読み込まれたり保存されたりするときに使用される値のサイズです。したがって、より変動が大きく、"-depth"設定によって、または読み込まれた画像の元の「深度」によって制御されます。これについては後ほど詳しく説明します。覚えておいてください...
品質は「メモリ内」の値サイズであり、IMにコンパイルされます。
深度はファイル形式の値サイズであり、可変です。
現在、ほとんどの画像形式の深度は8です。つまり、画像で使用される各カラー値を保持するために8ビット(または0〜28-1の値)を使用します。つまり、赤に0〜255、緑に0〜255、青チャンネルに0〜255の値です。通常、このタイプの画像は24ビット画像(つまり、"-depth"設定で使用される「値ごとのビット」ではなく、「ピクセルごとのビット」)と呼ばれます。これには、JPEGなどの形式が含まれます。アルファチャネルも関与している場合は、4 x 8ビット値、つまり32ビット/ピクセル画像が得られます。これは、PNG画像が通常使用するものですが、そのような画像は値ごとに16ビットを使用して保存することもできます。多くの人が8ビット画像(8ビット/ピクセル)と呼んでいるものは、実際には8ビットパレットまたはカラーマップ(画像全体で最大256色の制限を与える)を持つ画像です。実際のピクセルデータは8ビットのインデックス値(0〜255)であり、これはカラーテーブルからそのピクセルの色を検索するために使用されます。つまり、「ラスター」(ピクセル配列)は、カラーテーブルから実際のピクセルカラーを検索するために使用されるインデックスにすぎません。言い換えれば、8ビット画像も8ビット深度を持っていますが、8ビットはカラー参照テーブルへのインデックスであり、実際のカラーではありません。GIF画像は、これの良い例です。このような画像の透明度は、通常、GIF形式のように、("-transparent-color"メタデータ設定を使用して設定される)透明を表す特定のカラーを指定するか、カラーテーブル内の特定の数のカラーに特別なプロファイルを使用することで処理されます(一部のPNG8画像(GIFのようなカラー画像でもある)で使用されます)。一般に...
24ビット画像:3 x 8ビットの値 - 3つのカラーチャンネルのみ
32ビット画像:4 x 8ビットの値 - 3つのカラー + アルファチャンネル
8ビット画像:8ビットカラーインデックス画像、256色制限
ほとんどの画像フォーマットは8ビット/値の深度でカラー値のみを保存するため、多くの人がIMを「Q」(クオリティ)レベル8の深度でインストールしています。これは、通常のIMのQ16バージョンよりもはるかに少ないメモリで済み、画像の処理速度が速いためです。多くの場合、3倍以上高速です。これらのQ8バージョンは、一般的な画像処理(トリミングなど)やフォーマット間の変換に適しており、単純な画像の生成、注釈、または画像のオーバーレイにも適しています。ただし、低品質のIMは高速でメモリ効率が良い一方で、複数の色の変更、サイズ変更、暗くする、明るくする、ガンマ補正、またはヒストグラムカラー補正などの複雑な一連の操作を使用し始めると、うまく機能しません。Q8では、メモリ内の中間画像は8ビット品質で保存されたままになり、そのため複数の操作はそれぞれ小さな段階的な色歪みを引き起こします。その結果、特に白と黒に近い極端な色では、丸め効果が発生する可能性があります(下記参照)。

Quality - メモリ内のビット品質

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

また、画像のリサイズなどの追加の色を生成する多くの演算子は、メモリ内の画像の「深度」をコンパイル時の品質設定にリセットします。これにより、可能な場合はIMはより高い深度で保存しようとします。

HDRI - 浮動小数点品質

HDRI、またはハイダイナミックレンジイメージングは、もともとシーンの明るい領域と暗い領域の両方を同時に認識する人間の目の能力をより自然に表現するように設計されました。実際的な画像処理の観点からは、それ以上のことができます。IMのHDRIバージョン(デフォルトのビルド)は、メモリに保存された画像に浮動小数点値を使用するようにコンパイルされ、画像操作のより正確なHDRI処理を可能にし、そのような操作が極端な色で画像を「クリッピング」するのを防ぎます。HDRIは、メモリ内ストレージのデフォルトのコンパイル時クオリティ設定と同じカラー範囲を使用します。つまり、値は依然として「0」から「Quantum Range」までの範囲で、黒から白を意味します。ただし、値は整数ではなく、浮動小数点(Cプログラミング用語では「double」)を使用して保存されるため、値を整数に丸めることによる「量子」効果は見られません。値が「Quantum Range」を超えたり負の数になったりしても、値は「クリッピング」されません。基本的に、処理ステップ間での情報の損失ははるかに少なくなります。したがって、HDRIは、一時的な負の値の使用や、非常に小さい値または非常に大きな値への強力なスケーリングを含む、画像の非常に強力な数学的処理を行う予定の場合には不可欠です。特に高速フーリエ変換(FFT)機能を最大限に活用したいユーザーにとって重要であり、これらのページでは、IMのHDRIバージョンの最も多くの例を見ることができます。IMのHDRIバージョンのコンパイルの詳細については、IMメインWebサイトのImageMagickでのHDRIの有効化を参照してください。また、WindowsおよびUbuntu Linux固有の情報については、ユーザーフォーラムのフーリエ変換発表ディスカッションを参照してください。HDRIを使用する際に留意する必要のある重要な演算子の1つは、「-clamp」です。このオプションは、画像の通常範囲外になる画像内の値をクリップします。つまり、負の値はゼロにクリップされ、「QuantumRange」より大きい値はその値に設定されます。ただし、浮動小数点値を整数に「丸める」ことはありません。

量子効果、HDRI vs 非HDRI

量子の丸め... たとえば、ここでは、グラデーション画像のカラー範囲を0〜15の値のみを使用するように圧縮し、再び圧縮解除するために、レベルおよびリバースレベル演算子を使用します。結果のグラデーションは、追跡しやすくするために、画像プロファイルとしても表示されます(スクリプト「im_profile」を使用)。

  # Using a normal non-HDRI version of 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が追加のメモリ使用量で解決する問題です。量子丸めは、高速フーリエ変換(FFT)や、ハイダイナミックレンジ画像を生成するために異なる露光時間(光強度)を含む画像の結合など、非常に負荷の高い画像処理を使用する場合にのみIM Q16の問題になります。結局のところ、これがそもそもHDRIがImageMagickに追加された理由です。燃焼とクリッピング... そしてここで、元の黒と白のカラー値が「量子範囲」をはるかに超えるようにグラデーションを「ストレッチ」してから、再び復元します。

  # Using a normal non-HDRI version of 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では両端で情報が失われていることがわかります。下端の値は負の値になるにつれて「燃焼」し、上の値は、値を格納するために使用される整数の最大「量子範囲」制限を超えると「クリップ」されます。ImageMagickのHDRIバージョンの結果... HDRIバージョンのImageMagickを使用してこれらの2つの操作を繰り返しても、上記の丸め、燃焼、またはクリッピングの結果は生成されませんが、(doubleは整数よりも多くのスペースを必要とするため)メモリの点で余分なコストがかかります。速度に関しては、コストはそれほどかからず、浮動小数点アクセラレータのおかげで、今日の多くの最新コンピュータハードウェアではさらに高速になる可能性があります。

  # Using HDRI version of 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で画像境界を強制するクランプ

2つのレベルオプション間で「-clamp」を使用することで、HDRI画像を通常の画像値範囲で「クリップ」するように強制できます。例:...

  # Using a HDRI version of 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」を使用すると、基本的には通常の非HDRIバージョンのImageMagickで得られたものと同じ画像が生成されました。ただし、この画像は、非HDRIの結果とまったく同じではありません。なぜなら、「-clamp」は画像の値を燃やしてクリップしますが、量子の丸め効果は追加しないためです。したがって、値は最終的な非HDRI画像ファイル形式への保存中にのみ整数に丸められています。「-clamp」オプションは、HDRIを使用するときに、必要な結果を達成するために非常に重要になる可能性があります。

HDRIファイル形式

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

どのQレベルを使用すべきか

まとめとして、どのタイプのImageMagickを使用すべきでしょうか? Q8、Q16、HDRI? Q8は、画像の値がメモリに8ビット値として保存されるため、ほとんどの画像ファイル形式と同様に、メモリフットプリントが小さくなります。基本的な合成、画像形式の変換、単純な「一度きりのリサイズ」、または画像への描画には、Q8で「十分」です。Q16は、色の値が16ビット値(より高い精度)で保存されるため、メモリフットプリントが2倍になります。しかし、カラー空間の変更(sRGBとRGB間の変換だけでも)、リサイズ、歪み、ぼかし、影など、多くのレベルの処理を含む集中的な画像処理を同じ画像に対して同じコマンド(同じ理由でおすすめ)で行う予定がある場合は、16ビットの方が、処理ステップ間の画像の低精度を保持できるため、より優れています。また、最終的な保存がICOやJPEGのような8ビット画像ファイル形式に戻る場合でも、コマンド間で16ビットのファイル形式(PNG、MIFF、PbmPlus)で保存できます。(これがデフォルトの理由です)次のレベルはQ16 HDRIで、精度を32ビットの浮動小数点値まで上げることができ、画像の丸めやクリッピング効果なしに非常に小さくなったり大きくなったりする画像値を扱うことができます。また、特にいくつかの色空間では、負の値も扱うことができます。基本的には、HDRI画像、フーリエ変換、または生データの数学的処理で得られる可能性のある高レベルの圧縮、展開などの極端な処理で画像を処理する際に、画像データの損失を防ぐために使用されます。簡単に言えば、そういうことです。Q16は、歪みや複数画像の合成、画像処理効果を含むほとんどの操作に適した中間点です。メモリが限られているが、単純な操作しか行わない場合はQ8、極端な操作を行う場合はHDRIを使用してください。

画像密度または解像度

画像の密度とは、画像の空間解像度です。つまり、画像の密度(一般的にdpiまたはドット/インチで表される)は、個々のピクセルがどれだけ離れているか(またはどれだけ大きいか)、したがって実世界での画像の全体的なサイズを定義し、一般的に実際のデバイスでの画像の表示または印刷に使用されます。これは、プリンターやディスプレイなどの出力デバイスに、画像を表示する際の1インチあたりのドット数(またはピクセル数)を指示するために画像に保存された単なる数値であり、PostScript、PDF、MWF、SVGのようなベクター形式の場合、画像内で使用される可能性のある任意の実世界の座標を使用して描画するためのピクセルスケールです。これは、実際の画像のピクセルサイズ、または画像の色の「解像度」を定義するメモリ内の品質や保存ファイル形式の深度とは全く関係ありません。画像の解像度または密度は、画像を読み込むに"-density"機能を使用するか、画像を読み込んだ後に"-set density"を使用して、IMに読み込むときに設定できます。"-units"設定を使用して、密度数がデフォルト(従来の印刷)の'PixelsPerInch'で表されるか、より現代的なメトリック単位の'PixelsPerCentimeter'(PNGは後者を使用)で表されるかを定義できます。たとえば、600 dpiの200x200ピクセルの画像は、実世界では1/3インチの正方形で表示されます。一方、72dpiの72x72ピクセルの非常に小さな画像は、実世界では1インチの正方形で表示されますが、空間的な品質はそれほど高くありません。前者は「写真品質」、後者は「ディスプレイ解像度」です。実用上、72dpiの画像はプリンターで「デジタル」または「ドット状」に見えます。一方、1200dpiで撮影された大きな最新のデジタル写真は、ディスプレイに表示するためにリサンプリングする必要があるか、画像の一部しか表示されない可能性があります。画像の解像度と密度の詳細については、リサンプルリサイズ演算子に関する注記を参照してください。テキストとフォントの解像度と密度の詳細については、ポイントサイズと実際のフォントサイズを参照してください。

Photoshopと密度

画像エディターである「Photoshop」は、画像の解像度の追加コピーを、画像内の別のプロファイル('8BIM'という名前)に保存します。IMはこれに触れません。したがって、IMで画像の解像度を変更する場合は、「Photoshop」に再度ロードする前に、画像からプロファイルを削除する必要があるかもしれません。そうしないと、密度の変更が表示されない可能性があります。"+profile 8bim"を使用して、画像からそのプロファイルだけを削除できます。IMフォーラムのディスカッションから、Jesper Nilsson(別名stroker)は、プログラム"exiftool'を使用して、画像のPhotoshopタグを直接変更することを提案しています。たとえば、

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

品質に基づいた速度テスト

IMフォーラム、Q8 vs. Q16の速度(&HDRI)にいくつかの速度テストが提出されました。上記記事からの概算結果
  • チャネルごとのピクセルあたりの使用メモリ量は予想どおりです。Q8-1バイト、Q16-2バイト、Q32&すべてのHDRI-4バイト、Q64(HDRI)-8バイト。
  • 64ビットは浮動小数点演算で大幅な精度向上がありますが、ImageMagickの他のHDRIバージョンでも同様です。
  • 速度に関しては、Q8、Q16、HDRIはほぼ同じ速度(コンピューターに浮動小数点MPUがある場合)、Q32は約25%遅く、Q64(HDRI)は約50%遅いです。
Q64は64ビット整数ではなく、「double long floats」を自動的に使用することに注意してください。これは一種の倍精度HDRIですが、非常に正確である一方、メモリ内のすべての品質設定の中で最も遅く、最もメモリを消費します。
実際の速度は、コンピューターの仕様や、Mathコプロセッサーがあるかどうかによって異なります。それほど重要でない場合は、デフォルトのQ16または標準のHDRIを使用するのがおそらく最適です。

重要である場合は、自分の機器で、画像処理で通常使用する操作を使用して、速度に関する同様のテストを実行する必要があります。


ImageMagickの特別な制御

IMには、操作の実行、情報レポート、およびデバッグの目的で使用するいくつかの特別なオプションもあります。
-version IMのバージョン、使用している画像品質、およびビルドされた日時を出力します。IMはこの情報を出力した後、暗黙的に終了します。
IMv7では、"-version"がコマンドライン上の唯一のオプションの場合に終了します。つまり、最後の「暗黙的な書き込み」引数をオプションにします。他の引数が存在する場合、またはスクリプト(ファイルまたはパイプライン)から読み込まれた場合、magickコマンドは終了せず、続行します。
 
-list これは情報提供のみのオプションであり、要求された項目をリストして終了します。つまり、他のオプションや画像処理と一緒に使用することはできません。これは、特にスクリプトで入力オプションを確認したり、IMに特定の実装があるかどうかを確認したりするための情報提供を目的としています。指定された引数は、リストしたい情報を定義します。たとえば、使用できる「color」名のリスト(("-fill"、"-background"、"-mattecolor"、"-bordercolor")で使用する場合など)。一方、「font」は、IMが特に認識しているフォントをリストします。以下は、特に興味深いリストの一部です...
list "-list"がリストできるリスト!
font 既知のフォント(IMはXおよびPSフォントも認識しています)
type ファイル画像タイプ("-type")(IM v6.3.5-7以降)
またはフォントリスト(そのIMバージョン以前)
color さまざまな色オプションの既知の色名。
dispose すべてのGIF破棄設定("-dispose")
compose 利用可能なアルファ合成(内部メソッドを含む)
layers 実装されているマルチ画像"-layers"メソッド
distort 利用可能な画像歪みメソッド。
morphology 利用可能な画像形態学的メソッド。
kernel 利用可能な形態学的/畳み込みカーネル。
command 利用可能なコマンドラインオプション(設定と演算子の両方)
configure ImageMagickの構築に使用された構成パラメーター
最後の「list」設定である「Configure」は非常に重要です。IMのビルド時に利用可能だったライブラリとデリゲートがわかるためです。また、古いバージョンの通常の"-version"出力には欠けていた「ポイント」リリース番号も含まれています。(この情報の使用例については、スクリプトバージョン処理を参照してください)。IMはこの情報を出力した後、暗黙的に終了します。
IMv7では、"-list"がコマンドライン上の唯一のオプションの場合に終了します。つまり、最後の「暗黙的な書き込み」引数をオプションにします。他の引数が存在する場合、またはスクリプト(ファイルまたはパイプライン)から読み込まれた場合、magickコマンドは終了せず、続行します。
 
-verbose より複雑な操作に関する追加情報をレポートします。
例えば、多くの色量子化の詳細を出力する "-segment" などです。
そして、追加情報と、要求された画像歪みに相当する 'FX' を出力する "-distort"。また、"-morphology" 操作を反復処理する際の変化数を監視します。これは、"info:" や "-identify" の出力から、より詳細な画像情報を生成するのに特に役立ちます。この設定は、オプションの「プラス」形式である "+verbose" を使用してオフにできます。 
-regard
  -warnings
   
'-regard-warnings' を使用すると、一部の画像ファイル形式に関する有益な警告が致命的になります。また、このようなエラー状態に応じて、IM が適切な終了ステータスを返すようにします。これは、制御されていないソースから提供された画像ファイルを「サニタイズ」するためにスクリプトで使用できます。つまり、このオプションを使用すると、JPEG または TIFF 画像が正しくない、不完全である、または「不明な」プロファイルが含まれている場合、IM は失敗して終了します。 
-precision {数値} 有効桁数を制御します。
IM がさまざまなデバッグ、詳細出力、またはフォーマット要求に応答して浮動小数点値を出力する場合、この設定は、その出力に必要な精度を設定します。デフォルトでは、このような数値は有効桁数6桁に制限されますが、この演算子はこのデフォルトを増減させます。デフォルト設定の 6 は、'MAGICK_PRECISION' 環境変数を使用して変更することもできます。これは、次の出力に影響します... 
-quiet 情報提供の警告メッセージを報告しません。I/O エラーや無効なオプションなどの適切なエラーのみ。これは、"-crop" または "-trim" および "-layers optimize" に特に役立ちます。これらの操作は、結果として「実際の」画像が生成されない場合、通常は「見逃した画像」の警告を報告します。これは、IM が通常は無視する「不明なチャンク」を含む可能性のある、一部の複雑な画像ファイル形式のコーダーも静めます。たとえば、IM が TIFF 画像や奇妙な MPEG (AVI) ビデオ形式を読み取るときなどです。 
-respect
  -parenthesis
   
括弧 が、現在の画像リストを保存および復元するだけでなく、現在のすべての 操作設定 も保存および復元するようにします。つまり、指定された場合、括弧内で設定されたすべての設定は、括弧が終了するとリセットされます。上記の 括弧と設定の例を参照してください。 
-ping "identify" コマンド用。IM は、画像のサイズなどの基本情報について、画像ファイル形式全体を完全に読み取ってデコードすることを回避しようとします。 
-monitor 特に非常に大規模または長時間にわたる画像処理タスクの場合、画像処理の各段階での処理の割合を報告します。下位レベルの API では、SetImageInfoProgressMonitor() または SetImageProgressMonitor() を使用します。 
-debug IM がさまざまな領域で正確に何を行っているかを詳細に報告します。引数は、コンマ区切りのオプションリストです。例:
exception コマンドについて IM が理解していないこと
cache IM がどれくらいのディスクスペースをキャッシュしているかを確認します
configure IM が構成ファイルを検索しようとする試行を表示します。
trace 各ライブラリ関数の開始時にトレースポイントを報告します
annotate "-annotate" でフォントが使用されている場合、フォントメトリクスを報告します。
command IMv7 -- 処理中のコマンドラインオプション (またはスクリプト) を表示します。例: オプション処理。
all 処理中のすべてのトレースポイントを表示します
これは非常に冗長であり、推奨されません
"-debug" が使用されている場合、ログ出力の場所は "log.xml" ファイルによって制御されます。これはデフォルトで "console" に設定されています。ファイルに保存するには、<log output="console"/><log output="file"/> に変更します。コマンドラインおよび API の使用法については、IM によるアクションを使用してデバッグレベルを設定する環境変数を定義することもできます。

  export MAGICK_DEBUG=all
Limiting image size (quick note)

To prevent excess memory usage, set your memory limit to say 16GB. Now set
the disk limit to 4GB. ImageMagick will exit if the disk limit is exceeded,
with a "cache resource exhausted" exception.