ImageMagick の例 --
画像ファイル処理

インデックス
ImageMagick の例 序文とインデックス
画像フォーマットの概要
画像の読み込み
画像の保存
特殊な出力ファイル形式 (IMに固有)
miff:   info:   null:   txt:   sparse-color:   histogram:   mpr:   mpc:   fd:   inline:  
clipboard: -- Windows クリップボードとの読み書き
ephemeral: -- 読み込み後に自動削除
show:, win:, and x: -- 画像を直接表示
x: (入力として) -- 表示キャプチャと再描画
画像フォーマットのデリゲートとコーダー
大規模な画像処理
大量の画像の長いストリーム、ビデオシーケンス
画像を処理するには、画像に対して操作を行う演算子だけでなく、できるだけ多くの異なるファイル形式で画像を読み書きする方法も必要です。このセクションでは、IM のファイル形式全般について見ていきます。

画像フォーマットの概要

ImageMagick の最も一般的な用途の 1 つは、画像をまったく変更しないことではなく、ある画像形式から別の画像形式に変換することだけです。実際、これが IM が作成された当初の理由であり、このような画像形式の変換でした。これが、主要な IM コマンドが "magick" と呼ばれる理由です。この目的のために、ImageMagick は驚くほど多くの画像およびファイル形式を処理できます。この配列に加えて、組み込みのテスト画像、単純な画像作成、およびプログラミングシェルスクリプトやプログラムに固有の画像形式のための多数の特別な入力および出力形式があります。完全なリストについては、IM Web サイトのIM 画像フォーマットページを参照してください。これらすべてが、ImageMagick の新規ユーザーにとって気が遠くなる可能性があります。私からの最良のアドバイスは、ほとんどのファイル形式を無視することです。それらのファイル形式が必要になることはおそらくないでしょう。代わりに、やりたいことに集中して、それを実行してみてください。やり方がわからない場合は、このページや Web 全体で例を探してみてください。IM の例で示されている画像形式については、リファレンスインデックス、ファイル形式を参照してください。

画像の読み込み

IM はデフォルトで、ファイル内の「マジック」ファイル識別コードによって画像形式の種類を判別しようとします。ただし、これが失敗した場合は、ファイル名のサフィックスを使用するか、プレフィックス形式を追加して画像のファイル形式を指定する必要があります。一部の形式はファイルを読み込まず、指定されたファイル名を無視します。これらは、一般的な組み込み画像の一部です...

  logo:      granite:     rose:
それらのいくつかは、ファイル名として与えられた引数、およびおそらく最終的な画像サイズを制御する追加の "-size" に基づいて画像を生成します...

  -size 30x30  canvas:red
  -size 30x30  gradient:yellow-lime
  -size 30x30  pattern:fishscales
  magick import:
場合によっては、複数の形式を使用することもできます...

  -size 30x30  tile:pattern:gray95
ただし、この場合は「pattern:」形式コーダーに「tile:」コーダーが組み込まれているため、過剰です。しかし、あなたが何をしようとしているかを明確にしています。IM は、その画像 URL を指定することにより、「ワールドワイドウェブ」で公開されている画像をダウンロードすることもできます。これは基本的に「http:」画像コーダーを提供するものであり、それが機能する理由です。

  magick http://www.ict.griffith.edu.au/anthony/images/anthony_castle.gif \
          -resize 100x100 castle_logo.png
[IM Output]
ご覧のとおり、このコマンドは WWW から画像を読み込み、サイズを変更してから、結果をディスクに保存します。
プレフィックスファイル形式が指定されている場合、ファイル名の一部として指定されたサフィックスは、ファイルの読み込み方法には影響しません。これは、「text:」対「txt:」ファイル形式の処理など、一部のファイル形式を読み込む場合に不可欠です。もちろん、画像ジェネレーターが特別な方法で処理するために実際に画像ファイルを読み込む場合(たとえば「tile:」)、サフィックス(またはプレフィックス)ファイル形式が再び重要になります。最後の例のように
特別なコーダープレフィックス "implicit::" を使用して、コーダーの使用を「オフ」にして、ファイル名に ':' を使用できるようにすることができます。ファイル名には、「*」や「?」などの特殊な「ファイルメタ文字」を埋め込むことができます。IM はこれらの文字を展開して、読み込むファイル名のリストを生成し、外部シェルでこれを行う必要性やコマンドライン長の制限による問題を回避します。例...

  magick montage  '*.jpg' -geometry 50x50+2+2  image_index.gif
これにより、現在のディレクトリにあるすべての JPEG ファイルの単一のモンタージュインデックス画像が生成されます。ただし、UNIX シェルがファイル名を展開するのではなく、ImageMagick がファイル名を展開しないように、引数を引用符で囲む必要がありました。より完全な "magick montage" 仕様については、以下を参照してください。もちろん、Linux シェルも、引用符で囲まれていない「*」と「?」文字をシェルに渡すことができます。ただし、ファイルリストが非常に多数のファイル名に展開されると、「コマンドライン制限」に達する場合があります。次に、Linux シェルを使用してファイル名を展開するその他の例を示します...

  magick image_[0-9].gif  image_[1-9][0-9].gif  animation.gif
  magick image_?.gif  image_??.gif  image_???.gif  animation.gif
  magick image_(?|??|???|????).gif  animation.gif
ファイル名の形式がインクリメントされた数値については、以下の読み込みフレーム、読み込み修飾子も参照してください。ファイル名が単に単一の文字ストリング '-' の場合、IM は標準入力から画像を読み取ります。

  cat tree.gif | magick - -frame 5x5+2+2 read_stdin.gif
[IM Output]
一部の画像ファイル形式では、複数の画像ファイルを 1 つの長いマルチイメージストリームに単純に付加できることに注意してください。これらの形式には、単純なPbmPlus/NetPBM画像形式と、IM 独自の特殊なファイル形式MIFF:が含まれます。

  for image in eye.gif news.gif storm.gif
  do
    magick $image  miff:-
  done |
    magick - -frame 5x5+2+2 +append read_multiple_stdin.gif
[IM Output]
ファイル名の先頭にある特殊文字 '@' は、ファイル名を、指定されたファイルの内容に置き換えることを意味します。つまり、ファイルのリストを含むファイルを読み込むことができます。

  echo "eye.gif news.gif storm.gif" > filelist.txt
  magick @filelist.txt  -frame 5x5+2+2 +append filelist.gif
[IM Output]
特別なファイル名 '-' で '@' を使用して、標準入力からファイル名を読み込むこともできます。

  echo "eye.gif news.gif storm.gif" |\
    magick @- -frame 5x5+2+2 +append filelist_stdin.gif
[IM Output]
'@' 構文を使用してファイルからファイル名のリストを読み取る機能は、IM v6.5.2-1 で追加されました。
セキュリティ上の予防措置として、これは実際の画像ファイルでのみ機能します。 "rose:" や "label:string" などの画像ジェネレーターでは機能しません。また、ファイルからコマンドラインオプションを「インクルード」するために使用することもできません。

読み込み修飾子または抽出設定

画像は、メモリに読み込まれた直後、ただし画像が現在の画像シーケンスに実際に追加される前に変更できます。"-extract" 設定を指定できます。たとえば、ここでバラの画像をトリミングします...

  magick -extract 32x32+20+5 rose: +repage rose_extract.gif
[IM Output]
または、角かっこ '[...]' を使用して、ファイル名の末尾に読み込み修飾子を追加できます。例...

  magick 'rose:[32x32+20+5]' +repage  rose_read_modifier.gif
[IM Output]
ただし、「[]」文字は通常、特殊なシェルメタ文字でもあるため、それらを使用する場合は、UNIX シェルが解釈しないように、追加の修飾子を引用符で囲むことをお勧めします。「-extract」設定と読み込み修飾子は両方とも同じジョブを実行しますが、後者は前者をオーバーライドします。また、修飾子を使用する場合は、UNIX シェルが修飾子によって要求されたファイルを「見つけられない」ため、IM が「*」や「?」などの特殊なファイル拡張メタ文字を処理できるようにする必要があります。実際、その場合に何を行うかは、シェルに依存します。そのため、読み込み修飾子を使用する場合は、ファイル名全体を引用符で囲む必要があります。これらの読み込み修飾子の本当の目的は、不要な画像を削除したり、画像を小さくしたりして、画像をメモリに読み込んでいる間、必要なメモリ量を制限することです。たとえば、大きな JPEG 画像のディレクトリ全体を読み込む場合などです。次に、すべての特別な読み込み修飾子(および「-extract」設定)とその効果のリストを示します。「#」は、ある数値を表します。
'[#]' '[#-#]' '[#,#,#]' [#,#-#,#]'. 読み込みフレーム
読み込まれた画像から、マルチイメージファイル形式から特定のサブフレームを選択します。指定された数値 '#' インデックスは、読み取るフレーム番号を指定します。複数のインデックスを、コンマ順またはインデックス範囲として指定できます。画像インデックスは、最初の画像が 0、2 番目の画像が 1 というようにゼロから始まります。負のインデックスを指定すると、画像シーケンスの末尾から逆順にカウントされ、最後の画像が -1、最後から 2 番目の画像が -2 になります。これは、画像リスト演算子に使用される規則とまったく同じです。例

  magick document.pdf'[0]'     first_page_of_pdf.gif
  magick animation.gif'[1-3]'  second_to_fourth_frames.gif
  magick animation.gif'[-1,2]' last_then_the_third_frame.gif
IM に、数値のリストに基づいて画像を読み込ませることもできます。例

  magick 'image_%03d.png[5-7]' ...
ファイル「image_005.png」、「image_006.png」、および「image_007.png」が読み込まれます。この方法では、負のインデックスを使用できません。
'[#x#]' 読み込みサイズ変更
IM バージョン 6.2.6-2 から、IM ユーザーが非常に大きな画像を処理するのに役立つ新しい修飾子が追加されました。この修飾子は、読み込まれたばかりの画像を、その画像が既にメモリ内にある他の画像に追加される直前にサイズ変更します。
これにより、画像を縮小したり、拡大したりできます。例...

  magick pattern:gray95'[60x60]' enlarged_dots.gif
[IM Output]
警告、読み込み修飾子は現在、'!' (アスペクト比を保持しない) や '>' (より大きな画像のみを縮小) などのサイズ変更フラグを一切使用していません。(リクエストすれば使えるようになるかもしれません。) また、単色のキャンバスのサイズを指定する別の方法としても使用できます。実際に行われていることは、デフォルトの単一ピクセル画像のサイズを変更していることです。例...

      magick 'canvas:DodgerBlue[50x50]'  canvas_size.gif
    
[IM Output]
この修飾子は、非常に大きな画像を多数読み込もうとしている場合に最も重要です。各画像は、次の画像が読み込まれる前にサイズ変更されるため、それらの画像を処理するために必要な総メモリを大幅に節約できます。たとえば、次のようにする代わりに...

  magick montage '*.tiff'  -geometry 100x100+5+5 -frame 4  index.jpg
まず最初にすべてのTIFFファイルを読み込み、その後でリサイズを行います。代わりに、次のように行うことができます...

  magick montage '*.tiff[100x100]'  -geometry 100x100+5+5 -frame 4  index.jpg
これにより、各画像を読み込み、リサイズしてから、次の画像に進みます。これにより、メモリ使用量が大幅に減少し、メモリ制限に達したときのディスクスワップ(スラッシング)を回避できる可能性があります。JPEG画像については、特別な「-define」設定を使用することをお勧めします。たとえば、次のようになります...

  magick montage -define jpeg:size=200x200 '*.jpg[100x100]' -strip \
          -geometry 100x100+5+5 -frame 4  index.png
特別な設定はJPEGライブラリに渡され、読み込みプロセス中のJPEG画像のサイズを制限するために使用されます。ただし、正確ではなく、結果の画像は、アスペクト比を維持したまま、そのサイズと2倍のサイズの間になります。詳細については、JPEG画像の読み込みを参照してください。この組み合わせの結果、JPEG画像の読み込みが大幅に高速化され、メモリ使用量もさらに削減されます。特に、多数の小さなサムネイルを生成する場合に有効です。一般的なサムネイル作成を参照してください。
'[#x#+#+#]' 読み込み時の切り抜き
IM v6.3.1以降では、オフセットを追加すると、上記が読み込み中の画像の切り抜きになります。たとえば、はるかに大きな画像から、より小さな600x400ピクセルのサブセクションを取得する場合。

  magick 'image.png[600x400+1900+2900]' tileimage.png
ただし、これは画像全体をメモリに読み込んでから切り抜き、最終的に現在の画像シーケンスに追加します。本当に大きな画像を処理したい場合は、「stream」コマンドを参照し、画像を「magick」コマンドにパイプしてさらに処理することをお勧めします。以下の巨大な画像処理を参照してください。
画像が「gzip」圧縮されている場合、IMは自動的にそれを一時ファイルに解凍してから、画像形式を判別して画像ファイル形式をデコードしようとします。そのため、gzip圧縮形式で画像を保存できるだけでなく、後のIM処理で直接使用することもできます。大きなテキストベースの画像の場合、これによりディスク容量を大幅に節約できます。
PNG形式には、形式仕様の一部として「gzip」圧縮が含まれています。この場合、2桁のPNG「-quality」設定の最初の桁が圧縮レベルを定義します。詳細については、PNG画像ファイル形式の例を参照してください。
上記は、ImageMagickに画像を読み込むときに使用できる特別な入力オプションの短い概要にすぎません。完全な概要は、コマンドラインの構造ページ(ImageMagick Webサイト)に記載されています。
前に示したように、画像入力は、画像作成用の「-size」や、JPEG読み込み用の「-define jpeg:size=??」などのIM設定によって変更できます。その他のオプションも、「-page」、「-type」、「-dispose」、「-delay」など、画像入力の作成に影響を与えます。画像メタデータの設定/変更を参照してください。
スクリプトでユーザーが提供した引数をIMに渡す場合は、引数が予想どおりであることを確認して、十分に注意してください。たとえば、Web画像処理スクリプトでシステムパスワードファイルの画像が返されるようなことは避けたいでしょう。

入力ファイル名のメタ文字処理

構築中
Not only does the shell handle meta-characters (unless that argument is
quoted) but IM also does its own form of meta-character handling in filenames.

For example
  magick *.jpg ....

is expanded by the shell BEFORE passing the filenames to IM, while

  magick '*.jpg' ....

will have the shell pass "*.jpg" to ImageMagick, which then expands into
an internal list of filenames!  This was provided for Windows Dos support, and
as a method to preventing command line limit overflows in command such as
"magick mogrify" and "magick montage", which typically process long lists of images.

As such to actually get IM to read a file names literially named on disk as
'*.jpg'  you need to use any of the following forms...

  magick '\*.jpg' ....
  magick "\*.jpg" ....
  magick "\\*.jpg" ....
  magick \\\*.jpg ....

NOTE; the second line is NOT recommended as some shells (not bash) and some
APIs (C programs, possibly PHP) may actually remove the single backslash, and
pass '*.jpg' to IM which it will again expand!

On top of '?' and '*',  IM also adds the meta-character handling of  ':', '%'
and '[...]' for read modifier handling.  These however have a different
meaning  (codec specification, scene number inclusion, and read modifiers) to
normal shell syntax of those meta-characters.

For example DOS uses will need to escape a 'drive-letter' in filename paths
being passed to ImageMagick.  For example...

  magick C\:\path\to\image.jpg ....

Another example is when loading an image containg a time code.  For example..

  magick "time_10\:30.jpg" ....

will read the filename "time_10:30.jpg" from disk.  Without the backslash, IM
may think that the image should be read with a non-existant image file format
(or delegate) "time_10:", and fail in an unexpected way.

An alternative is to use a question mark...

  magick "time_10?30.jpg" ...

However that may also match another file such as "time_10_30.jpg" as well!

画像の圧縮

構築中
IM will also read files that have been compressed, and given the appropriate
suffix, or image format specification.

That is, an image saved as "image.gif.gz"  will first be uncomressed, before
being decoded from its GIF image format.

Gzipped XPixmap (xpm) and NetPbm/PbmPlus (ppm) images is also automatically
handled, both by Imagemagick, and the formats normal delegate library.  As
such you can use the compressed forms directly either in IM, or in other
programs that understand these file formats.

See  Saving Compressed Images below.

画像の保存

画像の処理は重要ですが、結果を適切な方法で保存することも同様に重要です。「magick」、「magick montage」、「magick composite」の最後の引数は、画像の最終的な書き込み(デフォルトの画像出力)のためのファイル名と画像形式を定義します。ただし、「-write」(下記参照)を使用すると、画像シーケンスの途中で画像を保存することもできます。保存する画像のファイル形式を指定するには、これらの例のほぼすべてで使用しているようにファイル名の接尾辞を使用するか、ファイル名の前に文字列「{format}:」を付けることができます。例:

  magick tree.gif    GIF:tree_image
[IM Output]
結果の画像を確認すると、ファイル名自体に「.gif」というファイル名の接尾辞がない場合でも、実際にGIF画像ファイルが作成されていることがわかります。形式の大文字と小文字は区別されないため、小文字または大文字のいずれかを使用できます。この画像形式の指定は、コマンドの標準出力(「-」ファイル名を使用)に画像を保存する場合に特に重要になります。この特別なファイル名には接尾辞がないため、ImageMagickに使用する形式を必ず指定する必要があります。指定しない場合、画像は画像の元の形式(既知の場合)にデフォルト設定されます。たとえば、ここで、IMピクセル列挙を「-」を使用して画面に書き込み、結果を標準出力に出力します。

  magick tree.gif  -resize 1x3\!  txt:-
[IM Text]
また、一時ファイルに保存せずに、シェル「パイプライン」を介して「magick identify」などの別のコマンドに画像を渡すためにも使用されます。

  magick tree.gif -resize 200% miff:- | identify -
[IM Text]
この場合、「magick identify」コマンドによって標準入力から画像を読み込むことを示すために、特別な「-」ファイル名も使用されていることがわかります。詳細については、コマンドラインの構造、出力ファイル名の公式ガイドを参照してください。

ファイル名のパーセントエスケープ

保存ファイル名には、いくつかの特別なパーセントエスケープ(%)シーケンスを含めることができます。具体的には、「%d」、「%x」、「%o」です。これらは、Cの「printf()」形式を使用して、画像の「シーン番号」をファイル名に挿入します。詳細については、以下の複数画像シーケンスの書き込みを参照してください。もちろん、これは、ファイル名にパーセント文字を挿入する場合は、それを二重にする(「%%」)必要があることを意味します。IM v6.4.8-4以降では、特別な準備済みの設定(「filename:」で始まる必要があります)を最終的なファイル名に挿入することもできます。たとえば...

  magick rose: -set filename:mysize "%wx%h" 'rose_%[filename:mysize].png'
[IM Output]
これにより、組み込みのバラの画像が、その画像のサイズをピクセル単位で含むファイルに保存されます。具体的には、「rose_70x46.gif」というファイル名になります。これにより、出力ファイル名の一部として、任意の画像プロパティパーセントエスケープを(少し間接的に)使用できるようになります。「%[filename:label]」画像プロパティ(通常の「%d」エスケープとともに)のみを出力ファイル名内で使用できることに注意してください。この制限は、セキュリティ上の理由と、正当な画像ファイル名に「%」と「[]」が含まれる可能性があるためです。警告:ファイル名設定にファイルの接尾辞を含めないでください。IMはそれを認識せず、ファイル名設定に含まれているものではなく、元のファイル形式を使用して画像を保存します。つまり、ファイル名には指定した接尾辞が付きますが、画像形式は異なる場合があります。「filename:」設定は、すべての画像で同じである必要はありません。使用される各画像に対して、異なる設定を生成したり、計算したり、設定したりすることもできます。これは、画像を修正し、各個々の画像の元のファイル名を使用して作成された新しいファイル名に書き込む別の例です。

  magick eye.gif news.gif storm.gif    -scale 200% \
          -set filename:f '%t_magnify.%e' +adjoin '%[filename:f]'
[IM Output] [IM Output] [IM Output]
これにより、「eye.gif」などの各画像が拡大され、現在のディレクトリの「eye_magnify.gif」というファイルに保存されます。ただし、3つすべての画像がメモリに読み込まれ、1つのコマンドによって修正されます。これは、メモリ制限に達してディスクスワップ(スラッシング)が発生する可能性があるため、多数の大きな画像や非常に多数の画像を扱う場合に推奨される解決策ではありません。この場合、「+adjoin」は、IMが最初の画像のファイル名のみを使用して、すべての画像をマルチイメージGIFアニメーションに保存するのを防ぐために不可欠です。また、「%e」エスケープシーケンスを使用して、ファイル名の元の接尾辞を保持するようにしました。通常、ファイル名設定に接尾辞を含めることは、IMが出力ファイル形式を決定するときにエスケープシーケンスから接尾辞を認識しないため、好ましくありません。ただし、この場合は形式が変更されていないため、問題ありません。注意が必要です。画像の正確な元のファイル名を取得するには、「%d/%f」または「%d/%t.%e」を使用します。また、「%e」の代わりに「%m」を使用することもできます。これは、IMが元の画像ファイルで見つけた実際の形式(大文字)です(元の画像のファイル名の接尾辞と一致しない場合があります)。組み込み画像の場合、これらのエスケープシーケンス文字列の多くは空白であることに注意してください。また、ディレクトリがない場合は、「%d」は空白になります。これはIMv7の既知の問題です。「ファイル名エスケープシーケンス」の使用例としては、タイル切り抜き画像があります。この手法では、結果の各画像の計算されたタイル位置に基づいてファイル名を生成するために使用されています。また、Morgifyの代わりにConvertを使用するの例も参照してください。

自動GZip接尾辞

.gz」という接尾辞が指定されている場合、IMは画像を自動的に「gzip」圧縮します。たとえば、ここでは、組み込みの「rose:」画像を「gzip」圧縮された、圧縮されていないGIFファイルとして保存します。GIFの通常のLZW圧縮をオフにします。これにより、「gzip」圧縮が最高の圧縮を実現するのを妨げるためです。

  magick rose: -compress none  rose.gif.gz
[IM Output]
ブラウザがgzip圧縮された画像をどのように処理するかは、Webサーバーによって返されるファイルタイプと、ブラウザが圧縮された画像をどのように処理するかによって異なります。このため、上記の画像を直接表示しませんでした。「アート」アイコンをクリックして、このWebサーバーからのそのような画像をブラウザがどのように処理するかを確認してください。これを通常の保存されたLZW圧縮GIF画像のサイズと比較してください...

  magick rose: rose.gif
[IM Output]
gzip」圧縮されたバラのサイズは[IM Text]バイトで、通常のLZW圧縮されたバラのサイズは[IM Text]バイトです。ご覧のとおり、GZIP圧縮は実際にはGIF形式で使用されているLZW圧縮よりもわずかに優れており、アーカイブ目的にはより適している可能性があります。GZipped画像ファイルは、デフォルトで圧縮が行われない画像ファイル形式の長期保存によく使用されます。これには、IMファイル形式「MIFF:」と、より単純なNetPBM画像ファイル形式が含まれます。

保存された属性

構築中
Other Settings specific to image writing....
    -depth  -quality  -compress -type  -loop
    -set label   -set comment
Also see Image Depth,
Image Type,
JPEG Quality,
PNG Quality.
GIF loop.

Talk about file compressions, which are part of various image formats.

Different compressions are used for different image formats.

Especially the JPEG to TIFF compression change needed.

Using or "-compress
None" and "-compress" NetPBM text/binary format selection.

The GIF compression and the copyright patent.

Other than using IM to reduce -quality or changing the format to something
else the -compression option is rarely used.  Often it is only used internally
by IM to save images using the same compression the image was read with.

暗号化された画像

IMでは、「-encipher」および「-decipher」オプションを使用して、機密画像をパスフレーズで暗号化して保存することもできます。画像の暗号化 を参照してください。

複数の画像の書き込み - 隣接手法

画像の保存に関する大きな問題は、ImageMagickが一度に1つの画像だけでなく、順序付けられた画像シーケンス(リスト)を扱うことです。このため、IMは現在の画像シーケンス内のすべての画像を指定されたファイル名に書き込もうとします。ファイル形式で複数の画像が許可されている場合、IMはデフォルトで、現在の画像シーケンス内のすべての画像をその画像ファイルに保存します。たとえば、GIFアニメーションの基本の例ページを見ると、複数の画像フレームを1つの画像ファイル形式に保存してアニメーションを生成することがわかります。出力形式で1つのファイルに複数の画像を保存できない場合、IMは代わりに複数のファイルを生成します。たとえば、JPEGPNGなどの画像形式に保存する場合などです。「+adjoin」出力ファイル処理設定を使用すると、GIFPSなど、ファイルごとに複数の画像を許可する画像形式でもこの動作を強制できます。

  magick eye.gif news.gif storm.gif  +adjoin  image.gif
[IM Output] [IM Output] [IM Output]
上記で生成された3つの画像のファイル名をよく見ると、IMが「image-0.gif」から「image-2.gif」という名前の画像を生成していることがわかります。
ImageMagickバージョン6.2.0以前では、上記の出力ファイル名は「image.gif.0」から「image.gif.2」になっていました。これはファイル名サフィックスが失われるため多くの問題を引き起こしたので、ファイル名サフィックスの前に画像番号を追加するように変更されました。
別の方法として、出力ファイル名に「C言語のprintf()」構文「%d」を追加する方法があります。この特別な文字列は、シーケンス内の各画像の現在の画像番号に置き換えられます。

  magick eye.gif news.gif storm.gif  +adjoin  image_%d.gif
[IM Output] [IM Output] [IM Output]
ここでは、IMのデフォルトであるダッシュではなく、アンダースコアを使用して、「image_0.gif」から「image_2.gif」という名前の画像を生成しました。
10進数には「%d」を使用できるだけでなく、16進数(小文字)には「%x」、16進数(大文字)には「%X」、8進数には「%o」を使用できます。

これらの文字のいずれかが続くパーセント文字が必要な場合は、パーセント文字の意味をエスケープするためにパーセント文字を二重にする必要があります。つまり、パーセント記号を実際に生成するには、「%%」を使用する必要があります。

出力ファイル名の「%d」は、実際にはImageMagickの「+adjoin」設定を自動的に有効にします。
ただし、上記では実際には「+adjoin」は必要ありませんが、個別の画像を生成していることを明確にするためにも、提供しておくのが良いでしょう。
これは少数の画像にはうまく機能しますが、10枚以上の画像がある場合は、1桁と2桁の数字を持つ画像が混在することになります。さらに100枚以上になると、3桁の数字も表示されます。そうなると、「image_15.gif」が「image_5.gif」よりもアルファベット順で前に表示されるため、ディレクトリリストに保存された画像が順番に表示されなくなります。もちろん、これを修正する方法はあります。たとえば、次のようなコマンドラインシェルの式を使用します。

  magick image_[0-9].gif  image_[1-9][0-9].gif  animation.gif
  magick image_?.gif  image_??.gif  image_???.gif  animation.gif
  magick image_(?|??|???|????).gif  animation.gif
  magick 'image_%d.gif[0-123]'  animation.gif
最後の方法は、ファイルのシーケンスを処理する適切なIMの方法ですが、使用したい数値の範囲を知っている必要があります。「%d」は、ファイル名に合わせて各数値をフォーマットします(次を参照)。いずれにしても、これは面倒で間違いやすく、ファイルが欠落している場合はエラーが発生する可能性があり、使用しているコンピュータシステムの種類によって異なる場合があります。この問題を完全に回避する方が良いでしょう。C言語に詳しい人(UNIXシステムの「printf」のマニュアルページを参照)なら、「%03d」のようなものを使うと、画像シーケンスフレーム番号に常に3桁の数字(先頭にゼロ付き)が得られることをご存知でしょう。その場合、画像名は「images_000.gif」、「images_001.gif」などのようになります。

  magick eye.gif news.gif storm.gif  +adjoin  image_%03d.gif
[IM Output] [IM Output] [IM Output]
この方法を使用すると、画像に番号が付けられるだけでなく、アルファベット順に正しくリストされ、画像ファイルの処理が非常に簡単になります。そのため、複数の画像を個別の画像ファイルとして書き出す予定がある場合は、出力ファイル名に「%03d」または適切なものを追加することをお勧めします。

書き込まれたシーン番号

画像シーケンスを「0」ではなく「1」から開始したい場合、結果の画像ファイルの名前をすべて変更したくない場合は、書き込まれるシーケンスの先頭に「ジャンク」画像を付加するのが最も簡単な解決策です。

  magick null:  eye.gif news.gif storm.gif  +adjoin  image_%01d_of_3.gif
  rm image_0_of_3.gif
[IM Output] [IM Output] [IM Output]
もちろん、「+insert」を使用して、画像処理の後にこれを行うこともできます。これは特に良い解決策ではありませんが、機能し、シンプルで、IMの古いメジャーバージョンと下位互換性があります。IMバージョン6.2以降では、「-scene」設定を使用して、現在の画像シーケンスの開始番号を設定できます。

  magick eye.gif news.gif storm.gif  +adjoin -scene 101 image_%03d.gif
[IM Output] [IM Output] [IM Output]
これにより、「image_101.gif」から「image_103.gif」という名前の画像ファイルが生成されました。

画像を複数回書き込む

画像の書き込みについてですが、特別な「-write」画像演算子を使用して、画像操作のシーケンスの途中から画像を書き込むことができます。これは、画像処理中のさまざまなポイントで画像を複数回出力したい場合に非常に便利です。たとえば、「デバッグ付きの複雑な画像処理」を参照してください。ここに、コダックロスレスフルカラーイメージスイート(画像23)からのいくつかのオウムの写真がありますが、1つのコマンドでさまざまなサイズで保存したいと考えています。

  magick parrots_orig.png \
          \( +clone -resize x128  -write  parrots_lrg.jpg +delete \) \
          \( +clone -resize x96   -write  parrots_big.jpg +delete \) \
          \( +clone -resize x64   -write  parrots_med.jpg +delete \) \
                    -resize x32           parrots_sml.jpg
[IM Output] [IM Output] [IM Output] [IM Output]
ご覧のとおり、画像リスト演算子を使用して、画像の「クローン」を処理し、結果を書き出し、削除して元のソース画像に戻り、必要な回数だけプロセスを繰り返すことができます。この特定の場合、同じ画像のサイズを何度も変更し、サイズ変更エラーが蓄積されることを避けることができました。また、問題なく、最初に小さい画像を生成し、次に大きい画像を生成することも、生成された各画像ファイルに対して画像をさまざまな方法で変更することもできました。つまり、各画像の順序と変更は無関係です!「+clone」は実際には画像データを複製しないことに注意してください!IMは、更新されたときにのみ画像ピクセルをコピーする参照カウントされたクローンプロセスを使用します。そのため、上記のプロセスでは、元の画像と生成された新しい画像を保持するのに十分なメモリだけが実際に使用されます。また、「+clone」は非常に高速で、メモリ効率も優れています。
ここに、同じことを行う別の手法がありますが、「MPR:」(下記参照)を使用して、元の画像を名前付きの画像レジスタに保存し、「-clone」の代わりに保存します。

  magick scroll.gif  -background lightsteelblue -flatten  -alpha off \
          -write mpr:scroll  -resize x128  -write scroll_lrg.jpg +delete \
                 mpr:scroll  -resize x96   -write scroll_big.jpg +delete \
                 mpr:scroll  -resize x64   -write scroll_med.jpg +delete \
                 mpr:scroll  -resize x32          scroll_sml.jpg
[IM Output] [IM Output] [IM Output] [IM Output]
ここでは、書き込み後にメモリに残っている画像を修正する前に、元の画像のコピーを「mpr:scroll」画像レジスタに保存します。MPRレジスタは、実際には画像シーケンス全体を保持できることに注意してください。その操作の結果が書き込まれてメモリから削除されると、元の画像(または画像シーケンス)が復元され、プロセスが必要な回数だけ繰り返されます。もちろん、以前と同様に、最後の画像に「-write」を使用する必要はありません。通常の通り出力するだけです。「-write」を使用した場合、代わりに別の特別なファイル形式「NULL:」(下記参照)を使用して最後の画像を破棄できます。-write」に関する注意:一部のファイル形式では、書き込みのために画像が特別な形式である必要があるため、「-write」演算子は画像を修正する可能性があります。たとえば、GIF画像は色の数が減る可能性があります(「量子化とディザリング」を参照)。ただし、他の形式では、ソース画像はそのまま残ります(下記のMIFFおよびMPCを参照)。これらの変更から身を守る必要がある場合(後で画像を削除するだけではない場合)は、「+write」を使用できます。これにより、書き込み用の画像の内部クローンが作成され、その後削除されます。ただし、これにより、画像の書き込み用に修正されたコピーを保持するためにメモリ使用量が2倍になる可能性があることに注意してください。少なくとも一時的には。

特別なファイル形式(IM固有)

上記で見たように(次のセクション「一般的な画像ファイル形式」で詳しく説明しますが)、ImageMagickは非常に多くの有名な画像ファイル形式を理解しています。また、(「キャンバス作成」で例示したように)多くの特別な画像ジェネレーターも含まれています。さらに、これらの上に、画像の非常に特殊な処理を可能にするいくつかの非常に特別なファイル形式もあります。
miff:
は、ImageMagickファイル形式です。画像シーケンス全体と、画像に関連付けられたすべての属性がこのファイル形式で保存されます。もちろん、ImageMagickコマンドのみがこの形式を読み取るため、異なる画像処理パッケージ間で転送するのには適していません。「miff:」ファイル形式の主な目的は、長くて複雑な方法で画像を処理する際の、中間保存形式としての使用です。また、画像に関連付けられた画像メタデータやその他の属性を渡しながら、あるIMコマンドから別のIMコマンドに画像を「パイプライン処理」するのにも適しています。「miff:」を書き込むときは、「+depth」オプションを含めることをお勧めします。これにより、中間画像保存に可能な限り最高の品質を使用するように、画像の「入力深度」がIMメモリ品質にリセットされます。もちろん、「-depth 8」を使用して保存画像の深度を「クリップ」してディスク上の画像サイズを縮小することもできますが、HDRI浮動小数点保存も有効にしない限り、量子化丸め効果も強制されます。この形式の解析に関心がある場合は、すべての画像属性のプレーンテキストヘッダーから始まります。ヘッダーは、単一の改ページ文字を含む行で終わります。このヘッダー自体が、さまざまな画像処理スクリプトで基本的な画像情報を抽出するための便利な方法です。たとえば、次に、GNU-sedコマンドを使用して、改ページ区切り文字までの「miff:」ヘッダーをリストし、組み込みの「rose:」画像のすべての属性を表示します。


magick rose: miff:- | sed -n '/^\f$/q; p'
[IM Text]
これは、IMが画像について認識している現在のすべての設定フラグとメタデータを明らかにするため、非常に役立ちます。ただし、統計情報も存在します。これらは、「magick identify」コマンド、「-identify」演算子、または特別な「info:」形式のいずれかによって生成されます。要求された場合は「-verbose」オプションが適用されます(次を参照)。画像ファイル形式の解析要件は非常に低く、圧縮されていませんが、IMが認識しているあらゆるタイプの画像を処理できます。一時的な画像や、使用できるパイプライン化された画像コマンドに最適な形式です。ただし、ImageMagickプログラムのみが読み取ることができます。下記の「MPR」画像メモリレジスタと「MPC」メモリディスクマッピング形式も参照してください。
生の画像データ(バイナリ)は、実際には4文字のシーケンス「\n\f\n:」(改行された単独の改ページとコロン)がプレフィックスとして付いています。このデータの読み込み方はヘッダーデータにエンコードされていますが、通常はRGBタプルでのバイナリ整数で構成されます。ただし、より多くのチャネルを持つことも、浮動小数点や倍精度データ値で構成されることもあります。

多くの点で、バイナリのPbmPlus画像ファイル形式と実質的に同じですが、画像メタデータを保持するためのヘッダーが大幅に拡張されており、チャネル数とデータ型に多くのバリエーションがあります。
MIFF画像ストリーミング
miff:」形式は「ストリーミング」画像ファイル形式です。つまり、複数の画像を次々と追加または連結するだけで処理します。これにより、パイプラインなどの同じ宛先に画像を書き込むだけで、複数の画像の「ストリーム」を生成できます。個々の画像が異なるコマンドで生成された場合でも同様です。たとえば、各コマンドが単に「ストリーミング」MIFF画像を出力する画像処理コマンドのループを持つことができます。ループの後、画像の「ストリーム」を単一のコマンドにパイプして、モンタージュ、コラージュ、アニメーション、またはその他のものを生成できます。たとえば、以下は文字「b」で始まる色のリストを生成し、次に「magick」コマンドのループを使用して、ラベル付きの色パッチを一度に1色ずつ生成します。これらは「magick montage」に「パイプ」され、単純なカラーテーブルを生成します。

  magick -list color | egrep '^b' | \
    while read color junk; do \
       magick -label $color -size 70x20 xc:$color +depth miff:-; \
    done |\
      magick montage - -frame 5 -tile 6x -geometry +2+2 \
              -background none color_table.png
[IM Text]
上記の特定の例は、スクリプト「show_colors」にプログラムされており、画像処理で使用する色を検索、見つけ、表示するために使用できます。上記は、マルチイメージシーケンスを生成するのに非常に役立つ「ストリーミング画像のパイプライン」の例です。この手法の他の例としては、レイヤー画像のプログラムによる配置マップ内のピン名前による色の「名前付きカラー画像」、およびランダムな波紋に示されているようなアニメーションなどがあります。この手法は、「-write miff:-」のような操作でも使用でき、単一のコマンドの複数の場所からmiff形式の画像を出力できます。各画像は、最終出力ストリームに自動的に追加されます。これは、複雑な画像処理コマンドをデバッグするのに特に役立ちます。代替方法(PHPスクリプトで一般的に使用される)は、「生成されたコマンド」の手法を使用することです。これは、長い「magick」コマンドを生成して実行するシェルスクリプトを使用します。画像ワーピングアニメーションのスクリプトでは、この手法を使用しています。
info:
info:」ファイル形式(IM v6.2.4で追加)は、実際には画像を出力しません!この形式は基本的に、ImageMagickの「magick identify」コマンドが出力するのと同じ情報を出力します。「magick identify」と同様に、この出力形式は「-format」および「-verbose」オプションによって制御され、画像プロパティエスケープページで定義されている、関心のある特定の情報のみを出力できます。たとえば、上記のようにMIFF画像を「magick identify」にパイプする代わりに(画像の保存を参照)、次のものを使用して、結果の画像形式の1行の識別を取得できた可能性があります。

  magick granite:  info:-
[IM Text]
もちろん、「-format」設定を使用して、目的の情報を特定の、より解析可能な方法で出力できます。「info:」の非常に便利な点は、画像に関する追加情報を同時に抽出しながら、画像を生成できるようになったことです。これは、「-write」演算子を使用して、この特別な画像形式をファイル(またはコマンドの通常の標準出力)に保存することで行われます。

  magick rose: -shave 12x0 -repage 64x64+9+9 \
          -format '%wx%h %g'  -write info:info_paged.txt    paged.gif
[IM Output]
[IM Text]
-identify」演算子もあり、これは「-write info:」を使用して画像識別情報を標準出力に出力するのと同等です。これにより、IMコマンドをデバッグする際に画像に何が起こっているかをさらに簡単に監視できます。たとえば...

  magick logo:           -identify \
          -trim           -identify \
          +repage         -identify \
          -resize 80x80\! -identify \
          logo_thumbnail.gif
[IM Output]
[IM Text]
ここでは、「-trim」が画像のサイズを縮小しましたが、画像のどの部分がトリミングされたかの「トリミング」情報を保持し、次に「+repage」がその余分な「キャンバス」または「ページ」情報を削除した様子を確認できます。など。「magick identify」コマンドと同様に、「info:」と「-identify」の両方とも、「-verbose」設定がオンになっていると、はるかに詳細な出力になります。ここでは、長い出力を最初の数行に制限して、少しだけ理解できるようにします。

  magick rose: -verbose  info:  | head
[IM Text]
-verbose」設定を使用すると、読み込まれたり出力されたりする画像に関する追加情報が標準エラーに出力されます(「info:」形式を除く)。また、「-colors」のような一部の演算子も追加情報を出力します。そのため、「-identify」または「info:」形式で使用した後で、オフに戻した方がよい場合があります。

たとえば   
-verbose -write info:image_info.txt +verbose   または   -verbose -identify +verbose
任意の形式の「identify」からの出力のスクリプトによる読み取りは、大文字と小文字を区別しない方法で行う必要があります。これにより、ImageMagickの異なるバージョン間の下位互換性が向上します。
注意: 「info:」(および「-identify」)は出力形式のみであり、「identify」コマンドと同じ出力を生成します。「info:」ファイル形式を使用して、画像を読み込んだり作成したりすることはできません。「-print」を使用して情報を出力することもできますが、これは画像シーケンス全体に対して1回のみ適用されます。つまり、この演算子を使用して、複数の画像を含むより複雑な「%[fx:...]」式を計算できます。ただし、上記の他の方法とは異なり、すべての画像に対して1回のみ適用されることに注意してください。
null:
出力形式として、これは画像の結果を「破棄」するだけです。そのため、「magick」、「magick montage」、または「magick composite」コマンドの最後の引数として使用した場合、最終結果は保存されません!理由は?まあ、特にデバッグするときに、全体的な結果よりも、画像処理中に生成された特定の画像に関心がある可能性があるためです。たとえば、ここでは、画像シーケンスから1つの画像を抽出して保存し、「null:」を使用して他のすべての画像を破棄します。

  magick eye.gif news.gif storm.gif tree.gif rose: logo: \
            \( -clone 2 -write write_storm.gif \)   null:
[IM Output]
これは、他のすべての画像を1つずつ削除しようとするよりもはるかに簡単です。ただし、入力画像形式として、「null:」は、現在の画像シーケンスに特別な「nullソース」フラグを持つ、単一の透明なピクセルの特別なプレースホルダー画像を生成します。この特別な画像は、モンタージュにギャップを残すため、および複数画像のレイヤー合成のリストセパレーターとして特に重要です。これは、「-crop」などの操作で生成できる、「見逃された画像」として知られる別の特別な画像形式と密接に関連しています。この画像形式は、操作で空または無意味な結果が生成された場合に生成されます。両方の画像は単一の透明なピクセルであり、そのため「null:」画像も「見逃された画像」であるかのように扱われます。現時点では、現在の画像シーケンスから「null:」や「見逃された画像」を削除する方法はありません。ただし、そのような方法が提案されています。そのような方法が必要だと感じたら、私にメールしてください。
txt:
これは、基本的に画像内の各ピクセルを1行ずつリストする単純なASCIIテキストファイルです。これは、一般的なテキストから画像へのコンバーターではありません。それについては、複数行テキストファイルの例を参照してください。「ピクセル列挙」が認識されない場合、画像は「text:」形式のコーダーに渡され、プレーンテキストファイルとしてレンダリングされます。たとえば、ここに「netscape:」画像を2x2ピクセルの画像にスケーリングし、「txt:」画像形式を使用してリストします。

  magick netscape: -scale 2x2\! txt_netscape.txt
[IM Text]
画像の最初の行(ヘッダー)には、画像に関する基本情報がパックされています。情報は次のもので構成されます... ファイルマジック: イメージヘッダーは、このファイルを特別なIMテキスト画像形式(例:「ImageMagickピクセル列挙」ファイル)として定義します。これは、コンピューティングの世界では、ファイルの「マジック」、またはこのファイルをこの特定のファイル形式として識別するコード文字列として知られています。画像サイズ: 次の2つの数値は、このファイルに含まれる画像のサイズを定義します。これらの数値を掛け合わせると、画像を完全に定義するためにヘッダーの後に続く必要がある行数もわかります。IMは常にこれだけの行数を出力しますが、後で読み取りを行うときに、すべてのピクセルを定義する必要はないことがわかります。MaxValue: ヘッダーの最後の数値は、可能な画像データの「最大値」を定義します。上記の例では、「255」であり、これは8ビット深度を使用した結果です。組み込みの「netscape:」画像をこの深度で出力したのは、8ビット値を使用して内部的に定義されていたため、IMが画像のこの深度レベルを保持したためです。詳細については、深度設定のセクションを参照してください。ただし、画像の「-depth」を変更することで、IMのQまたはコンパイル時の品質設定の上限まで、深度設定を上書きできます。たとえば、ここでは、色の値を16ビット値(0〜65535)として出力します...

  magick netscape: -scale 2x2\! -depth 16 txt_netscape_16.txt
[IM Text]
現時点では、出力ファイル形式で使用する特定の「最大値」を設定することはできません。現在の「-depth」設定の観点から異なる値を定義することしかできず、最大値は2^depth-1に等しくなります。
カラースペース: ヘッダーの最後の項目は、後に続くデータのカラースペースを定義します。画像に透明度が含まれている場合、カラースペース名に最後の文字「a」(アルファ用)も追加され、括弧で囲まれた数値の追加の列が追加されます。グレースケール画像は「grey」として画像を出力しますが、少なくとも3つの数値を定義します。これは各ピクセルで同じ値になります。たとえば、ここにカラースペースが「LAB」で、アルファチャネルが追加された同じ画像があります!

  magick netscape: -scale 2x2\! -colorspace LAB -alpha set txt_cspace_lab.txt
[IM Text]
初期ヘッダーの後には、画像のピクセルごとに1つずつ、ピクセルデータ行があります。座標: コロン「:」までの最初の2つの数値は、0から始まるピクセル位置です。色値: この後、ピクセルの色値(ヘッダーに指定されたMaxValueの0から)が括弧で囲まれて与えられ、画像の現在のカラースペースに応じて3から5個の数値が与えられます。スペースはオプションであるため、括弧内の数値を解析する際には注意が必要です。
値は通常整数です。ただし、IM v6.9.2-1以降、「-define txt:compliance=css」が「-depth 16」で指定されている場合、値は「%」記号付きのパーセント値として表現されます。これは、SVG、CSS準拠の一部です。
色のコメント: 括弧内の数字に続くものはすべてコメントとみなされます。IMは、色の引数として解析できる形式を使用して、ピクセル色の追加情報を埋め込みます(これらの色の指定の詳細については、「-fill」マニュアルエントリを参照してください)。ただし、色のコメントは可変です。通常はハッシュ('#')16進カラー値で始まり、その後にRGB()値、または指定されたピクセルデータに応じて色名が出力される場合があります。これらの色名はImageMagickで理解される必要がありますが、あくまでもコメントとして参照されるものです。提供される色は、特に初期のIM v6バージョン以前では、使用しているIMバージョンに大きく依存します。このコメント領域が将来再び変更されないという保証はないため、依存しないのが最善です。IMは、ピクセル列挙イメージを読み込む場合は依存しません。以下は、シェルスクリプトでピクセル列挙を正しく読み込む例です。TXTイメージの正確な形式はconvertコマンドによって定義され、次に'tail'を使用してヘッダーを削除し、'tr'を使用して数字以外のすべての文字を単一のスペースに置き換えます。これにより、後で'while'が数値を簡単に読み取り、残っている可能性のある後続のコメント番号を削除できます。

  magick rose: -resize 3x2\! -depth 8 -colorspace RGB -alpha off txt:- |
    tail -n +2 | tr -cs '0-9.\n'  ' ' |
      while read x y r g b junk; do
        echo "$x,$y = rgb($r,$g,$b)"
      done
[IM Text]

TXTイメージの読み込みも有効です。イメージ内のすべてのピクセルを定義する必要はありません。実際、ピクセルを正しい順序で配置する必要さえありません!ImageMagickは、各ピクセル定義行を順番に読み取り、空白のイメージキャンバスに「描画」します。このためには、各行の括弧内の数字のみが使用され、色名は使用されません。初期の空白キャンバスは、クリアされて現在の背景色に設定されます。したがって、「txt:」イメージによって提供されないピクセルは、この色で残ります。「txt:」イメージの興味深い使用法については、フォワードピクセルマッピングを参照してください。ここでは、列挙されたピクセルイメージを出力し、各ピクセル位置を変更して(歪ませて)イメージを回転させてから、列挙されたピクセルイメージを再びIMに読み込んでいます。結果のイメージでは、一部のピクセル位置が定義されておらず、他の位置には複数のピクセルが追加されていました。IMはこれを問題なく処理しました。
txt:」形式は、「-unique-colors」演算子で特に役立ちます。この演算子は、現在のイメージシーケンス内の各イメージを、見つかった一意の色ごとに1つのピクセルを含む新しいイメージに置き換えます。これを「txt:」形式のファイルに出力すると、イメージに含まれる色の基本的な概要が得られます(ただし、カウントやヒストグラムは得られません)。たとえば、以下はツリーイメージで使用されている色です。GIFは8ビットの数値しか使用できないため、色は同じ深度でも出力されます。

  magick tree.gif -unique-colors txt:-
[IM Output]
[IM Text]
さまざまなNetPBMイメージファイル形式を使用するIMの「txt:」形式を使用する別の方法もあります。IMはデフォルトでこの形式をバイナリとして出力しますが、「-compress」をオフにしてNetPBM形式のASCIIテキストバージョンを出力できます。例:

    magick tree.gif -unique-colors -compress None -depth 8 tree_netpbm.ppm
[IM Text]
上記の数値がIMの列挙されたピクセル(「txt:」)形式の数値と一致していることに気づくでしょう。IMが読み取るNetPBM形式のイメージを生成する例については、サイズ変更されたグラデーションを参照してください。特定のピクセルの色だけが必要な場合は、イメージを1ピクセルにトリミングして、「txt:」イメージとして出力できます。

  magick rose: -crop 1x1+12+26 txt:
[IM Text]
または、特別なFXエスケープ形式を使用して、IMで直接使用できる形式で色を出力することもできます。

  magick rose: -format '%[pixel:u.p{12,26}]' info:
[IM Text]
イメージカラーの抽出も参照してください。
sparse-color:
これは、透明ではない各ピクセルの座標と色をコンマ区切りで返す特別な出力イメージ形式です。出力文字列は、スパースカラー演算子に直接入力するのに適しています。たとえば、これは「rose:」イメージで純粋な赤色に「最も近い」少数のピクセルを見つけます。

  magick rose: -alpha set -fuzz 13% +transparent red sparse-color:
[IM Text]
多くの場合、これは上記で示した「txt:」形式よりも便利ですが、関与するピクセルが少数の場合に限ります。ただし、執筆時点では、出力はすべて1行であることに注意してください。シェルスクリプトは、出力内のスペースを改行に変換する必要がある場合があります。
histogram:
これは実際には「miff:」イメージ形式ですが、イメージ内のすべての色の完全なカウントを含む非常に大きなイメージコメントが含まれています。つまり、「miff:」テキストヘッダーの「Comment={...}」属性です。たとえば、ここでは「tree」イメージに存在する色を再度リストしますが、今回は各色のピクセル数を含みます。テキストヒストグラムコメントは、二次的な「info:」形式のマジック識別を使用して、「histogram:」イメージから抽出されます。

  magick tree.gif  -define histogram:unique-colors=true \
           -format %c histogram:info:-
[IM Output]
[IM Text]
info:」出力形式は、IM v6.2.4で追加されました。これより前のIMバージョンでは、以下を使用します。

  magick tree.gif histogram:- | identify -format %c -
形式は、前のTXTまたはIMピクセル列挙イメージ形式とほぼ同じであることに注意してください。色の値に関するコメントを含めてください。唯一の違いは、X、Yの位置がピクセル数に置き換えられていることです。
このコメントの作成には非常に時間がかかる場合があります。IM v6.6.1-5以降では、特別な設定「-define histogram:unique-colors=false」を追加できます。これにより、不要な場合はこのコメントの生成をオフにします。
イメージ自体は、サイズが256x200ピクセルのヒストグラムグラフです。x軸は色値(0〜255)であり、y軸はピクセル数(ピクセル数に正規化)です。各チャネルのヒストグラムは、それが表す色で表示され、一緒に追加されます。したがって、赤と青は重なり合ってマゼンタになります。つまり、カラーチャネルにはそれぞれ独自のヒストグラムがあります。
イメージを他の形式に変換する場合は、その形式で保存するだけです。「histogram:」は、特殊なイメージ処理形式です。イメージをマジックし、ファイル名のサフィックスまたはさらに「format:」コードで指定された形式で出力します。

  magick rose: \
          -define histogram:unique-colors=false \
          histogram:histogram.gif
[IM Output]
非常に暗いイメージは左に大きく重み付けられ、明るいイメージは右に大きく重み付けられます。同様に、中間トーンは中央に表示されます。これをよりよく見るために、ここでは各カラーチャネルのヒストグラムを分離します。また、ヒストグラムのテキストコメント(まだ存在する場合)を削除し、表示用にイメージのサイズを変更します。

  magick histogram.gif -strip -resize 50% -separate  histogram-%d.gif
[IM Output]
[IM Output]
[IM Output]
上記の「rose:」イメージの場合、赤はイメージで重要な重要性を示すため、より広く広がっていることがわかります。一方、緑と青は左側にスパイクがあり、イメージへの影響が非常に少ないことを示しています。
イメージの色ではなく明るさに興味がある場合は、イメージをグレースケールにマジックしてから、「histogram:」イメージを生成してください。

  magick rose: -colorspace Gray \
          -define histogram:unique-colors=false \
          histogram:histogram_gray.gif
[IM Output]
グレースケールイメージのヒストグラムは少し異なることがわかります。優勢な赤色が中間トーンのグレー色に近くなり、ヒストグラムの中央にスパイクが生成されます。また、イメージ内のオフホワイトの小さな領域は、グラフの右端に明確なスパイクを生成します。左端の完全に空のスペースも、イメージに暗いパッチがまったくないことを示しています。
一方、より優れた「グローバル」ヒストグラムは、元のイメージのすべてのカラーチャネルを分離して追加するだけで生成できます。結果のヒストグラムは、その値がどのチャネルからのものであるかに関係なく、すべてのカラー値を表したものです。

  magick rose: -separate -append \
          -define histogram:unique-colors=false \
          histogram:histogram_values.gif
[IM Output]
残念ながら、「histogram:」は出力形式であるため、イメージを別のコマンドに「パイプ」するか、ディスクに保存するか、または特別な「mpr:」保存/読み取りを使用する必要があります。イメージをさらに処理する場合は、「mpr:」の例を参照してください。ヒストグラム(およびその他のグラフ)を、特別な出力形式ではなく演算子として生成できる方法が利用可能になると便利です。
mpr:{label}
(メモリプログラムレジスタ)は、イメージシーケンス全体を名前付きメモリレジスタに保存します。後でそこからイメージデータを読み取ることができます。したがって、複雑なイメージ操作で後で使用するためにイメージを保存したい場合は、そうすることができます。処理の最後に「mpr:」に書き込んでも、プログラムの終了時にプログラムメモリがシステムに返されるため、役に立ちません。したがって、別のプロセスで必要な場合は、処理ステップの途中で書き込み操作を使用してイメージをファイルに保存する必要があります。「mpr:」に与えられた「label」は、好きなものにすることができます。これは、メモリ内のイメージが保存された場所のラベルにすぎません。スクリプト作成者で名前を扱いたくない人のために、単なる単純な数字にすることもできます。ただし、名前を使用すると、スクリプトがわかりやすくなる可能性があります。イメージを保存したら(下記参照)、同じ「ラベル付き」メモリ位置から何度でもイメージを読み込むことができます。例...

  magick tree.gif -write mpr:tree  +delete \
          \
          mpr:tree  mpr:tree  mpr:tree   +append  mpr.gif
[IM Output]
上記のイメージ処理での「+delete」の使用に注意してください。上記では必要ありません(「mpr:tree」を3回ではなく2回読み取るだけです)が、イメージを「mpr:」レジスタに保存した後、現在のイメージシーケンスからすべてのイメージを削除するのが非常に一般的です。基本的に、上記の2行は、2つの完全に異なる「magick」コマンドと考えることができますが、中間イメージにはディスクスペースではなく名前付きメモリレジスタを使用します。多くの場合、「mpr:」の使用は、クローンまたは複製(上記の例で使用できた)を使用するようなものですが、「mpr:」を使用すると、すべてのイメージを完全に削除して、他の作業のために現在のイメージリストをクリアできます。この方法の最大の利点は、イメージ入力でのみ機能する設定と操作を使用できることです。たとえば、入力イメージ「tile:」演算子でイメージをより広い領域にタイル表示する場合に使用します。

  magick tree.gif -flip   -write mpr:tree  +delete \
          -size 64x64 tile:mpr:tree   mpr_tile.gif
[IM Output]
また、「mpr:」を使用して、特殊な出力イメージ形式フィルターの一部の出力を取得して、さらに処理することもできます。たとえば、ここでは「histogram:」からの出力イメージを保存し、同じコマンドで再び読み込んで処理を続けます。

  magick rose: -define histogram:unique-colors=false \
          -write histogram:mpr:hgram  +delete \
          mpr:hgram  -strip  -resize 50%  histogram_resized.gif
[IM Output]
インメモリセーブの "mpr:" は、実際には "histogram:" のような出力ファイル形式や、"tile:" のような入力ファイル形式などの特別な I/O フィルターを通じて、すでにメモリ内にある画像を再利用できる唯一の方法です。同様に、"-tile" や、別の画像をソースとして使用する "Color Mapping" 画像など、実際の入力画像を受け取る特別なオプションにも当てはまります。「複数画像のカラーマップ」を参照してください。これらのオプションは IMv7 では、ファイルから画像を読み込む必要のないバージョンに置き換えられていることに注意してください。また、-draw 'image' メソッドを使用して、生成されたインメモリ画像をオーバーレイする場合の唯一の方法でもありますが、これを行うための他の手法もたくさんあります。"mpr:" イメージは、実際には 1 枚の画像だけでなく、画像シーケンス全体を保存します。これは、後で再ロードしてさらに処理できるように、現在の画像シーケンスのスナップショットを撮るようなものです。これにより、実際に関与している画像の数を知らなくても、アニメーションシーケンス全体のコピーを複製またはクローン作成することができます。これを行う例については、「レイヤー合成」を参照してください。"mpr:" に複数の画像がある場合でも、そのシーケンスから個々の画像を抽出することができます。"-write mpr:image" を使用して保存されたマルチイメージシーケンスから 3 番目の画像を取得するには、"mpr:image'[2]'" を使用します。たとえば、ここで 4 つの画像セットから 'storm' 画像を抽出します。

  magick eye.gif news.gif storm.gif tree.gif \
          -write mpr:images  -delete 0--1 \
          \
          mpr:images'[2]'   mpr_extract.gif
[IM Output]
画像クローン作成オペレーターは、通常、不明な可変数の画像を処理できず、実際、クローンオペレーターが追加される前は、"mpr:" は、中間ディスクファイルを使用せずに、インメモリ画像を複製する唯一の方法でした。
IM v6.8.2 以降では、リモートの IM キャッシュデーモンプロセスに画像を保存することもできます。これにより、ディスク容量を必要とせずに、別々に実行されている IM コマンド間で画像(およびそのメタデータ)を渡すことができます。「分散ピクセルキャッシュデーモン」を参照してください。
mpc:
は、もともと非常に大きな画像を念頭に置いて設計された、特別な IM 固有のディスク保存形式です。基本的には、プログラムメモリのメモリマップされたディスクファイルで、2 つのバイナリファイルとしてディスクに保存されます。1 つは画像のメタデータを保持する ".mpc"、もう 1 つは画像のピクセルキャッシュを保持する ".cache" です。
"MPC:" 形式では、1 つの画像を保存するために 2 つのファイルが作成されます。
このようなファイルは、IM の再コンパイルまたはアップグレード後は機能せず、特定のマシン用にコンパイルされた IM のみに有効です。そのため、スクリプト化された画像処理で使用される一時的な画像などを保持するなど、一時的な「クイックリード」ファイルにのみ適しており、長期保存には適していません。例えば...

  magick very_big_image.tif  very_big_image.mpc
は、ディスク上に 2 つのファイルを作成します。1 つは小さな "very_big_image.mpc" ファイル、もう 1 つは "very_big_image.cache" という特殊なメモリダンプファイルです。2 番目のファイルのサイズは、生の非圧縮メモリダンプであるため、他の画像ファイル形式よりもはるかに大きくなる可能性があります。ただし、ファイルは「読み込まれる」または「デコードされる」必要はなく、コンピューターのメモリに直接「ページング」して、まったく同じように処理オーバーヘッドなしで使用できます。必要なのは、大量のディスク容量とディスク IO だけです。言い換えれば、ファイル形式の処理なしに、読み取りにディスクアクセス時間のみが必要です。つまり、データのデコードは必要ありません。画像は「メモリ準備完了」であるため、次に発行する IM コマンドですぐに使用できるようになるため、あらゆるサイズの一時的な画像に特に便利です。ただし、2 つのファイルが生成され、通常の画像ファイルサイズよりも大きくなることを覚えておいてください。そのため、ディスクの使用量とスクリプトのクリーンアップには注意してください。私の IM スクリプトでは、この機能をうまく利用しています。たとえば、スクリプト "de-pixelate" および "divide_vert" を参照してください。これらは、画像処理操作にかなり大量の一時画像ファイルを使用します。これは、IM が画像をデコードしたり、保存するためだけに大量のメモリを消費する必要がないため、同じ画像を何度も何度も読み取る必要があるスクリプトや Mogrify アルファ合成に非常に役立ちます。これは、処理のために画像の小さなセクションを抽出または 切り抜きする必要がある、非常に大きな画像を処理する場合にも非常に役立ちます。ただし、ほとんどの画像操作では、処理中に画像のクローンコピーが作成されるため、新しいインメモリコピーを作成することもできます。そのため、依然として注意が必要です。切り抜きまたは サイズ変更は、MPC の大きな画像処理に対して最も安全な操作です。詳細については、下の「非常に大規模な画像処理」を参照してください。
fd:{file_descriptor}
これは、画像を読み取る、または書き込む特定の「ファイル記述子」を指定できる特別なファイル名です。名前 'fd:0' はプログラムの「標準入力」であり、'fd:1' は「標準出力」です。これらは、ファイル名として '-' を使用することと同じです。ただし、画像の読み取り/書き込みを行う任意の「ファイル記述子」を指定できます。「標準エラー」の場合は 'fd:2' など、親プログラムが事前に配置した他の任意のオープン済みファイルハンドルを指定できます。これの最も一般的な用途は、非常に高度なシェルスクリプトで、複数の画像ファイルストリームがある場合です。または、複数のファイルストリームを同時に開いている可能性のあるネットワークデーモンの場合です。
inline:{base64_file|data:base64_data}
インライン画像を使用すると、特別な base64 エンコードで定義された画像を読み取ることができます。たとえば、base64 エンコードされた画像を読み取るには...
inline:base64_image.txt
このエンコードはファイルからのものかもしれませんが、外部画像ソースからのファイル名としてではなく、読み取り引数として直接与えられるのが一般的です。これは、コマンドラインまたは API 画像処理での「blob」の代替として一般的に使用されます。または、コマンドラインに画像データを直接入力します...
inline:data:mime-type;base64,/9j/4AAQSk...knrn//2Q==
たとえば、非常に小さな画像を base64 エンコードしてみましょう(この変換を行うことができるプログラムはたくさんあります)...

  openssl enc -base64 -in noseguy.gif
[IM Text]
base64 データには、リターンや改行などの任意の量の空白を含めることができることに注意してください。フォーマットによって単に無視されます。また、通常の ASCII 文字のみを使用するため、メールや Web ページでバイナリデータをエンコードするために使用されます。また、バイナリデータを問題なくプログラムやスクリプトに保存することもできます。たとえば、次のコマンドをシェルスクリプトに含めることができるため、スクリプト自体に画像が組み込まれ、したがって、外部の別の画像ソースを必要としません。

  magick 'inline:data:image/gif;base64,
      R0lGODlhIAAgAPIEAAAAAB6Q/76+vvXes////wAAAAAAAAAAACH5BAEAAAUALAAA
      AAAgACAAAAOBWLrc/jDKCYG1NBcwegeaxHkeGD4j+Z1OWl4Yu6mAYAu1ebpwL/OE
      YCDA0YWAQuJqRwsSeEyaRTUwTlxUqjUymmZpmeI3u62Mv+XWmUzBrpeit7YtB1/r
      pTAefv942UcXVX9+MjNVfheGCl18i4ddjwwpPjEslFKDUWeRGj2fnw0JADs=
    '  b64_noseguy.gif
[IM Output]
これにより、画像はスクリプト(シェルまたは API)で使用できるようになることを覚えておいてください。インストールが複雑になるような、外部の画像ファイルを別途用意する必要はありません。では、なぜ "inline:" にこのような複雑な形式があるのでしょうか?基本的に、これは HTML Web ページでインライン画像に使用される形式であるためです。たとえば、次の例では、右側の画像は Web ページに直接インラインで含まれており、次のような HTML タグを使用して、別の外部ファイルとして含まれていませんでした...

  <IMG SRC="data:image/gif;base64,
        R0lGODlhIAAgAPIEAAAAAB6Q/76+vvXes////wAAAAAAAAAAACH5BAEAAAUALAAA
        AAAgACAAAAOBWLrc/jDKCYG1NBcwegeaxHkeGD4j+Z1OWl4Yu6mAYAu1ebpwL/OE
        YCDA0YWAQuJqRwsSeEyaRTUwTlxUqjUymmZpmeI3u62Mv+XWmUzBrpeit7YtB1/r
        pTAefv942UcXVX9+MjNVfheGCl18i4ddjwwpPjEslFKDUWeRGj2fnw0JADs="
      ALT="Nose Guy" WIDTH=32  HEIGHT=32  VSPACE=5 HSPACE=5 BORDER=0 >
Nose Guy
これはすべての Web ブラウザーで機能するわけではありません。たとえば、IE7 以前では機能しませんが、IE8 では機能します。基本的に、最新の Web ブラウザーはそれを理解します。
同じタイプのインラインデータ形式は、メールヘッダーの「顔」画像や、おそらく他の多くのファイルタイプにも使用されています。余談:ImageMagick の「マジック」のおかげで、ほとんどの画像ファイル形式には、mime-type(長い文字列の 'image/gif' の部分)を含める必要はありません。実際には、いずれにせよ IM によって完全に無視されます。ただし、インライン画像データ文字列のその部分の終わりを示すために、コンマ ',' は依然として必要です。

  magick 'inline:data:,R0lGODlhEAAOALMAAOazToeHh0tLS/7LZv/0jvb29t/f3//U
       b//ge8WSLf/rhf/3kdbW1mxsbP//mf///yH5BAAAAAAALAAAAAAQAA4AAARe8L1Ek
       yky67QZ1hLnjM5UUde0ECwLJoExKcppV0aCcGCmTIHEIUEqjgaORCMxIC6e0CcguW
       w6aFjsVMkkIr7g77ZKPJjPZqIyd7sJAgVGoEGv2xsBxqNgYPj/gAwXEQA7
    '  b64_folder.gif
[IM Output]
警告:コマンドラインオプションの入力は 5000 文字に制限されています。また、多くのシェル(特に PC-DOS 入力)には、コマンドライン全体の長さ制限があります。そのため、これは非常に大きな base64 画像には適していません。
clipboard:
Windows クリップボードとの間で画像を読み書きします(Windows のみ)。
ephemeral:{image_file}
この画像ファイルを読み込んでから削除します。これは、与えられた画像ファイルがメモリに読み込まれた後に IM がその画像ファイルを削除する、特別な画像読み取りファイル形式です。メモリ内の画像は、読み込まれたファイルが削除されたときには処理も保存もされていないことに注意してください。これは非常に危険であり、細心の注意を払って使用する必要があります。主に 委任スポーンで使用されます。ここで、バックグラウンド委任は入力画像を読み込み、データを受け取ったときに削除します。これにより、「子」が提供された画像の読み込みを終了したため、フォアグラウンドの「親」プロセスに、単独で続行する準備ができていることが通知されます。その後、メインプログラムはクリーンアップし、画像処理を別々に続行するか、場合によっては単に終了することができます。"show:" 画像出力委任は、"magick display" コマンドでこれを使用して、メインコマンドが続行または終了する前に、自動的にバックグラウンドで画像マジック表示を行います(下記参照)。たとえば、私は "flicker_cmp" を呼び出して、いくつかの中間結果を表示するシェルスクリプトでこれを使用しましたが、IM が 2 番目に指定された画像を削除することで、プログラムが入力画像の読み込みを終了したことを通知したときに、自動的に続行(または終了)します。そのフィードバックが必要だが、読み込まれる画像を保持する必要がある場合は、元の画像のコピー、ハードリンク、またはシンボリックリンクを作成し、そのファイルを "ephemeral:" として渡します。そうすれば、削除されても元の画像は保持されます。注意:現在、「アニメーション」または「表示」がアニメーションを終了したか、実際に画像を表示するために画像マジックをアップロードしたときに信号を送信する方法はありません。 :-( ただし、「magick」に別の "ephemeral:" 画像を読み込ませて、画像処理の特定のポイントに到達したことを制御スクリプトに通知することができます。

  # Blur an image, and show an on screen comparision before
  # auto-deleting and exiting.
  magick rose: input_image.png
  magick input_image.png -blur 0x5  blurred.png
  flicker_cmp input_image.png ephemeral:blurred.png &

  # wait for the second image to have been read and deleted!
  while [ -f blurred.png ]; do usleep 100; done

  # At this point we can continue (or exit) without problems.
  # while the on screen display continues in background.
  rm -f input_image.png
私はまた、他のバックグラウンドプログラムで、そのバックグラウンドプログラムが続行する準備ができているという信号としてこれを使用しました。
show:win: および x: -- 画像を画面に直接表示する
これらは、画像の結果を画面に直接表示する特別な出力形式です。画像をファイルに保存する代わりに、結果を表示するだけです。これは、IM コマンドの結果がどうなるかを確認するための迅速なテストに非常に役立ち、この目的のために強くお勧めします。ただし、これらは "display" および "animate" コマンドの非常に単純なバージョンにすぎません。たとえば、ディレクトリ内の画像の簡単な概要を取得します...

  magick montage *.jpg show:
2 つの画像の間で異なる領域を確認します...

  magick compare image1.png image2.png show:
ここにリストされているすべての形式は、実際には "display" プログラムを呼び出してタスクを実行します。ただし、それぞれが異なる方法でジョブを処理しました。たとえば、'show:' は、別の "display" プログラムを実行するために、スポーン委任を使用します。つまり、画像が表示されたら、元のコマンドは処理を続行します(通常は終了します。"-write show:" を使用しない限り)。一方、'x:' または 'win:' を使用すると、表示ウィンドウを終了するまで、元のコマンドが続行(および終了)できるようになるのを待ちます。残念ながら、これらの方法はいずれもアニメーションをうまく表示できません。そのためには、アニメーションを(MIFF 形式で)"animate" コマンドにパイプ処理することをお勧めします。
x: (入力として) - X Window 表示の読み取り
現在の X ウィンドウの表示を "x:" オペレーターを使って読み取ることもできます。これは "import" コマンドとほぼ同じです。実際、オプションなしでは "import" コマンドとまったく同じように動作します。左ボタンを使ってコピーするウィンドウを選択するか、中ボタンを使って領域をマークします。たとえば、マウスを使ってウィンドウを選択し、取得したウィンドウを別のウィンドウに表示するには(取得したウィンドウが表示されたら終了)...

  magick x:  show:
警告:マップされていない(アイコン化された)ウィンドウや、別のウィンドウが重なっているウィンドウを取得した場合、画像の内容は空白の領域か、重なっているウィンドウの内容になります!したがって、ウィンドウを取得するときは、ウィンドウが画面に完全に表示されていることを確認してください。画面全体を取得するには、ウィンドウ名として 'root' を使用します。

  magick x:'root'  full_screen_dump.jpg
または、読み取り修飾子を使用して、ディスプレイの特定の領域を取得します。

  magick x:'root[300x400+879+122]'  part_screen_dump.jpg
ウィンドウ名を指定すると、特定のウィンドウを取得できます。たとえば、これは 'MailEd' というタイトルのウィンドウを取得します...

  magick x:'MailEd'  window.jpg
しかし、これはあまりうまく機能しません。同じ名前のウィンドウが複数ある場合や、ウィンドウの名前を特定できないことがよくあるからです。より良い方法は、Xディスプレイが特定のウィンドウ(または子ウィンドウ)を一意に識別するために使用する「XウィンドウID」を使用して、IM に正確なウィンドウを伝えることです。XウィンドウIDは通常、"xwininfo" コマンドを使用して調べますが、"xdotool"、"xwit" などの他のプログラムや、"xprop" のようなツールも、ウィンドウに関する情報を見つけるために使用できます。たとえば、ウィンドウのクラス、名前、タイトル、サイズと配置、子ウィンドウ、ウィンドウマネージャーの装飾などです。たとえば、「Mozilla Firefox」がタイトルまたは名前に含まれるすべてのウィンドウを見つけるには...

  xwininfo -root -all | grep "Mozilla Firefox"
上記の出力から、目的のウィンドウの X ウィンドウ ID を抽出できます。次に、ウィンドウマネージャーにある、より複雑なbashスクリプトを示します。ボタンを押すと、現在「フォーカス」があるウィンドウの ID を調べてキャプチャし、以前のキャプチャに従って、次のキャプチャ番号を使用して現在のディレクトリに PNG としてファイル名を付けます。

  bash -c "
    id=$(xprop -root _NET_ACTIVE_WINDOW | sed 's/.* //')
    magick x:$id capture-tmp-$$.png
    num=$( ls capture-[0-9]*.png 2>/dev/null | sed -n '$ s/[^0-9]//gp' )
    num=$( printf %03d $(expr $num + 1) )
    mv capture-tmp-$$.png capture-$num.png
  "
ほとんどのターミナルプログラムは、環境変数 "WINDOWID" でテキストを表示するために使用している X ウィンドウ ID を教えてくれます。したがって、XTerm または Gnome Terminal のコマンドラインからこれを実行すると、現在のターミナルウィンドウのコピーが取得されます。

  magick x:$WINDOWID  this_terminal.png
さて、少し面白いことを... ここでは、現在のターミナルの内容を取得し、そこに何かを描画してから、"display" を使って同じターミナルウィンドウに描き戻します!

  window=`xwininfo -children -id $WINDOWID |\
                  sed -n 's/^ *\(0x[^ ]*\).*/\1/p'`; \
  window="${window:-$WINDOWID}"; \
  magick x:$window -background black \
          -draw 'fill black         rectangle 40,40 160,160' \
          -draw 'stroke red         line 50,50 50,150 line 50,150 150,150' \
          -draw 'fill lime          circle 110,100 80,100' \
          -draw 'stroke dodgerblue  line 50,150 150,50' \
          rose: -geometry +180+60 -composite \
          png:- |\
    magick display -window $window -
上記の最初のコマンドは、"magick display" を実行するウィンドウが、提供された "WINDOWID" の子ウィンドウである必要がある "XTerm" ウィンドウ用に設計されています。2行目は、子ウィンドウが見つからない場合、"Gnome-Terminal" ウィンドウの場合のように、"WINDOWID" の元の値にフォールバックします。使用するウィンドウが決定したら、それを取得し、描画してターミナルウィンドウに復元します!すると、現在のターミナルウィンドウに直接グラフィカルな出力が得られます。より簡単な例を次に示します。これは、実行するたびにウィンドウの内容を暗くします。実際の "xterm" ウィンドウでこれを数回実行してみると、ターミナルウィンドウで古いコマンドほど暗くなることがわかります!

  window=`xwininfo -children -id $WINDOWID |\
                  sed -n 's/^ *\(0x[^ ]*\).*/\1/p'`; \
  window="${window:-$WINDOWID}"; \
  magick x:$window -background black -colorize 20% png:- |\
    magick display -window $window -
そして、これは私が自分の "xterm" ウィンドウで上記を繰り返したときに何が起こったかを示す「スクリーンキャプチャ」です...
[snapshot]
ターミナルの内容は変更されますが、一時的なものであることに注意してください。アイコン化したり、隠したり、デスクトップ画面を変更してからターミナルに戻ると、ターミナルプログラムがウィンドウを再描画し、自分の「描画」を消してしまうため、変更は失われます。上記の操作は、"XTerm" ほど "Gnome-Terminal" ではうまく機能しません。これは、後者がスクロールするたびにウィンドウを「再描画」するのに対し、"XTerm" はそうしないからです。大規模なクライアントプログラムの一部として、グラフやその他の結果をさまざまなウィンドウに直接表示する IM スクリプトを想像してみてください。実際、これは多くのポストスクリプトビューアーや、多くのWebブラウザーでさえ、特別なサブプログラムからの出力を表示する方法です。つまり、そのサブプログラムに引き継がせ、提供されたサブウィンドウに直接描画させます。実験して、メールまたは IM ユーザーフォーラム を通じて、自分が何を思いついたかを私(および他の人)に知らせてください。

画像形式のコーダーとデリゲート

コーダーは、(通常 C プログラミング言語で記述された)動的ライブラリモジュールであり、画像の入出力の「形式:」の側面を処理します。また、ユーザーが特殊な目的のフィルターを作成するためにも使用できます。これらは、外部ライブラリを追加でインストールする必要がある場合があります。これは「デリゲートライブラリ」と呼ばれることがよくあります。これらは、必要に応じて動的モジュールとしてのみロードされます。つまり、コーダーが使用する関連ライブラリは、実際にそのコーダーを使用する場合を除き、インストールする必要はありません。これらの例では、コーダーを作成するために必要な C プログラミングについては説明しませんが、独自のコーダーモジュールを作成するために使用できるソース内にコーダーの例があります。
デリゲートは、IM が異なる形式間でマジックできるようにするコマンドにすぎません。これにより、IM は、より複雑なバイナリコーダーで一部の画像ファイル形式を処理するよりも、その「より単純な」事前作成済みのコマンドを使用できるようになります。利用可能なデリゲートのリストを取得するには、特別なコマンドを使用します...

  magick -list delegate
IM が使用する最もよく知られている「デリゲート」プログラムは "ghostscript" であり、これにより IM は非常に複雑な Postscript および PDF 形式のベクター画像を、IM が読み取ることができる他のラスター画像ファイル形式に読み込んでマジック処理できます。ただし、「デリゲートコマンド」は、IM を拡張して特殊な種類の画像を処理できるようにしたり、それらの画像を読み書きする代替方法を提供できるようにするため、ユーザーにとっても非常に役立ちます。「コマンド」自体は、IM のシステム構成ディレクトリにある "delegates.xml" というファイルにリストされています。ただし、Linux/UNIX のホームディレクトリのユーザー個人の ".magick" サブディレクトリにある "delegates.xml" も読み取ります。そして、ユーザーが自分の「コマンドデリゲート」を配置する必要があるのは、この2番目のファイルです。

入力デリゲートコマンドの例

たとえば、次のような形式で、Linux/UNIX ホームディレクトリの ".magick" サブディレクトリに個人の "delegates.xml" ファイルを作成できます。

<?xml version="1.0" encoding="UTF-8"?>
<delegatemap>
  <delegate decode="flip" command="magick '%i' -flip 'miff:%o'"/>
</delegatemap>
これは完全な「デリゲート」構成ファイルですが、実際には真ん中の行のみがデリゲートです。".flip" サフィックスまたは "flip:" 形式のプレフィックスが付いた画像が検出された場合、上記のコマンドを呼び出して「flip」形式の画像を読み取る必要があることを IM に伝える非常にシンプルなものです。たとえば...

  magick flip:tree.gif   delegate_tree_flip.gif
[IM Output]
この場合、デリゲートコマンドが行うことは、別の IM "magick" コマンドを使用して画像を上下反転することだけです。これは、元の IM コマンドが画像を読み取って処理する前に実行されます。デリゲートは、コマンドが指定された画像ファイル形式を理解し、IM 自体が理解して処理できる任意の画像ファイル形式(この場合は MIFF 画像ファイル形式)を返すことを想定しています。デリゲートの '%i' と '%o' の部分は、コマンドが使用する一時的なファイル名を示しており、デリゲートが使用する入力および出力ファイル名が指定されています。これらのファイル名は IM によって生成され、一時ディレクトリに配置されます。また、これらのテンポラリファイル名には画像サフィックスがないため、必要に応じて目的の画像形式タイプをプレフィックスとして付けることが重要です。これはセキュリティ上の理由と、IM 自体が実際のファイルではなくデータのストリームのみを読み取っている可能性があるためです。また、これは、デリゲートコマンドが完了時にこれらのファイルのクリーンアップなどの処理を行う必要がないことも意味します。中間一時ファイル用、画像の密度、サイズなど、2番目の一時ファイル名など、他の '%' 置換もあります。これらのエスケープおよびその他のデリゲートオプションの詳細については、IM がインストールした 'システム' "delegate.xml" ファイルの先頭にあるコメントに記載されています。これは、やや愚かで些細な例のように思われるかもしれませんが、基本的に、セカンダリコマンドを使用して、任意のデータファイルを IM が理解する任意の画像にマジックできるようになったことを意味します。IM は、画像サフィックスまたは形式プレフィックスが指定されていると、詳細をすべて覚えておく必要なく、そのデータ型を自動的に処理する方法を認識します。このタイプの多くのデリゲートがすでにシステムファイルに追加されているため、確認する価値があります。
セキュリティ上の理由から、個人の "delegates.xml" ファイル内のデリゲートは、システムにインストールされた "delegates.xml" ファイルで定義されたデリゲートをオーバーライドしません。ホームディレクトリの ".magick/delegates.xml" に新しい一意のデリゲート形式を追加することしかできません。後で重複するデリゲートは無視されます。

もちろん、入力形式が内部的にすでにわかっている場合は、システムデリゲートは参照されません。

また、常にそうであるように、ユーザー(特に Web ユーザー)の入力をサニタイズしてください。ユーザーが知らないうちにデリゲートを使用させたくないからです。

例えば、IM v6.4.2-6 の時点で、システムデリゲートファイルに "autotrace:" デリゲートが追加されました。これは、任意の入力画像を読み込む際に "AutoTrace" コマンドを実行します。IM は入力画像をデリゲートプログラムが必要とする PNG 画像形式に変換し、デリゲートを通してフィルタリングし、結果の SVG(通常は外部の RSVG ライブラリ経由)を読み込んで、元の入力ビットマップ画像の滑らかなエッジバージョンを生成します。ラスタからベクタへの変換の例を参照してください。コンバータが複数の画像ファイル(PNG など)を生成する場合は、それらの個別の画像を MIFF などの単一のマルチイメージ形式にマージして、IM が1つの出力ファイルから複数の画像を読み取れるようにする必要があります。場合によっては、IM は複数のデリゲートプログラムを連結して画像を読み込みます。たとえば、'HTML' ページを画像として読み込むには、最初に "html2ps" デリゲートを呼び出して、ポストスクリプトに変換します。次に、生成されたポストスクリプトファイルを、特別な "ghostscript" プログラムデリゲートを使用して、複数の画像のセットに変換します。もちろん、このように2つ以上のデリゲートを使用すると、デリゲートプログラムに存在する可能性のある複雑な相互作用、インストールミス、およびバグが原因で、他の問題が発生する可能性があります。しかし、一般的には機能し、ImageMagick を魔法のようなものにする重要な側面です。

出力デリゲートの例

IM が直接理解できない特定の画像ファイル形式で保存する場合にも、同様のことが行われます。たとえば、このデリゲートを個人の ".magick/delegates.xml" ファイルに追加することで、IM に '.xyzzy' 画像ファイルの作成方法を指示できます。

  <delegate decode="gif" encode="xyzzy" command='mv "%i" "%o"'/>
もちろん、これは GIF ファイル形式の画像を TMP ファイル形式としてすばやくコピーするだけですが、コマンドは任意のタイプの画像コンバータ、スクリプト、またはシェルコマンドシーケンスにすることができます。この個人用デリゲートを使用すると、IM は少なくとも1つの方法が提供されたことで、'.xyzzy' 画像を作成できるようになりました。

  magick rose: -negate   rose.xyzzy
  magick identify rose.xyzzy
上記の識別では、'.xyzzy' サフィックスを理解していないことに注意してください(入力デリゲートは提供されていません)。ただし、特定のデリゲートが提供されていないため、ファイル 'magic'(ファイル自体の中にある識別文字列)は、IM に実際には GIF 画像形式であることを伝え、特別な入力デリゲートやコーダを必要とせずに、IM が正しく処理します。これが実際には 'ImageMagick' の 'MAGIC' 部分です。

デリゲートリスト

IM が画像形式の変換に使用できる外部デリゲートの完全なリストは、特別なシステムファイル "delegates.xml" と個人の "delegates.xml" ファイル(下記参照)から読み取られます。このファイルを見つけることができれば、面白い読み物になります。ただし、このファイルの形式は複雑すぎてここでは説明できませんが、システムファイルと、オンラインおよび ImageMagick インストール(ドキュメントエリア)で提供されるマニュアルの両方で説明されています。IM がこれらのファイルから読み取っているデリゲートと変換の簡略化された概要は、"-list delegate" オプションを使用して出力できます...

  magick -list delegate
ただし、'stealth="True"' で宣言されたデリゲートは、"-list delegate" オプションではリストされないことに注意してください。すべてのデリゲートはオプションであり、特定の変換に対して複数のデリゲートを作成できます。1つのデリゲートが利用できない場合(またはエラーが発生して画像が作成されない場合)、IM は機能するデリゲートが見つかるか、試行するデリゲートがなくなるまで、次のデリゲートを試行します。その時点で、その画像を読み取ることができないことを示すエラーが生成されます。

デリゲートの印刷

私がこれまでに作成した最も便利なデリゲートの1つは、画像をポストスクリプトプリンターに簡単に印刷できるようにすることでした。プリンターはすでに Linux の "lpr" コマンドを使用してセットアップされており、PNG 形式の画像またはポストスクリプトファイルを受け入れることができました。これが私が作成することにした単純な "PRT:" デリゲートです。
[IM Output]

  <delegate decode="ps" encode="prt" command='lpr "%i"'/>
システム上の "lpr" コマンドに渡される画像に、ポストスクリプト形式("decode="ps"")を使用することにしました。これは、"-density" などのオプションを使用して出力画像のサイズを調整できるためです。たとえば、画面からウィンドウを取得し、画像を変更して、(私が望むように)印刷されたページに収まるようにしてから印刷するコマンドを作成できます。

  magick x:Loopy -shave 6 -chop 0x24 -modulate 220,0 \
          -bordercolor white -border 50x150 -density 130   prt:
"decode="png"" を使用することもできましたが、その場合、システムは画像を拡大または縮小して、常にA4ページを完全に埋めるようにします。ただし、これが好きな人もいるかもしれません。

  <delegate decode="png" encode="prt" command='lpr "%i"'/>

外部コマンドの実行

外部コマンドデリゲートは、ファイルとの間で画像を変換するためだけではなく、バックグラウンドで複雑なコマンドをすばやく実行(または「生成」)するためにも使用できます。このようなデリゲートには、属性 'spawn="True"' が追加され、コマンドを起動し、入力画像を削除するまで待機してから、IM は通常どおり続行し、バックグラウンドでコマンドを実行したままにします。たとえば、2つの出力デリゲート "show" と "win" は、IM の "display" プログラムでコマンドの結果を表示する簡単な方法を提供します。たとえば...

  magick rose: label:rose -append   show:
これにより、組み込みの 'rose' 画像にラベルが追加され、画面に表示されるだけです。生成デリゲートが入力画像を読み取り、削除した場合(通常は特別な "ephemeral:" 入力形式を使用します。上記を参照)、起動元の IM は続行(および終了)し、結果を表示する 'display' プログラムをバックグラウンドで実行したままにします。これが "show" 生成デリゲートであり、"display" コマンドでの "ephemeral:" の使用を示しています。

  magick -list delegate | grep show
残念ながら、"list" オプションはデリゲートの 'spawn="True"' フラグを表示しませんが、このデリゲートに対して定義されています。これは、スクリプト化された "display" コマンドに必要なすべての特別なオプションを記憶しようとするよりもはるかに便利です。おそらく、常に実行する複雑なコマンドがあるかもしれません。

ポストスクリプトと PDF デリゲート

ImageMagick は、デリゲートを使用することで、外部プログラムを利用して、より複雑で特殊な画像形式の変換を行うことができます。たとえば、ポストスクリプト(PS:)およびカプセル化されたポストスクリプト(EPS:)は、ImageMagick によって直接書き込むことができます。これらのファイル形式は、IM では読み取ることができません。ポストスクリプトは完全なコンピュータ言語であり、そこから画像を作成するには非常に複雑なインタープリタが必要です。そのため、このファイル形式の読み取りを処理することは IM の範囲をはるかに超えています。これを解決するために、IM は "ghostscript" という外部デリゲートプログラムを探して、PS または EPS 形式のファイルを IM が簡単に読み取ることができる別の画像形式に変換する作業を行います。もちろん、これは、次のようなエラーが発生した場合...
convert: この画像形式のデコードデリゲートがありません `...'
基本的には、IM が、指定された画像形式を IM 自体が処理できる画像形式に変換するための適切な外部プログラムを見つけることができなかったことを意味します。ポストスクリプト画像の場合、通常は "ghostscript" がインストールされていないか、構成が誤っているか、システム上の不明な場所にあることを意味します。
[IM Output]
PDF/PS "ghostscript" デリゲートは、内部で使用される特別な形式になっています。IM は、内部的にポストスクリプト形式の画像を調べて、指定されたデリゲートを介してファイルをどのようにラスタライズするかを正確に判断しようとします。

実際、状況に応じて、複数の PS デリゲートが存在し、IM によって選択されます。たとえば、使用される ghostscript デバイス('bmpsep8' 対 'pngalpha')は、"-colorspace RGB" が以前に設定されているかどうかによって選択されます。

PDF の場合、'pngalpha' ghostscript デバイスは1対1のページと画像の変換のみをサポートし、PDF は一般的に複数ページであるため、'ps:alpha' ではなく 'ps:color' デリゲートを使用します。

ダイレクトデリゲート形式変換(汚染)

デリゲートシステムでは、IM が外部プログラムを呼び出して、ImageMagick 自体による画像の処理なしに、ある形式から別の形式に画像を変換することもできます。ただし、宛先画像が IM で画像として読み取り可能であり、"magick" の最終結果が画像の「汚染されていない」コピーである場合に限ります。たとえば、'Adobe Illustrator' ファイル(".ai")(ポストスクリプトの一種)を EPS(カプセル化されたポストスクリプト)に変換しようとすると...

  magick -density 300   map.ai  map.eps
すると、IM は "map.ai" を("/tmp" 内で)理解できる形式である EPS ファイルに変換します。次に、メモリに読み込んだ後('eps' デリゲートを使用した後)、実際には変更する必要がないことがわかります(「汚染されていない」ままです)。画像に変更が加えられておらず、画像がすでに 'eps' ファイル形式に変換されていたため、IM はそれ自体をショートカットし、生成された 'eps' ファイルを "map.eps" に直接コピーします。つまり、EPS ファイルは元の変更されていない Adobe Illustrator ファイルの単なるコピーになります。言い換えれば、IM はファイルの変換(実際には名前変更のみ)に内部デリゲートを使用しただけです。画像自体を実際に処理することはなく、そのため、画像は純粋なベクター画像のままです。これが実は、ImageMagick のバージョン1に戻ったときにプログラムとしての "magick" の本来の目的でした。他のすべての操作と設定は、非常に長い時間をかけて後から追加されました。 ただし、特殊な "-taint" 演算子を使用して、実際には変更せずに変更されたとしてマークすることにより、IM に実際に画像を読み書きさせることができます。

  magick -density 300 map.ai  -taint  map.eps
ここで、IM が読み取る画像は「変更された」または「汚染された」状態になるため、入力ファイルを単にコピーするのではなく、メモリ内の画像のバージョンを最終的な EPS ファイルに書き出します。

その他のデリゲートの例

CMYK ポストスクリプト用のポストスクリプトデリゲートの変更

ジョン氏のブログを参照してください。

DCRaw 8ビット処理済みカメラ画像デリゲート

8ビットの完全に処理された「raw」デジタルカメラ画像(CRW、CR2、NEFなど)を読み取るための代替デリゲートは...

  <delegate decode="dcraw8" command='dcraw -v -w -O "%o" "%i"'/>
これは「生の」カメラ画像を読み込み、それをPNGファイル形式に変換します(ただし、'-T'フラグを追加してTIFF画像形式を使用することも簡単にできます)。その出力画像はImageMagickで読み取り可能です。このデリゲートを追加することで、ImageMagickのあらゆる画像読み込み操作(コマンドラインだけでなく、あらゆるAPI)で簡単に使用でき、IMがすべてのファイルIOとクリーンアップを処理します。例えば...

  magick dcraw8:image.crw  image.png
"dcraw"実行可能ファイルのファイルパスを定義しない場合、IMはユーザーの現在のPATH環境変数に沿ってプログラムを検索しますが、これを許可するとセキュリティ上の問題が発生する可能性があります。システムにインストールされたデリゲートは、通常、コマンドパスを完全に定義します。このIMユーザーフォーラムディスカッションのコメントを参照してください。

'ffmpeg'を使用するビデオデコーダーデリゲート

たとえば、Mikko Koppanenが自身のMikkoのブログサイトで公開したデリゲートを次に示します。これをホームディレクトリの".magick"ディレクトリにある個人の"delegates.xml"ファイルに追加してください...

  <delegate decode="ffmpeg" command="'ffmpeg' -i '%i' -y -vcodec png -ss %s -vframes 1 -an -f rawvideo '%o'" />
これで、IMは"ffmpeg"プログラムを使用してMPEGビデオ画像からフレームをデコードできます。例えば。

  magick "ffmpeg:test1.mpg[40]"  frame_40.png

本当に巨大な画像の処理

あらゆる種類の大きな画像を処理するには、高品質のQ16バージョンよりもメモリ要件が半分であるImageMagickのQ8バージョンを使用する方がおそらく良いでしょう。"identify -version"を使用して、IMのコンパイルされたQレベルを確認してください。中程度のサイズの画像の場合は、"-limit"を使用して処理制限を増やすことを試みることができます(たとえば、"-limit area 8192 -limit memory 8192"を処理するなど)。これにより、IMが画像データをディスクにキャッシュすることを回避しようとします。ただし、システムが大きなメモリ要求を拒否し、それでもIMが画像をディスクにキャッシュすることを強制する場合があります(約1000倍遅くなります)。IMが画像処理にディスクキャッシュを使用しているかどうかを確認するには、"-debug cache"を使用してその動作を監視できます。また、IMフォーラムディスカッションも参照してください。

メモリ/ディスク管理

本当に大きな画像を処理する場合、IMがコンピューターのメモリをすべて使い果たし、一時的なスワップディスクファイルを使用するようにすぐに要求することで、他のプログラムの処理を遅くしないように注意する必要があります(メモリとディスクスワップの間を行ったり来たりするのにすべての時間を使うことで)。たとえば、これは他のことにコンピューターを使用することを妨げることなく、非常に大きな画像を長期間にわたって処理する優れた方法です。基本的に、IMにすべてをディスクにキャッシュすることを強制します。

  env MAGICK_TMPDIR=/data nice -5 \
    magick -limit memory 32 -limit map 32 \
            huge_9Gb_file.psd  -scene 1 +adjoin layer_%d.png
もちろん、これは"/data"に画像のメモリ要件を処理するのに十分なファイルとディスクスペースがあることを前提としています。

メモリマップドディスクファイル

同じソース画像に対して多数の操作を実行する必要があり、十分なディスクスペースがある場合は、作成にコストがかかるものの、ロード時のオーバーヘッドがほぼゼロであるMPC画像形式を使用できます...

  magick mybigassimage.jpg mybigassimage.mpc
  magick mybigassimage.mpc   -resize 50%  resized.jpg
  magick mybigassimage.mpc   -rotate 90   rotated.jpg
  ...etc...
  rm -f mybigassimage.mpc mybigassimage.cache
これにより、非常に大きな画像を最小限のコストとメモリ使用量で複数回読み取ることができます。このメソッドを使用したスクリプト形式のタイリングの例は、IMフォーラムディスカッション大きな画像をタイルに分割で紹介され、非常に大きな画像のトリミングで再検討されました。基本的に、MPC画像形式ファイルは、情報を含む".mpc"ファイルと、画像が直接メモリページングされたコピーである".cache"の2つの実際のファイルで構成されます。もちろん、完了したら両方のファイルをクリーンアップする必要があります。このメソッドは、新しい"magick"コマンドを実行するたびに、IMが画像形式を再解析してディスクにキャッシュする必要がないように設計されています。また、入力画像のセクションのみにアクセスする場合、各コマンドは画像全体を処理する必要はなく、必要に応じてキャッシュされたディスクファイルからその小さなセクションだけを読み取ることができます。画像の非常に大きなMPCコピーを処理する場合は、実際の処理のために画像のより小さなセクションを抽出またはトリミングすることをお勧めします。これは、画像に対して実行されるほとんどすべての操作で、通常、結果の新しいインメモリコピーが作成されるため、最初のトリミングは非常に良いアイデアであるためです。メモリがある場合は、'TMPFS'やRamDiskタイプのファイルシステムなどの「メモリディスク」を使用することもできます。ただし、そのタイプのディスクを埋めると、コンピューターのメモリも直接埋められることに注意してください。つまり、メモリの使用を別の使用に置き換えているだけです。

小さなセクションでの画像の処理

上記のMPCメソッドを使用して、ソース画像からさまざまなセクションを切り出してさらに処理できますが、それでも画像全体を読み込んで書き出す必要があります。また、大規模な画像の場合、それでも多くの時間がかかる可能性があります。IMは、"stream"と呼ばれる画像のより単純なパイプラインプロセッサも進化させてきました。このプログラムは、一度に1スキャンライン(ピクセルの行)のみを処理するように設計された限定された画像操作のセットを持っています。そのため、この方法で画像を処理する場合、ピクセルの1行を保持するのに十分なメモリのみが使用されます。たとえば、これにより、最初に画像全体をメモリに読み込むことなく、非常に大きな画像のより小さな領域を抽出して、さらに処理できます。ただし、"stream"の出力は生のRGB画像値であるため、いくつかの後処理をお勧めします。

  magick stream -map rgb -storage-type char -extract 600x400+1900+2900 image.png - |\
    magick -depth 8 -size 600x400 rgb:- tileimage.png
出力をファイルに保存する必要はありませんが、より小さな画像の処理を直接続行できます。例えば...

  magick stream -map rgb -storage-type char -extract 600x400+1900+2900 image.png - |\
    magick -depth 8 -size 600x400 rgb:-  ...more_processing_here...  tile.png
これにより、最初に大きな画像全体を読み込むことなく抽出された600x400ピクセルの画像のみが処理されます。速度に関する懸念...Peter V <peter.v@pv2c.com>は、次のように述べています...私の経験では、800MBのPNMファイルの切り取りに"stream"を使用する方法が、MPCファイルを使用したり、"magick -crop"を使用したりするよりも最速です。どの形式が機能するか...Paul Heckbert(画像歪みの第一人者)は、「stream」コマンドが特定のファイル形式(特にJPEG)ではうまく機能するが、インターリーブされている可能性のあるPSBのような他のタイプではうまく機能しないと述べています。これは、特定のファイル形式の「コーダー」がピクセルの行ごとのストリームをサポートしているかどうかに依存すると考えています。これは、ファイル形式の「コーダー」を生成したプログラマーが「ストリーミング」を完了したり必要としなかっただけである可能性があります。この場合、その画像ファイル形式に精通したプログラマーによるさらなる作業が必要になる場合があります。また、SVGやWMVのようなベクター画像ファイル形式、またはデジタルカメラ画像ファイル形式のような一部の「デリゲート」によって事前処理された画像は、画像内にピクセルの実際の行がないため、描画されたオブジェクト(線、ポリゴン、グラデーションシェード)のみであるため、「ストリーミング」することはできません。JPEG画像セクションIMフォーラムディスカッション巨大なJPEGの領域を抽出で説明されているように、JPEG Clubが開発した特別な"jpegtran"や"jpegcrop"などの専用のJPEGプログラムを使用して、データを実際にデコードせずにJPEG画像から領域を抽出できます。つまり、JPEGを別のJPEG画像にロスレスでトリミングします。例えば..

  jpegtran -crop 100x100+0+0 -copy none huge.jpeg  crop.jpg
ただし、いくつかの注意点があります。左上の開始点は、より小さい8または16の倍数に移動し、最終的な画像サイズが適切に増加します。これは、JPEG画像が(JPEGサンプリング係数によって決定される)通常8x8ピクセルまたは16x16ピクセルのサイズの「周波数エンコードされたブロック」を使用するためです(1 = 8ピクセル、2 = 16ピクセル)。これらのブロックは、ロスレスコピーを作成する場合は保持する必要があります。「+0+0」オフセットの場合、すでに適切な境界にあるため、上記では正確な100x100ピクセルのトリミングが生成されるはずです。ただし、他のオフセットの場合、抽出された領域の最終的なクリーンアップを行う必要があります。例えば...

  jpegtran -crop 100x100+123+425 -copy none huge.jpeg  crop.jpg
  magick crop.jpg -gravity SouthEast -crop 100x100+0+0 +repage crop_fixed.png

タイルでの画像の処理(PbmPlus)

画像全体をメモリに保持することなく、タイルで大規模な画像を処理するのは、はるかに難しい問題です。基本的に、画像を分割している間、大規模な画像を分割している間、または後で再結合している間、画像全体の行を保持するか、複数のストリーム(画像の列ごとに1つ)を開く必要があります。最も一般的な手法は、各画像タイルを個別の画像ファイルとしてディスクに保存することです。実際、これは、プログラムが処理のために必要な「タイル」だけをいつでも読み取ることができる、一種の「ディスクベース」ランダムアクセス画像を作成するため、超大型画像を保存するより良い方法であることがよくあります。このタイプの巨大な画像ストレージは、ピラミッド型の多重解像度構造と組み合わせて、実際には「Googleイメージマップ」が機能する方法です。IMには、少量のメモリを使用して巨大な画像を分割(タイルトリミング)する機能はありませんが、PbmPlus/NetPBMはこれを行うことができます。小さなセクションのPbmpus処理たとえば、ここではPbmPlusツールを使用して、大きな画像の小さなセクションを切り取り(トリミング)、処理してから、その部分を元の画像に合成します。

  tifftopnm INPUT.tif input.pam

  pamcut {left} {top} {width} {height} input.pam  part.pam
  # process smaller "part.pam" image here
  pamcomp -xoff={left} -yoff={top} - input.pam output.pam

  pamtotiff output.pam OUTPUT.tif

"tifftopnm"は画像データストリームへの変換を実行し、ImageMagickの"stream"コマンドと同様のジョブを実行します。"pamcut"はトリミング操作に相当し、入力画像からより小さな領域を抽出します。または高さの代わりに、トリミングのまたはの境界を指定することもできます。"magick stream"コマンドを"magickで置き換えることができます。中央部分は、通常のImageMagickを使用して処理するか、苦痛が好きなら、PbmPlusと同等のツールチェーンを使用して処理できます。"pamcomp"は、画像の変更された部分を元の画像のPbmPlusバージョンに重ねて表示する必要があります。"pamcomp"の他の可能な代替手段は"pnmpaste"ですが、これはピクセルのブリーディングの透明度処理がありません。ピースとの合成を使用することにより、小さなタイルを歪ませてから、後で大きな画像に再結合することが可能になるはずです。Pbmpusダイス(タイルトリミング)処理"pamdice"と"pamundice"、またはその他の代替手段を使用して、個別に処理できる小さな画像タイルを生成および結合できる可能性があります。ただし、これは「行ごとに複数の画像タイルがある問題」のために、ファイルを個別のディスクファイル(または名前付きパイプ)に保存する必要があります。これを行うスクリプトの例である"pam_diced_flip.pl"は、bugbearによって提供されており、より小さなタイルを使用して非常に大きなPbmPlus画像を「反転」または「回転」(90度のみ)できます。これは、通常、画像全体をメモリに読み込む必要があるものです。一時ファイルは多数使用しますが、メモリフットプリントは非常に小さいことに注意してください。

VIPSとNIP、巨大な画像TIFFハンドラー

ジェニー・ドレイク < jennydrake @ lineone.net > からの報告... また、「Vips」と「nip」の非IM代替案も検討するとよいでしょう。これはロンドンのナショナル・ポートレート・ギャラリーが開発したもので、低スペックのコンピュータで非常に大きな画像ファイル(一般的にはTIFF)を扱うように設計されています。「Vips」は基礎となるエンジンであり、「nip」はGUIです。Linux、Windows、そして時にはMacで動作します。

多数の画像の長いストリーム、ビデオシーケンス

画像のストリームも別の問題領域です。ここで問題となるのは画像のサイズではなく、関与する画像の純粋な数です。あまりに多いため、通常はすべての画像をメモリにロードしたり、通常の画像として個別にディスクに保存したりしたくありません。このような画像の最大の原因は、もちろんビデオ処理とアニメーションです。このような画像を処理する鍵となるのは、画像を単純に1つずつ連結して1つのファイルストリームにできるストリーミング画像ファイル形式です。上記でMIFF画像ストリーミングについて簡単に触れました。ImageMagick自身のMIFF形式と同様に、PbmPlus/NetPBMもストリーミング形式(ほとんど同じですがより単純)ですが、ビデオ画像ストリーム処理ではより広く知られ、一般的に使用されています。フォーラムのディスカッション、複数の画像の読み込みでは、あるユーザーが「ffmpeg」ビデオ処理プログラムによって生成された複数のPPM画像の「ストリーム」を処理したいと考えていました。Pbmplus画像(MIFF画像と同様に)は、単純に連結してマルチイメージストリームを生成できます。現時点では、IMではそのようなストリームから1つの画像だけを読み込み、処理してから、別の1つの画像を読み込むことはできません。すべてのIMコマンドは常にストリーム全体を読み込み、その後閉じます。これはIMv7スクリプト処理の一部として修正されています。解決策の1つは、PPM画像のストリームを受け取り、各画像が到着するたびに個別の「magick」コマンドを実行する小さなPerlスクリプト「process_ppm_pipeline」です。出力も一連のPPM画像であり、新しい画像のストリームを生成します。たとえば、ビデオを読み込み、すべてのフレームを1つずつ「反転」します...

  ffmpeg input.mpg -f image2pipe -vcodec ppm | pnmtopnm -plain |
    process_ppm_pipeline -flip |
      ffmpeg -f image2pipe -vcodec jpeg output.mpg
pnmtopnm -plain」は不可欠です。スクリプトは現在、ASCII-PPM画像のストリームのみを処理しますが、もう少し賢くすれば、任意のバイナリ(raw)Pbmplus画像ストリームや、MIFF画像ストリームも処理できるようになる可能性があります。このようなツールは、大量の巨大な画像の複数のストリーム(列)の処理にも使用できるかもしれません。ただし、これには、関連するコマンドの内部処理に関するより詳細な知識が必要になる可能性があります。このような画像をタイルストリームに分割し、最後に巨大な画像を再構成する方法が見つかれば。最終的には、ストリームを閉じずにマルチイメージファイルストリームから1つの画像だけを読み込んで返すようにコーダーに要求できるメカニズムを含めたいと考えています。これにより、IMは画像を1つずつストリームで処理できるようになります。更新:IMv7はストリームから一度に1つの画像を読み込むことができます。ループを使用するか、パイプライン化されたコマンドを使用すると、ストリーミング画像フィルターを生成できるはずです。さらに実験が必要です。