ImageMagick 使用例 -- 画像ファイルの扱い
- 読み込み修飾子
- 入力ファイル名のメタ文字の扱い
- GZip 圧縮画像
- 保存される属性
- 暗号化画像
- 複数画像の書き出し (adjoin)
- 開始シーケンス番号 (シーン番号)
-
特殊な出力ファイルフォーマット (IM 固有)
miff:info:null:txt:sparse-color:histogram:mpr:mpc:fd:inline:clipboard:-- Windows のクリップボードへ/から読み書きephemeral:-- 読み込み後に自動削除show:,win:,x:-- 画像を直接表示x:(入力として) -- ディスプレイのキャプチャと再描画 画像フォーマットのデリゲートとコーダー - 出力デリゲートの例
- デリゲートとソースファイルの一覧表示
- デリゲートでの印刷
- 外部コマンドのスポーン
- PostScript と PDF のデリゲート
- デリゲートによる直接フォーマット変換 (taint)
-
本当に巨大な画像の扱い 大量の画像の長いストリーム、ビデオシーケンス 画像を処理するには、画像に対して働く操作子が必要なだけでなく、できるだけ多くの異なるファイルフォーマットで画像を読み込み、書き出す方法も必要になります。このセクションでは IM のファイルフォーマット全般を見ていきます。
画像フォーマットの概要
ImageMagick の最も一般的な用途のひとつは、画像をまったく変更せずに、ある画像フォーマットから別の画像フォーマットへ変換するだけというものです。実際、IM がそもそも作られた本来の理由が、この種の画像フォーマット変換でした。これが IM の主要コマンドが「magick」と呼ばれる所以です。この目的のため、ImageMagick は目もくらむほど多種多様な画像・ファイルフォーマットを扱えます。さらにこの多様な配列に加え、組み込みのテスト画像、単純な画像生成、そしてシェルスクリプトやプログラムを書くための画像フォーマットといった、多数の特殊な入出力フォーマットも揃っています。完全な一覧については、IM ウェブサイトの IM 画像フォーマットのページ を参照してください。これらすべては、ImageMagick の新しいユーザーにとっては気が遠くなるかもしれません。私の最善の助言は、ほとんどのファイルフォーマットは無視することです。おそらく一生使わないでしょう。代わりに、やりたいことに集中し、それを実際にやってみることです。やり方が分からなければ、これらのページやウェブ全体で例を探してみてください。IM Examples で扱っている画像フォーマットについては、リファレンス索引、ファイルフォーマット を参照してください。
画像の読み込み
IM はデフォルトで、ファイル自身の中にある 'magic'(マジック)ファイル識別コードによって画像フォーマットの種類を判別しようとします。しかしこれに失敗した場合は、ファイルの接尾辞(サフィックス)を用いるか、接頭辞(プレフィックス)としてフォーマットを付加して、画像のファイルフォーマットを指定する必要があります。フォーマットによってはファイルをまったく読み込まず、与えられたファイル名を無視するものもあります。次に挙げるのは、一般的な組み込み画像のいくつかです...
logo: granite: rose:
これらの一部は、ファイル名として与えられた引数や、最終的な画像サイズを制御する追加の「[-size](https://imagemagick.org/command-line-options/#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 を指定することで「World Wide Web」上で公開されている画像をダウンロードすることもできます。これは基本的に 'http:' 画像コーダーを提供しており、だからこそ動作するのです。 |
magick http://www.ict.griffith.edu.au/anthony/images/anthony_castle.gif \
-resize 100x100 castle_logo.png
![[IM Output]](../static/img/files/castle_logo.png)
ご覧のとおり、このコマンドは WWW から画像を読み込み、リサイズした上で、最終的に結果をディスクに保存します。 | 接頭辞としてファイルフォーマットが与えられた場合、ファイル名の一部として与えられた接尾辞はファイルの読み込み方法に何ら影響しません。これは実際、「[text:](text.html#text)」と「[txt:](#txt)」のフォーマット処理の違いのように、一部のファイルフォーマットを読み込む際には極めて重要です。もちろん、画像ジェネレーターが特殊な処理のために実際に画像ファイルを読み込む場合(例えば「[tile:](canvas.html#tile)」)には、直前の例でそうであったように、接尾辞(または接頭辞)のファイルフォーマットが再び重要になります。
---|---
特殊なコーダー接頭辞「implicit::」を使うと、コーダーの利用を一切「無効化」して、ファイル名の中で ':' を使えるようにできます。ファイル名には、'*' や '?' のような特殊な「ファイルメタ文字」を埋め込むことができます。IM はこれらの文字を展開して読み込むファイル名のリストを生成するため、外部のシェルにこれをやらせる必要がなくなり、コマンドラインの長さ制限の問題も回避できます。例えば...
magick montage '*.jpg' -geometry 50x50+2+2 image_index.gif
これは、カレントディレクトリ内のすべての JPEG ファイルを一枚のモンタージュ索引画像として生成します。ただし、ImageMagick ではなく私の UNIX シェルがファイル名を展開してしまわないよう、引数をクォートで囲む必要があった点に注意してください。より完全な「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]](../static/img/files/read_stdin.gif)
画像ファイルフォーマットの中には、複数の画像ファイルを単純に連結して、ひとつの長いマルチイメージストリームにできるものがあります。こうしたフォーマットには、単純な 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]](../static/img/files/read_multiple_stdin.gif)
ファイル名の先頭にある特殊文字 '@' は、そのファイル名を指定ファイルの内容で置き換えることを意味します。つまり、ファイルのリストを含むファイルを読み込めるのです! |
echo "eye.gif news.gif storm.gif" > filelist.txt
magick @filelist.txt -frame 5x5+2+2 +append filelist.gif
![[IM Output]](../static/img/files/filelist.gif)
'@' は特殊なファイル名 '-' と組み合わせて、標準入力からファイル名を読み込むこともできます。 |
echo "eye.gif news.gif storm.gif" |\
magick @- -frame 5x5+2+2 +append filelist_stdin.gif
![[IM Output]](../static/img/files/filelist_stdin.gif)
| '@' 構文を使ってファイルからファイル名のリストを読み込む機能は IM v6.5.2-1 で追加されました。
---|---
| セキュリティ上の予防措置として、これは実際の画像ファイルに対してのみ動作します。「rose:」や「label:string」のような画像ジェネレーターでは動作しません。また、ファイルからコマンドラインオプションを「インクルード」する用途にも使えません。
---|---
読み込み修飾子または Extract 設定
画像は、メモリに読み込まれた直後、実際に現在の画像シーケンスへ追加される前に修正できます。「[-extract](https://imagemagick.org/command-line-options/#extract)」設定を指定できます。例えば、ここでは rose 画像を切り抜いてみます... |
magick -extract 32x32+20+5 rose: +repage rose_extract.gif
![[IM Output]](../static/img/files/rose_extract.gif)
あるいは、角括弧 '[...]' を使って、ファイル名の末尾に読み込み修飾子を付加することもできます。例えば... |
magick 'rose:[32x32+20+5]' +repage rose_read_modifier.gif
![[IM Output]](../static/img/files/rose_read_modifier.gif)
ただし '[]' の文字は通常、シェルの特殊なメタ文字でもあるため、これらを使う場合は、UNIX シェルが解釈してしまわないよう、追加の修飾子をクォートで囲むのが良いでしょう。「[-extract](https://imagemagick.org/command-line-options/#extract)」設定と読み込み修飾子は同じ仕事をしますが、後者が前者を上書きします。また、修飾子を使うときは、'*' や '?' のような特殊なファイル展開メタ文字の処理は IM に任せなければなりません。なぜなら、修飾子のせいで UNIX シェルは要求されたファイルを「見つけられない」からです。その場合に実際に何が起こるかはシェル依存です。そのため、読み込み修飾子を使うときはファイル名全体をクォートで囲むべきです。これらの読み込み修飾子の本来の目的は、画像をまだメモリに読み込んでいる最中に、不要な画像を取り除いたり画像を小さくしたりすることで、必要なメモリ量を抑えることです。例えば、大きな JPEG 画像のディレクトリ全体を読み込むようなときです。以下が、すべての特殊な読み込み修飾子(および「[-extract](https://imagemagick.org/command-line-options/#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]](../static/img/files/enlarged_dots.gif)
注意してください。この読み込み修飾子は現在、'!'(アスペクト比を保持しない)や '>'(大きい画像のみ縮小する)といったリサイズフラグをまったく使いません。(おそらく要望を出せば対応してもらえるかもしれません)。これは、単色のキャンバスのサイズを指定する別の方法としても使えます。実際に起きているのは、デフォルトの 1 ピクセル画像をリサイズしているということです。例えば... |
magick 'canvas:DodgerBlue[50x50]' canvas_size.gif
![[IM Output]](../static/img/files/canvas_size.gif)
この修飾子は、非常に非常に大きな画像を大量に読み込もうとするときに最も重要です。各画像は次の画像が読み込まれる前にリサイズされるため、それらの画像を扱うのに必要な総メモリ量を大幅に節約できます。例えば、次の代わりに...
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](https://imagemagick.org/command-line-options/#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](basics.html#stream)」コマンドを調べ、さらなる処理のために画像を「magick」コマンドへパイプすることをお勧めします。後述の 巨大画像の扱い を参照してください。
画像が「gzip」されている場合、IM は画像フォーマットを判別してデコードしようとする前に、それを一時ファイルへ自動的に展開(解凍)します。そのため、画像を gzip 圧縮形式で保存できるだけでなく、後続の IM 処理でそれらを直接使うこともできます。テキストベースの大きな画像では、これによって膨大なディスク容量の節約になり得ます。 | PNG フォーマットは、そのフォーマット仕様の一部として「gzip」圧縮を含んでいます。この場合、2 桁の PNG「[-quality](https://imagemagick.org/command-line-options/#quality)」設定の最初の桁が圧縮レベルを定義します。詳細は PNG 画像ファイルフォーマット の例を参照してください。
---|---
以上は、ImageMagick へ画像を読み込む際に利用できる特殊な入力オプションの短い要約にすぎません。完全な要約は ImageMagick ウェブサイト の コマンドラインの解剖学 のページにあります。
先に示したように、画像入力は、画像生成のための「[-size](https://imagemagick.org/command-line-options/#size)」や、JPEG 読み込みのための「[-define](https://imagemagick.org/command-line-options/#define) jpeg:size=??」といった一部の IM 設定によって修正できます。他のオプションも画像入力の生成に影響します。これには「[-page](https://imagemagick.org/command-line-options/#page)」「[-type](https://imagemagick.org/command-line-options/#type)」「[-dispose](https://imagemagick.org/command-line-options/#dispose)」「[-delay](https://imagemagick.org/command-line-options/#delay)」が含まれます。画像メタデータの設定/変更 を参照してください。 | スクリプトの中でユーザーが提供した引数を IM へ渡すときは、その引数が期待どおりのものであることを確認し、十分に注意してください。例えば、ウェブの画像処理スクリプトがシステムのパスワードファイルの画像を返すようなことは避けたいでしょう。
---|---
入力ファイル名のメタ文字の扱い
作成中
シェルがメタ文字を処理する(その引数がクォートされていない限り)だけでなく、
IM もまた、ファイル名に対して独自のメタ文字処理を行います。
例えば
magick *.jpg ....
は、ファイル名を IM へ渡す前にシェルによって展開されますが、一方で
magick '*.jpg' ....
は、シェルが "*.jpg" を ImageMagick へ渡し、ImageMagick がそれを内部の
ファイル名リストへ展開します! これは Windows DOS サポートのために提供され、
また "magick mogrify" や "magick montage" のような、典型的に長い画像のリストを
処理するコマンドにおいて、コマンドライン長制限のオーバーフローを防ぐ手段として
提供されました。
そのため、ディスク上で実際に '*.jpg' という名前が付けられたファイルを IM に
読み込ませるには、次のいずれかの形式を使う必要があります...
magick '\*.jpg' ....
magick "\*.jpg" ....
magick "\\*.jpg" ....
magick \\\*.jpg ....
注意。2 行目は推奨されません。一部のシェル(bash ではない)や一部の API
(C プログラム、おそらく PHP)は、実際には単一のバックスラッシュを取り除き、
'*.jpg' を IM へ渡してしまうため、IM が再びそれを展開してしまうからです。
'?' と '*' に加えて、IM は読み込み修飾子の処理のために ':'、'%'、'[...]' の
メタ文字処理も追加しています。ただしこれらは、通常のシェル構文における
これらのメタ文字とは異なる意味(コーデック指定、シーン番号の挿入、読み込み
修飾子)を持ちます。
例えば DOS のユーザーは、ImageMagick へ渡すファイルパス内の「ドライブレター」を
エスケープする必要があります。例えば...
magick C\:\path\to\image.jpg ....
別の例は、タイムコードを含む画像を読み込むときです。例えば...
magick "time_10\:30.jpg" ....
は、ディスクからファイル名 "time_10:30.jpg" を読み込みます。バックスラッシュが
ないと、IM はその画像が存在しない画像ファイルフォーマット(またはデリゲート)
"time_10:" で読み込まれるべきだと思い込み、予期しない形で失敗するかもしれません。
代替手段として、クエスチョンマークを使うこともできます...
magick "time_10?30.jpg" ...
ただし、これは "time_10_30.jpg" のような別のファイルにもマッチしてしまうかも
しれません!
画像の圧縮
作成中
IM は、圧縮されたファイルも、適切な接尾辞または画像フォーマット指定が
与えられていれば読み込みます。
つまり、"image.gif.gz" として保存された画像は、まず展開(解凍)されてから、
GIF 画像フォーマットからデコードされます。
Gzip 圧縮された XPixmap (xpm) や NetPbm/PbmPlus (ppm) の画像も、ImageMagick と
フォーマットの通常のデリゲートライブラリの両方によって、自動的に処理されます。
そのため、これらの圧縮された形式を、IM でも、あるいはこれらのファイルフォーマットを
理解する他のプログラムでも、直接使うことができます。
後述の [圧縮画像の保存](#save_gzip) を参照してください。
画像の保存
画像を処理するのは結構なことですが、結果を正しい方法で保存することも同じくらい重要です。「magick」「magick montage」「magick composite」の最後の引数は、画像の最終的な書き出し(デフォルトの画像出力)のためのファイル名と画像フォーマットを定義します。ただし、「[-write](https://imagemagick.org/command-line-options/#write)」を使って画像シーケンスの途中で画像を保存することもできます(後述)。画像(複数の場合もある)をどのファイルフォーマットで保存したいかを指定するには、これらの例のほぼすべてで私が使っているようにファイル名の接尾辞を使うか、ファイル名に「{format}:」という文字列を接頭辞として付けるかのどちらかができます。例えば... |
magick tree.gif GIF:tree_image
結果として得られた画像を確認すると、ファイル名自体に「.gif」という接尾辞がないにもかかわらず、実際に GIF 画像ファイルが作成されていることが分かります。フォーマットの大文字小文字は区別されないので、小文字でも大文字でも使えます。この画像フォーマット指定は、コマンドの標準出力に画像を保存したいとき(「-」というファイル名を使うとき)に特に重要になります。この特殊なファイル名には接尾辞がないため、どのフォーマットを使うか ImageMagick に_必ず_伝えなければなりません。伝えなければ、画像は元の画像が由来したフォーマット(分かっていれば)にデフォルトで設定されます。例えば、ここでは「-」を使って IM のピクセル列挙を標準出力に出力し、画面に書き出します。
magick tree.gif -resize 1x3\! txt:-
これは、一時ファイルに保存することなく、シェルの「パイプライン」を通じて画像を「magick identify」のような別のコマンドへ渡すためにも使われます。
magick tree.gif -resize 200% miff:- | identify -
この場合、特殊なファイル名「-」は、「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]](../static/img/files/rose_70x46.png)
これは、組み込みの rose 画像を、その画像のサイズ(ピクセル)を含むファイルへ保存します。具体的には、ファイル名「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]'
これは、「eye.gif」のような各画像を拡大し、カレントディレクトリのファイル「eye_magnify.gif」に保存します。ただし、3 枚の画像すべてがメモリに読み込まれ、ひとつのコマンドで修正されます。これは、多数の大きな画像や非常に大量の画像にとっては推奨される解決策ではありません。メモリ制限に達してディスクスワッピング(スラッシング)に陥る可能性があるためです。この場合「[+adjoin](https://imagemagick.org/command-line-options/#adjoin)」は、IM が最初の画像のファイル名だけを使ってすべての画像をマルチイメージ GIF アニメーションへ保存してしまうのを防ぐために不可欠である点に注意してください。また、「%e」エスケープシーケンスを使ってファイル名の元の接尾辞を確実に保持しました。通常、ファイル名設定に接尾辞を含めるのは悪い考えです。エスケープシーケンス由来の場合、出力ファイルフォーマットを判定する際に IM はそれを見ないからです。ただしこの場合はフォーマットが変わらないので問題ありません。注意が必要です。画像の元のファイル名を正確に取得するには、'%d/%f' または '%d/%t.%e' を使ってください。'%e' の代わりに '%m' を使うこともできます。これは、IM が元の画像ファイルの中で見つけた実際のフォーマット(大文字)であり、元の画像のファイル名接尾辞と一致しないこともあります。組み込み画像については、これらのエスケープシーケンス文字列の多くが空である点に注意してください。また、ディレクトリがない場合は '%d も空になります。これは IMv7 の既知の問題です。'ファイル名エスケープシーケンス' を使う別の例は タイルクロップ画像 にあります。そこでは、結果として得られる各画像について、計算したタイル位置に基づくファイル名を生成するためにこの手法が使われています。Mogrify の代わりに Convert を使う の例も参照してください。
自動的な GZip 接尾辞
IM は「.gz」接尾辞が与えられると、画像を自動的に「gzip」もします。例えば、ここでは組み込みの「rose:」画像を、「gzip」された非圧縮の GIF ファイルとして保存します。GIF の通常の LZW 圧縮をオフにしています。それがあると「gzip」圧縮が最良の圧縮を達成するのを妨げてしまうからです。 |
magick rose: -compress none rose.gif.gz
ブラウザが gzip された画像をどう扱うかは、ウェブサーバーが返すファイルタイプと、ブラウザが圧縮画像をどう処理したかによります。このため、上記の画像を直接表示しませんでした。'art' アイコンをクリックして、このウェブサーバーからのそうした画像に対して、あなたのブラウザが何をするか見てみてください。これのサイズを、通常の LZW 圧縮で保存された GIF 画像と比較してみましょう... |
magick rose: rose.gif
![[IM Output]](../static/img/files/rose.gif)
「gzip」された rose は
バイトのサイズで、通常の LZW 圧縮の rose は
バイトです。ご覧のとおり、GZIP 圧縮は実際、GIF フォーマットが使う LZW 圧縮よりもわずかに優れているので、アーカイブ目的にはより良いかもしれません。GZip 圧縮された画像ファイルは、デフォルトでは圧縮を持たない画像ファイルフォーマットの長期保存により一般的に使われます。これには IM のファイルフォーマット「MIFF:」や、より単純な NetPBM 画像ファイルフォーマットが含まれます。
保存される属性
作成中
画像の書き出しに固有の、その他の設定....
-depth -quality -compress -type -loop
-set label -set comment
[画像の深度](basics.html#depth)、
[画像のタイプ](basics.html#type)、
[JPEG 品質](formats.html#jpg_write)、
[PNG 品質](formats.html#png_quality)、
[GIF ループ](anim_basics.html#loop) も参照してください。
様々な画像フォーマットの一部であるファイル圧縮について述べる。
異なる画像フォーマットには異なる圧縮が使われる。
特に JPEG から TIFF への圧縮変更が必要な点。
"[-compress](https://imagemagick.org/command-line-options/#compress)
None" や "[-compress](https://imagemagick.org/command-line-options/#compress)" の NetPBM テキスト/バイナリ形式の選択を使うこと。
GIF 圧縮と著作権特許について。
IM を使って -quality を下げるか、フォーマットを別のものに変えること以外では、
-compression オプションが使われることはまれである。多くの場合、画像が読み込まれたときと
同じ圧縮を使って画像を保存するために、IM が内部的に使うだけである。
暗号化画像
IM では、オプション「[-encipher](https://imagemagick.org/command-line-options/#encipher)」と「[-decipher](https://imagemagick.org/command-line-options/#decipher)」を使って、機密性の高い画像をパスフレーズで暗号化して保存することもできます。画像の暗号化 を参照してください。
複数画像の書き出し - Adjoin 技法
画像を保存する際の大きな問題は、ImageMagick が一度に 1 枚の画像ではなく、順序付けられた画像のシーケンス(リスト)を扱うことです。このため、IM は与えられたファイル名に、現在の画像シーケンス内のすべての画像を書き出そうとします。ファイルフォーマットが複数画像を許容する場合、IM はデフォルトで現在の画像シーケンス内のすべての画像をその画像ファイルへ保存します。例えば、GIF アニメーションの基礎 の例ページを見ると、複数の画像フレームを単一の画像ファイルフォーマットへ保存してアニメーションを生成していることが分かります。出力フォーマットが複数画像を 1 つのファイルへ保存できない場合は、IM は代わりに複数のファイルを生成します。例えば、JPEG や PNG などの画像フォーマットへ保存するときです。GIF や PS のように複数画像をファイルごとに許容する画像フォーマットでも、「[+adjoin](https://imagemagick.org/command-line-options/#adjoin)」出力ファイル処理設定を使えば、この動作を強制できます。
magick eye.gif news.gif storm.gif +adjoin image.gif
上で生成された 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 のデフォルトのダッシュではなくアンダースコアを使って、画像「image_0.gif」から「image_2.gif」を生成しました。 | _10 進数のために '%d' を使えるだけでなく、16 進数(小文字)のために '%x'、16 進数(大文字)のために '%X'、8 進数のために '%o' を使うこともできます。
_
---|---
| _これらの文字のいずれかが後に続くパーセント文字を本当に使いたい場合は、その意味をエスケープするためにパーセント文字を二重にする必要があります。つまり、実際にパーセント記号を生成するには '%%' を使う必要があります。
---|---
| _出力ファイル名の '%d' は、実際には ImageMagick の「[+adjoin](https://imagemagick.org/command-line-options/#adjoin)」設定を自動的に有効にします。
ただし上記では「[+adjoin](https://imagemagick.org/command-line-options/#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 システムの man ページで 'printf' を調べてみてください)、「%03d」のように使えば、画像シーケンスのフレーム番号が常に 3 桁の番号(先頭ゼロ付き)になることをおそらく知っているでしょう。その場合、画像名は「images_000.gif」「images_001.gif」のようになります。
magick eye.gif news.gif storm.gif +adjoin image_%03d.gif
この方法を使うと、画像に番号が付くだけでなく、アルファベット順でも正しく並ぶので、画像ファイルの取り扱いが格段に楽になります。そこで私は、複数の画像を別々の画像ファイルとして書き出す予定があるときは常に、出力ファイル名に '%03d'(または適切なもの)を追加することをお勧めします。
書き出されるシーン番号
画像シーケンスを '0' ではなく '1' から始めたいが、結果のすべての画像ファイルの名前を付け替えたくない場合、最も単純な解決策は、書き出すシーケンスの先頭に「捨て駒」画像を 1 枚追加することです。
magick null: eye.gif news.gif storm.gif +adjoin image_%01d_of_3.gif
rm image_0_of_3.gif
もちろん、画像処理の後にこれを行うために「[+insert](https://imagemagick.org/command-line-options/#insert)」を使うこともできます。これは特に美しい解決策ではありませんが、機能し、単純で、IM の古いメジャーバージョンとも後方互換性があります。IM バージョン 6.2 以降では、「[-scene](https://imagemagick.org/command-line-options/#scene)」設定を使って、現在の画像シーケンスの開始番号を設定できます。
magick eye.gif news.gif storm.gif +adjoin -scene 101 image_%03d.gif
これは画像ファイル「image_101.gif」から「image_103.gif」を生成しました。
画像を複数回書き出す
画像の書き出しの話題に関連して、特殊な「[-write](https://imagemagick.org/command-line-options/#write)」画像操作子を使って、一連の画像操作の途中で画像を書き出すことが可能です。これは、画像処理の様々な時点で画像を複数回出力したいときに非常に便利です。例えば、デバッグを伴う複雑な画像処理 を参照してください。以下は、Kodak Lossless True Color Image Suite(画像 23)提供の いくつかのオウムの写真 を、ひとつのコマンドで様々なサイズに保存したいという例です...
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
ご覧のとおり、画像リスト操作子 を使って画像の 'クローン' を処理し、結果を書き出してから、それを削除して元のソース画像へ戻り、必要な回数だけこのプロセスを繰り返すことができます。この具体的なケースでは、同じ画像を何度も繰り返しリサイズすることがなくなり、したがってリサイズ誤差が蓄積するのを避けられたということです。また、問題なく小さい画像を先に生成してから大きい画像を後で生成することもできましたし、生成する各画像ファイルごとに多くの異なる方法で画像を修正することもできました。つまり、各画像の順序や修正は無関係なのです! 「[+clone](https://imagemagick.org/command-line-options/#clone)」は実際には画像データを複製しない点に注意してください。IM は参照カウント方式のクローン処理を使っており、画像ピクセルが更新されたときにのみピクセルをコピーします。そのため、上記の処理では、元の画像と生成される新しい画像を保持するのに十分なメモリだけが実際に使われます。また、これによって「[+clone](https://imagemagick.org/command-line-options/#clone)」は非常に高速で、メモリ効率も良くなっています。
以下は、同じことを行う別の技法ですが、「[-clone](https://imagemagick.org/command-line-options/#clone)」の代わりに「[MPR:](#mpr)」(後述)を使って、元の画像を名前付きの画像レジスタに保存します。
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
ここでは、書き出した後もメモリ上にある画像を修正する前に、元の画像のコピーを 1 つ「mpr:scroll」画像レジスタに保存します。MPR レジスタは実際には画像のシーケンス全体を保持できる点に注意してください。その操作の結果が書き出されてメモリから削除されると、元の画像(または画像シーケンス)が復元され、必要な回数だけプロセスが繰り返されます。もちろん前述のとおり、最終的な画像に対しては「[-write](https://imagemagick.org/command-line-options/#write)」を使う必要はありません。通常どおり出力すればよいだけです。もし「[-write](https://imagemagick.org/command-line-options/#write)」を使ったのなら、代わりに別の特殊なファイルフォーマット「[NULL:](#null)」(後述)を使って最終的な画像を捨てることができます。「[-write](https://imagemagick.org/command-line-options/#write)」についての注意。一部のファイルフォーマットは書き出しのために画像が特殊な形式である必要があるため、「[-write](https://imagemagick.org/command-line-options/#write)」操作子は画像を修正してしまう可能性があります。例えば GIF 画像は減色されるかもしれません(量子化とディザリング を参照)。しかし他のフォーマットは、ソース画像をそのままにします(後述の MIFF と MPC を参照)。これらの変更から身を守る必要がある場合(後で単に画像を削除するのではないため)は、「[+write](https://imagemagick.org/command-line-options/#write)」を使えます。これは書き出しのために画像の内部クローンを作成し、その後それを削除します。ただし、これは書き出し用に修正されたコピーの画像を保持するために、メモリ使用量が倍増する可能性がある点を覚えておいてください。少なくとも一瞬の間は。
特殊なファイルフォーマット (IM 固有)
上で見たように(そして次のセクション 一般的な画像ファイルフォーマット で探求するように)、ImageMagick は膨大な数のよく知られた画像ファイルフォーマットを理解します。また、かなりの数の特殊な画像ジェネレーター(キャンバスの作成 で例示)も含まれています。これらに加えて、画像のとても特殊な扱いを可能にする、いくつかのとても特殊なファイルフォーマットもあります。
-
miff: -
は ImageMagick ファイルフォーマットです。画像シーケンス全体と、画像に関連付けられた_すべての_属性が、このファイルフォーマットに保存されます。もちろん ImageMagick コマンドだけがこのフォーマットを読み込むので、異なる画像処理パッケージ間での転送には適していません。「
miff:」ファイルフォーマットの主な目的は、画像を長く複雑な方法で処理する際の中間保存フォーマットとしてです。また、画像メタデータやその他の関連属性を渡しながら、ある IM コマンドから別のコマンドへ画像を「パイプライン」で渡すのにも適しています。「miff:」を書き出すときは、「[+depth](https://imagemagick.org/command-line-options/#depth)」オプションを含めることをお勧めします。これは画像の「入力深度」を IM のメモリ品質にリセットし、中間画像の保存に可能な限り最良の品質を使えるようにします。もちろん「-depth 8」を使って保存画像の深度を「切り詰める」ことで、ディスク上の画像サイズを減らすこともできますが、それは(HDRI 浮動小数点保存 も有効にしていない限り)量子化丸め の効果も強制してしまいます。このフォーマットを解析することに関心がある方へ。これはすべての画像属性のプレーンテキストヘッダーで始まります。ヘッダーは、単一の改ページ(フォームフィード)文字を含む行で終わります。このヘッダー自体は、様々な画像処理スクリプトで基本的な画像情報を抽出するのに便利な方法です。例えば、ここでは GNU sed コマンドを使って、改ページ区切りまでの「miff:」ヘッダーを一覧表示し、組み込みの「rose:」画像のすべての属性を表示します。magick rose: miff:- | sed -n '/^\f$/q; p'
これは実際にとても便利で、IM が画像について知っている現在のすべての設定フラグとメタデータを明らかにします。ただし統計情報もあり、これらは「magick identify」コマンド、「[-identify](https://imagemagick.org/command-line-options/#identify)」操作子、または特殊な「info:」フォーマットのいずれかによって生成されます(「[-verbose](https://imagemagick.org/command-line-options/#verbose)」オプションで要求した場合)(次を参照)。この画像ファイルフォーマットは解析の要件が非常に低く、圧縮されてはいませんが、IM が知っているあらゆる種類の画像を扱えます。これは、一時画像やパイプラインで使う画像コマンドに使うのにほぼ最も理想的なフォーマットです。ただし、ImageMagick のプログラムだけがそれを読み込めます。後述の「[MPR](#mpr)」画像メモリレジスタや、「[MPC](#mpc)」メモリディスクマッピングフォーマットも参照してください。 | _生のイメージデータ(バイナリ)は、実際には 4 文字のシーケンス "\n\f\n:"(改ページが単独で 1 行にあり、その後にコロン)で前置きされています。このデータをどう読むべきかはヘッダーデータにエンコードされていますが、典型的には 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
上記の具体例は、スクリプト「show_colors 」にプログラムされており、これを使って画像処理に用いる色を検索し、見つけ、表示できます。上記は、マルチイメージシーケンスを生成するのにとても便利な「ストリーミング画像のパイプライン」の一例です。この手法の他の例には、層状画像のプログラムによる位置決め、地図上のピン、名前による色 の 'Named Colors Image'、そして ランダムなさざ波 で示されているようなアニメーションがあります。この手法は、「-write miff:-」のような操作と組み合わせて、単一のコマンドの複数の場所から miff フォーマット画像を出力するのにも使えます。各画像は最終的な出力ストリームの中で自動的に互いに連結されます。これは複雑な画像処理コマンドのデバッグに特に便利です。代替手段(PHP スクリプトで一般的に使われる)は、'生成コマンド' 手法を使うことです。これは、実行する長い「magick」コマンドを生成するシェルスクリプトを使います。画像ワーピングアニメーション のスクリプトはこの手法を使っています。
-
info: -
「
info:」ファイルフォーマット(IM v6.2.4 で追加)は、実際の画像を_出力しません_! このフォーマットは基本的に、ImageMagick の「magick identify」コマンドが出力するのと同じ情報を出力します。「magick identify」と同様、この出力フォーマットは「[-format](https://imagemagick.org/command-line-options/#format)」と「[-verbose](https://imagemagick.org/command-line-options/#verbose)」オプションで制御され、画像プロパティエスケープ のページで定義されているとおり、関心のある特定の情報だけを出力できます。例えば、上で行ったように MIFF 画像を「magick identify」へパイプする(画像の保存 を参照)代わりに、結果として得られる画像フォーマットの 1 行の識別情報を取得するために、次のように使えたはずです。magick granite: info:-
もちろん、「[-format](https://imagemagick.org/command-line-options/#format)」設定を使って、望む情報を特定の、より解析しやすい形で出力できます。「info:」の何が便利かというと、画像を生成しながら、同時にそれに関する追加情報を抽出できるようになることです。これは、「[-write](https://imagemagick.org/command-line-options/#write)」操作子を使ってこの特殊な画像フォーマットをファイル(またはコマンドの通常の標準出力)に保存することで行われます。 | |
magick rose: -shave 12x0 -repage 64x64+9+9 \
-format '%wx%h %g' -write info:info_paged.txt paged.gif
画像識別情報を標準出力へ出力する「[-write](https://imagemagick.org/command-line-options/#write) info:」と同等の「[-identify](https://imagemagick.org/command-line-options/#identify)」操作子もあります。これにより、IM コマンドのデバッグ時に画像に何が起きているかを監視するのがさらに簡単になります。例えば... | |
magick logo: -identify \
-trim -identify \
+repage -identify \
-resize 80x80\! -identify \
logo_thumbnail.gif
ここで、「[-trim](https://imagemagick.org/command-line-options/#trim)」が画像のサイズを縮小しつつ、画像のどの部分がトリミングされたかという 'クロップ' 情報を保持し、その後「[+repage](https://imagemagick.org/command-line-options/#repage)」がその余分な 'キャンバス' または 'ページ' 情報を取り除いている様子が分かります。などなど。また「magick identify」コマンドと同様に、「[info:](#info)」と「[-identify](https://imagemagick.org/command-line-options/#identify)」の両方は、「[-verbose](https://imagemagick.org/command-line-options/#verbose)」設定がオンになっているとずっと冗長になります。ここでは、長い出力を最初の数行だけに限定して、それがどんなものか少しでも分かるようにします。
magick rose: -verbose info: | head
| _「[-verbose](https://imagemagick.org/command-line-options/#verbose)」設定は、(「info:」フォーマットを除いて)読み込まれたり書き出されたりする画像に関する追加情報も標準エラーへ出力させます。また、「[-colors](https://imagemagick.org/command-line-options/#colors)」のような一部の操作子に追加情報を出力させます。そのため、「[-identify](https://imagemagick.org/command-line-options/#identify)」または「info:」フォーマットで使った後は、再びオフにしたほうが良いかもしれません。
例えば 「-verbose -write info:image_info.txt +verbose」 _または 「-verbose -identify +verbose」 です。
---|---
| あらゆる形式の「[identify](basics.html#identify)」からの出力をスクリプトで読む場合は、大文字小文字を区別しない方法で行うべきです。これにより、異なるバージョンの ImageMagick 間でより良い後方互換性が確保されます。
---|---
注意。「info:」(および「[-identify](https://imagemagick.org/command-line-options/#identify)」)は出力フォーマットにすぎず、「[identify](basics.html#identify)」コマンドと同じ出力を生成します。「info:」ファイルフォーマットを使って画像を読み込んだり作成したりすることはできません。情報を出力するために「[-print](https://imagemagick.org/command-line-options/#print)」を使うこともできますが、これは画像シーケンス全体に対して一度だけ適用されます。つまり、この操作子を使って、複数の画像を含むはるかに複雑な '%[fx:...]' 式を計算できます。ただし、上記の他の方法とは異なり、すべての画像に対して一度だけ適用される点を覚えておいてください。
-
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]](../static/img/files/write_storm.gif)
これは、他のすべての画像を 1 枚ずつ削除しようとするよりもはるかに単純です。一方、入力画像フォーマットとしては、「null:」は、特殊な 'null source' フラグを持つ、単一の透明ピクセルからなる特殊なプレースホルダー画像を、現在の画像シーケンスに生成します。この特殊な画像は、モンタージュに隙間を残す ことや、複数画像の 層コンポジション におけるリスト区切りとして特に重要です。これは、「[-crop](https://imagemagick.org/command-line-options/#crop)」のような操作のために生成され得る、'ミスした画像' として知られる別の特殊な画像フォーマットと密接に関連しています。この画像フォーマットは、操作が空または意味をなさない結果を生んだときに生成されます。どちらの画像も単一の透明ピクセルなので、「null:」画像も 'ミスした画像' であるかのように扱われます。現時点では、現在の画像シーケンスから「null:」や 'ミスした画像' を取り除く方法はありません。ただし、そうした方法が提案されています。そうした方法が必要だと分かったら、私にメールしてください。
-
txt: -
これは単純な ASCII テキストファイルで、基本的に画像内の各ピクセルを 1 行に 1 つずつ列挙します。これは汎用のテキストから画像への変換器ではありません。それについては 複数行テキストファイルの例 を参照してください。'ピクセル列挙' が認識されない場合、画像はプレーンテキストファイルとしてレンダリングするために「
[text:](text.html#text)」フォーマットコーダーへ渡されます。例えば、ここでは「netscape:」画像を 2x2 ピクセルの画像にスケールしてから、「txt:」画像フォーマットを使って列挙します。magick netscape: -scale 2x2! txt_netscape.txt
画像の最初の行(ヘッダー)には、画像に関する基本情報が詰め込まれています。情報は次のもので構成されます... File Magic: 画像ヘッダーは、このファイルを特殊な IM テキスト画像フォーマット(例えば "ImageMagick pixel enumeration" ファイル)として定義します。これはコンピューティングの世界では、そのファイルの 'magic'、つまりこのファイルをこの特定のファイルフォーマットであると識別するコード文字列として知られています。Image Size: 次の 2 つの数値は、このファイルに含まれる画像のサイズを定義します。これらの数値を掛け合わせると、画像を完全に定義するためにヘッダーの後に続くはずの行数も分かります。IM は常にこの数の行を出力しますが、後で見るように、読み込む際にはすべてのピクセルを定義する必要は_ありません_。MaxValue: ヘッダーの最後の数値は、可能な画像データの '最大値' を定義します。上記の例では、これは '255' で、8 ビット深度を使った結果です。組み込みの「netscape:」画像をこの深度で出力したのは、それが内部的に 8 ビット値で定義されており、IM がこの深度レベルを画像に保持したためです。詳細については 深度設定 のセクションを参照してください。ただし、画像の「[-depth](https://imagemagick.org/command-line-options/#depth)」を変更することで、(IM の Q または コンパイル時の品質 設定の限界まで)深度設定を上書きできます。例えば、ここでは色値を 16 ビット値(0 から 65535)として出力します...
magick netscape: -scale 2x2\! -depth 16 txt_netscape_16.txt
| 現時点では、出力ファイルフォーマットで使う特定の '最大値' を設定することはできません。現在の「[-depth](https://imagemagick.org/command-line-options/#depth)」設定の観点で異なる値を定義できるだけで、最大値は 2^depth-1 に等しくなります。
---|---
Colorspace: ヘッダーの最後の項目は、続くデータの 色空間 を定義します。画像に何らかの透明度が含まれていた場合、最後の文字 'a'(アルファを表す)も色空間名に付加され、括弧で囲まれた数値の列が追加されます。グレースケール画像は画像を 'grey' として出力しますが、少なくとも 3 つの数値を定義し、それらは各ピクセルについて同じ値になります。例えば、ここではアルファチャンネルを追加した 'LAB' の 色空間 を使った同じ画像です!
magick netscape: -scale 2x2\! -colorspace LAB -alpha set txt_cspace_lab.txt
最初のヘッダーの後には、ピクセルデータ の行があり、画像内のピクセルごとに 1 行です。Coordinates: コロン ':' までの最初の 2 つの数値は、0 から始まるピクセル位置です。Color Values: この後、ピクセルの色値(0 からヘッダーで与えられた MaxValue まで)が括弧内に与えられ、画像の現在の色空間に応じて 3 つから 5 つの数値になります。スペースは省略可能なので、括弧内の数値を解析するときは注意が必要です。 |
値は通常は整数です。ただし IM v6.9.2-1 以降、特殊な define「[-define](https://imagemagick.org/command-line-options/#define) txt:compliance=css」が「[-depth](https://imagemagick.org/command-line-options/#depth) 16」とともに与えられると、値は '%' 記号付きのパーセント値として表現されます。これは SVG、CSS 準拠の一部です。 |
|---|---|
Color Comments: 括弧内の数値の後に続くものは何でも、コメントとみなされます。IM は、色引数として解析できるフォーマットを使って、ピクセルの色に関する追加情報を埋めます(これらの色指定の詳細については「[-fill](https://imagemagick.org/command-line-options/#fill)」のマニュアルエントリを参照してください)。ただし、色コメントは可変です。とはいえ、典型的にはハッシュ ('#') 16 進数の色値で始まり、その後、与えられたピクセルデータに応じて RGB() 値や色名を出力するかもしれません。これらの色名は ImageMagick によって理解されるはずですが、純粋にコメントであるため、参照としてのみ意図されています。どの色が提供されるかは、使っている IM のバージョンに大きく依存します。特に初期の IM v6 バージョンやそれ以前ではそうです。このコメント領域が将来再び変わらないという保証はないので、それに依存しないのが最善です。ピクセル列挙画像を読み込むときには 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
TXT 画像の読み込み も有効です。画像内のすべてのピクセルを定義する必要はありません。実際、ピクセルを正しい順序で並べる必要さえありません! ImageMagick は、各ピクセル定義行を順番に読み込み、それを空白の画像キャンバスに 'draw'(描画)するだけです。これには各行の括弧内の数値だけが使われ、色名は使われません。最初の空白キャンバスは、消去されて現在の背景色に設定されます。そのため、「txt:」画像によって提供されなかったピクセルは、この色のまま残されます。「txt:」画像の興味深い使い方については、順方向ピクセルマッピング を見てください。そこでは、列挙ピクセル画像を出力し、それから各ピクセル位置を変更して画像を回転(歪曲)させ、その後、列挙ピクセル画像を再び IM に読み込んでいます。結果として得られる画像では、一部のピクセル位置は定義されておらず、他の位置には複数のピクセルが追加されていました。IM はこれを問題なく処理しました。
「txt:」フォーマットは、「[-unique-colors](https://imagemagick.org/command-line-options/#unique-colors)」操作子とともに使うと特に便利です。この操作子は、現在の画像シーケンスの各画像を、見つかった固有の色ごとに 1 つのピクセルを含む新しい画像で置き換えます。これを「txt:」フォーマットファイルへ出力すると、画像に含まれる色の基本的な要約が得られます(ただし、それらのカウントやヒストグラムは得られません)。例えば、ここでは tree 画像で使われている色です。GIF は 8 ビットの数値しか使えないため、色も同じ 深度 で出力されます。 | |
magick tree.gif -unique-colors txt:-
IM の「txt:」フォーマットを使う別の代替手段として、様々な NetPBM 画像ファイルフォーマット を使うこともできます。IM はデフォルトでこのフォーマットをバイナリとして出力しますが、「[-compress](https://imagemagick.org/command-line-options/#compress)」をオフにすれば、NetPBM フォーマットの ASCII テキスト版を出力できます。例えば。
magick tree.gif -unique-colors -compress None -depth 8 tree_netpbm.ppm
上記の数値が、IM の列挙ピクセル(「txt:」)フォーマットの数値と一致していることに気づくかもしれません。IM が読み込むための NetPBM フォーマット画像を生成する例については、リサイズされたグラデーション を参照してください。特定のピクセルの色だけが欲しい場合は、画像を 1 ピクセルに切り抜いて、それを「txt:」画像として出力できます。
magick rose: -crop 1x1+12+26 txt:
あるいは、特殊な FX エスケープフォーマット を使って、IM で直接使える形で色を出力できます。
magick rose: -format '%[pixel:u.p{12,26}]' info:
画像の色の抽出 も参照してください。
-
sparse-color: -
これは特殊な出力画像フォーマットで、透明でない各ピクセルについて、座標と色の単純なカンマ区切りリストを返します。出力文字列は、スパースカラー操作子 への直接の入力に適しています。例えば、これは「
rose:」画像の中で純粋な赤に最も '近い' 数個のピクセルを見つけます。magick rose: -alpha set -fuzz 13% +transparent red sparse-color:
多くの点で、これは上で示した「[txt:](#txt)」フォーマットよりも便利ですが、関与するピクセルが数個だけの場合に限ります。ただし、執筆時点では出力がすべて 1 行である点に注意してください。シェルスクリプトでは、出力内のスペースを改行に変換したいかもしれません。
-
histogram: -
これは実際には「
[miff:](#miff)」画像フォーマットですが、画像内のすべての色の完全なカウントを含む非常に大きな画像コメントが付いています。つまり、「[miff:](#miff)」のテキストヘッダーの 'Comment={...}' 属性です。例えば、ここでは再び "tree" 画像に存在する色を一覧表示しますが、今回は各色のピクセルカウントを含めます。テキストヒストグラムコメントは、副次的な「[info:](#info)」フォーマットの magick identify を使って「histogram:」画像から抽出されます。 | |magick tree.gif -define histogram:unique-colors=true \ -format %c histogram:info:-
| 「info:」出力フォーマットは IM v6.2.4 で追加されました。これより前の IM バージョンでは次を使ってください.. |
magick tree.gif histogram:- | identify -format %c -
| そのフォーマットが、色値に関するコメントを含めて、前述の TXT、すなわち IM ピクセル列挙画像フォーマットとほぼ正確に同じであることに気づくでしょう。唯一の違いは、X,Y 位置がピクセル数のカウントで置き換えられていることです。 | このコメントは作成に非常に長い時間がかかることがあります。IM v6.6.1-5 以降、必要なければこのコメント生成をオフにする特殊な設定「[-define](https://imagemagick.org/command-line-options/#define) histogram:unique-colors=false」を追加できます。 |
|---|---|
画像自体は、256x200 ピクセルのサイズのヒストグラムグラフです。x 軸は色値(0-255)で、y 軸はピクセル数(ピクセル総数に正規化)です。各チャンネルのヒストグラムは、それが表す色で表示され、足し合わされます。したがって、赤と青が重なってマゼンタになります。言い換えれば、色チャンネルごとにそれ自身の別々のヒストグラムがあります。画像を他の何らかのフォーマットに変換したい場合は、単にそのフォーマットで保存してください。「histogram:」は特殊な画像処理フォーマットです。画像を変換し、それからファイル名の接尾辞やさらなる「_format_ :」コードで指定されたフォーマットで出力します。 |
magick rose: \
-define histogram:unique-colors=false \
histogram:histogram.gif
![[IM Output]](../static/img/files/histogram.gif)
非常に暗い画像は左に大きく偏り、明るい画像は右に大きく偏ります。中間調も同様に、中央に表されます。これをよりよく見るために、ここでは各色チャンネルのヒストグラムを分離します。また、ヒストグラムのテキストコメント(まだ存在する場合)を取り除き、表示用に画像をリサイズします。
magick histogram.gif -strip -resize 50% -separate histogram-%d.gif
---
上記の「rose:」画像については、赤がより広く分散しており、画像におけるその極めて重要な役割を示していることが分かります。一方、緑と青は左で突出しており、画像にほとんど影響を持たないことを示しています。画像の色よりもその明るさに関心がある場合は、「histogram:」画像を生成する前に画像をグレースケールに変換してください。 |
magick rose: -colorspace Gray \
-define histogram:unique-colors=false \
histogram:histogram_gray.gif
![[IM Output]](../static/img/files/histogram_gray.gif)
ご覧のとおり、グレースケール画像のヒストグラムは少し異なります。支配的な赤の色がより中間調の灰色になるにつれ、ヒストグラムの中央にスパイクを生み出します。また、画像内のオフホワイトの小さな領域が、今やグラフの右端に明確なスパイクを生み出しています。左端の完全に空の空間も、画像にまったく暗いパッチがないことを示しています。一方、元の画像のすべての色チャンネルを単純に分離して連結することで、より良い 'グローバル' ヒストグラムを生成できます。結果として得られるヒストグラムは、その値がどのチャンネル由来であるかにかかわらず、すべての色値を表現したものになります。 |
magick rose: -separate -append \
-define histogram:unique-colors=false \
histogram:histogram_values.gif
![[IM Output]](../static/img/files/histogram_values.gif)
残念ながら、「histogram:」は出力フォーマットなので、画像をさらに処理したい場合は、画像を別のコマンドへ 'パイプ' するか、ディスクに保存するか、特殊な「[mpr:](#mpr)」保存/読み込みを使う必要があります。後述の「[mpr:](#mpr)」の例を参照してください。ヒストグラム(や他のグラフ)を生成する何らかの方法が、特殊な出力フォーマットではなく操作子として利用できるようになると良いでしょう。
-
mpr:_{label}_ -
(Memory Program Register) は、画像シーケンス全体を名前付きのメモリレジスタに保存し、そこから後で画像データを読み込めるようにします。そのため、複雑な画像操作の中で後で使うために画像を保存したい場合に、そうできます。処理の最後に「
mpr:」へ書き込むのは無意味です。プログラムが終了するとプログラムメモリはシステムに返されるからです。そのため、別のプロセスで画像が必要な場合は、処理ステップの途中で Write 操作を使って画像をファイルに保存したいでしょう。「mpr:」に与える 'label ' は何でも好きなものにできます。これは画像がメモリのどこに保存されたかを示す単なるラベルです。スクリプトを書く人で名前を扱いたくない人のために、単純な数値でも構いませんが、名前を使うとスクリプトが追いやすくなるでしょう。画像を保存した後(下記参照)、同じ 'ラベル付き' のメモリ位置から、好きなだけ何度でも画像を再び読み込めます。例えば... |magick tree.gif -write mpr:tree +delete \ \ mpr:tree mpr:tree mpr:tree +append mpr.gif
![[IM Output]](../static/img/files/mpr.gif)
上記の画像処理における「[+delete](https://imagemagick.org/command-line-options/#delete)」の使い方に注目してください。上記では必要ありません(「mpr:tree」を 3 回ではなく 2 回再読み込みするだけ)が、画像を「mpr:」レジスタに保存した後、現在の画像シーケンスからすべての画像を Delete するのは非常に一般的です。基本的に、上記の 2 行は 2 つの完全に別々の「magick」コマンドと考えることができますが、中間画像にディスク容量ではなく名前付きのメモリレジスタを使っています。多くの点で「mpr:」を使うのは Clone や Duplicate(上記の例で使えたはずです)を使うのと似ていますが、「mpr:」を使えば、すべての画像を完全に取り除いて、他の作業のために現在の画像リストをクリアできます。この方法の最良の特徴は、画像入力に対してのみ機能する設定や操作も使えるようになることです。例えば、入力画像「[tile:](canvas.html#tile)」操作子とともに使って、画像をより大きな領域にタイル状に並べることができます。 |
magick tree.gif -flip -write mpr:tree +delete \
-size 64x64 tile:mpr:tree mpr_tile.gif
![[IM Output]](../static/img/files/mpr_tile.gif)
「mpr:」を使って、特殊な出力画像フォーマットフィルターの一部の出力を捕まえて、さらなる処理に回すこともできます。例えば、ここでは「[histogram:](#histogram)」からの出力画像を保存し、それを同じコマンドの中で読み戻して処理を続けます。 |
magick rose: -define histogram:unique-colors=false \
-write histogram:mpr:hgram +delete \
mpr:hgram -strip -resize 50% histogram_resized.gif
![[IM Output]](../static/img/files/histogram_resized.gif)
「mpr:」のインメモリ保存は実際、出力ファイルフォーマット「[histogram:](#histogram)」や入力ファイルフォーマット「[tile:](canvas.html#tile_memory)」のような特殊な I/O フィルターを通じて、すでにメモリ上にある画像を再利用できる唯一の方法です。「[-tile](https://imagemagick.org/command-line-options/#tile)」のように実際の入力画像を取る特殊なオプションや、別の画像をソースとして使う「[カラーマッピング](https://imagemagick.org/command-line-options/#map)」画像についても同じことが言えます。マルチイメージのカラーマップ を参照してください。注意。こうしたオプションは IMv7 では、画像をファイルから読み込む必要のないバージョンに置き換えられつつあります。また、これは、生成されたインメモリ画像を使って画像をオーバーレイするために -draw 'image' メソッドを使う唯一の方法でもありますが、これを行う他の手法はたくさんあります。「mpr:」画像は実際には 1 枚の画像だけでなく、画像シーケンス全体 を保存します。これは、後でさらなる処理のために再読み込みできるよう、現在の画像シーケンスのスナップショットを撮るようなものです。これにより例えば、実際に何枚の画像が関与しているか知る必要なく、アニメーションシーケンス全体のコピーを撮って複製やクローンを作れます。これを行う例については 層コンポジション を参照してください。「mpr:」に複数の画像がある場合、そのシーケンスから個々の画像を抽出することもできます! 「mpr:image'[2]'」を使うと、「-write mpr:image」で保存したマルチイメージシーケンスから 3 番目の画像を取り出せます。例えば、ここでは 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]](../static/img/files/mpr_extract.gif)
画像のクローン 操作子は、一般に未知の可変個数の画像を扱えません。実際、Clone 操作子が追加される前は、「mpr:」が、中間のディスクファイルを使わずにインメモリ画像を複製する唯一の利用可能な方法でした。 | IM v6.8.2 以降、リモートの IM キャッシュデーモンプロセスに画像を保存することもできます。これにより、ディスク容量を必要とせずに、別々に動作する IM コマンド間で画像(およびそのメタデータ)を渡せます。分散ピクセルキャッシュデーモン を参照してください。
---|---
-
mpc: - は、もともと本当に大きな画像を念頭に設計された、IM 固有の特殊なディスク保存フォーマットです。基本的には、プログラムメモリのメモリマップされたディスクファイルで、2 つ のバイナリファイルとしてディスクに保存されます。画像のメタデータを保持する「
.mpc」ファイルと、画像のピクセルキャッシュを保持する「.cache」ファイルです。
「MPC:」フォーマットは 1 枚の画像を保存するのに 2 つのファイルを作成します
そうしたファイルは、IM を再コンパイルまたはアップグレードした後では機能せず、特定のマシン用にコンパイルされた IM でのみ機能します。そのため、スクリプト化された画像処理で使う一時画像を保持するような、一時的な 'クイック読み込み' ファイルにのみ適しており、長期保存には適していません。例えば...
magick very_big_image.tif very_big_image.mpc
は、ディスクに 2 つのファイルを作成します。小さな「very_big_image.mpc」ファイルと、「very_big_image.cache」と呼ばれる特殊なメモリダンプファイルです。2 番目のファイルサイズは、生の非圧縮メモリダンプにすぎないため、他のどの画像ファイルフォーマットよりもおそらくはるかに大きくなります。しかし、このファイルは 'read in'(読み込み)や 'decode'(デコード)する必要がなく、コンピューターメモリに直接 'ページイン' して、何の処理オーバーヘッドもなく、そのままの形で使えます。必要なのは多くのディスク容量とディスク IO だけです。言い換えれば、読み込むのにディスクアクセス時間だけが必要で、ファイルフォーマットの処理は一切不要です。つまり、データのデコードが不要なのです。画像が 'メモリ準備済み' であるため、あらゆるサイズの一時画像に特に便利です。発行する次の IM コマンドで即座に使えるからです。ただし、2 つのファイルが生成され、それらは通常の画像ファイルサイズよりも大きくなることを覚えておいてください。なので、ディスク使用量とスクリプトのクリーンアップに注意してください。私自身の IM スクリプトは、この機能を大いに活用しています。例えば、スクリプト「de-pixelate」と「divide_vert」を参照してください。これらは画像処理操作のためにかなり多数の一時画像ファイルを活用しています。これは、同じ画像を何度も何度も繰り返し読み込める必要があるスクリプトや Mogrify アルファコンポジット に極めて便利です。IM は画像をデコードする必要も、それを保存するためだけに大量のメモリを使う必要もないからです。これはまた、非常に大きな画像を処理する場合にも非常に便利です。そこでは、実際の処理のために、画像のより小さな部分を抽出または Crop しなければなりません。ただし、ほとんどの画像操作は処理中に実際に画像のクローンコピーを作るので、新しいインメモリコピーがやはり作られるかもしれません。そのため、依然として多少の注意が必要です。より小さな画像サイズへの Crop または Resize が、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
base64 データには、復帰や改行のような任意の量の空白を含められる点に注意してください。それはフォーマットによって単純に無視されます。また、通常の ASCII 文字しか使いません。だからこそ、E メールやウェブページのためにバイナリデータをエンコードするのに使われるのです。これはまた、バイナリデータをプログラムやスクリプトの中で問題なく保存できるようにもします。例えば、画像をスクリプト自体に組み込んだ次のようなコマンドをシェルスクリプトの中に置けるので、別個の外部画像ソースが不要になります。 |
magick 'inline:data:image/gif;base64,
R0lGODlhIAAgAPIEAAAAAB6Q/76+vvXes////wAAAAAAAAAAACH5BAEAAAUALAAA
AAAgACAAAAOBWLrc/jDKCYG1NBcwegeaxHkeGD4j+Z1OWl4Yu6mAYAu1ebpwL/OE
YCDA0YWAQuJqRwsSeEyaRTUwTlxUqjUymmZpmeI3u62Mv+XWmUzBrpeit7YtB1/r
pTAefv942UcXVX9+MjNVfheGCl18i4ddjwwpPjEslFKDUWeRGj2fnw0JADs=
' b64_noseguy.gif
![[IM Output]](../static/img/files/b64_noseguy.gif)
これを使えば、画像をスクリプト(シェルまたは API)の中で使えることを覚えておいてください。別個の外部画像ファイルを持つ必要がなくなり、それ以外は単純なスクリプトのインストールがより複雑になるのを防げます。では、なぜ「[inline:](#inline)」はこのようなかなり複雑な形をしているのでしょうか? 基本的に、これは HTML ウェブページのインライン画像に使われるフォーマットだからです。例えば、次の例では、右側の画像が、別個の外部ファイルとしてではなく、次のような形式の 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 >
これはすべてのウェブブラウザで動作するわけではありません。例えば、IE7 以前では動作しませんが、IE8 では動作します。基本的に、最も現代的なウェブブラウザはこれを理解します。
同じ種類のインラインデータフォーマットは、E メールヘッダーの 'face' 画像や、おそらく他の多くのファイルタイプにも使われています。余談。ImageMagick の 'magic' 部分のおかげで、ほとんどの画像ファイルフォーマットでは、mime タイプ(長い文字列の '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]](../static/img/files/b64_folder.gif)
警告。コマンドラインオプションの入力は 5000 文字に制限されています。また、多くのシェル(特に PC-DOS の入力)には、コマンドライン長の総量制限があります。そのため、これは非常に大きな base64 画像には適していません。
-
clipboard: - Windows のクリップボードへ/から画像を読み書きします。(Windows のみ)。
-
ephemeral:{image_file} -
この画像ファイルを読み込んでから削除します。これは特殊な画像読み込みファイルフォーマットで、与えられた画像ファイルがメモリに読み込まれた後、IM にそのファイルを削除させます。読み込んだファイルが削除されたとき、メモリ内の画像はまだ処理も保存もされていない点に注意してください。これは非常に危険なので、細心の注意を払って使うべきです。これは主に デリゲートのスポーン で使われます。ここでは、バックグラウンドのデリゲートが入力画像を読み込み、データを得たらそれを削除します。これが今度は、フォアグラウンドの '親' プロセスに、提供された画像の読み込みを終えたので '子' が独自に処理を進める準備ができたことを通知します。メインプログラムはその後、クリーンアップして画像処理を別個に続けるか、場合によっては単に終了するかできます。「
show:」画像出力デリゲートは、「magick display」コマンドとともにこれを使って、メインコマンドが続行または終了する前に、画像の表示を自動的にバックグラウンド化します。(下記参照)。例えば、私はこれを、いくつかの中間結果を表示するために「[flicker_cmp](../static/img/scripts/flicker_cmp)」を呼ぶシェルスクリプトで使いましたが、与えられた 2 番目の画像を削除することで IM がプログラムの入力画像の読み込みを終えたと合図したときに、自動的に続行(または終了)します。そのフィードバックが必要だが、読み込まれる画像も保持する必要がある場合は、元の画像のコピー、ハードリンク、またはシンボリックリンクを作り、そのファイルを「ephemeral:」として渡してください。そうすれば、それが削除されたときに元の画像は保持されます。注意。現時点では、"animate" や "display" にアニメーションを終えたとき、または実際に画像を表示用に出したときに合図させる方法はありません。:-( ただし、「magick」に別個の「ephemeral:」画像を読み込ませて、画像処理の特定の時点に達したことを制御スクリプトに通知させることはできます。# 画像をぼかし、画面上の比較を表示してから、 # 自動削除して終了する。 magick rose: input_image.png magick input_image.png -blur 0x5 blurred.png flicker_cmp input_image.png ephemeral:blurred.png &
# 2 番目の画像が読み込まれて削除されるのを待つ! while [ -f blurred.png ]; do usleep 100; done
# この時点で、問題なく続行(または終了)できる。 # 画面表示はバックグラウンドで続いている。 rm -f input_image.png
私はこれを他のバックグラウンドプログラムでも、そのバックグラウンドプログラムが続行する準備ができたという合図として使いました。
-
show:,win:,x:-- 画像を画面に直接表示する -
これらは特殊な出力フォーマットで、画像の結果を画面に直接表示します。画像をファイルに保存する代わりに、結果を表示するだけです。これは、IM コマンドが何の結果になるかをすばやくテストするのに非常に便利で、この目的に強くお勧めします。ただし、これらは「
[display](basics.html#display)」コマンドと「[animate](basics.html#animate)」コマンドの、ごく単純なバージョンにすぎません。例えば、ディレクトリ内の画像のすばやい要約を得るには...magick montage *.jpg show:
2 枚の画像の間で異なる領域を見るには...
magick compare image1.png image2.png show:
ここに挙げたフォーマットはすべて、実際にはそのタスクを実行するために「[display](basics.html#display)」プログラムを呼び出します。ただし、それぞれが異なる方法で仕事を処理します。例えば 'show:' は、別個の「[display](basics.html#display)」プログラムを実行するために スポーニングデリゲート を使います。これは、画像が表示されると元のコマンドが処理を続ける(典型的には終了する。ただし「-write show:」を使う場合を除く)ことを意味します。一方、'x:' または 'win:' を使うと、元のコマンドが続行(および終了)できるようになる前に、表示ウィンドウを終了するのを待ちます。残念ながら、これらの方法はどれもアニメーションをあまりうまく表示しません。それには、アニメーション(MIFF フォーマット)を「[animate](basics.html#animate)」コマンドへパイプするほうが良いでしょう。
-
x:(入力として) - X ウィンドウディスプレイの読み込み -
「
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 Window ID" を使って IM に正確に欲しいウィンドウを伝えることです。これは、X ディスプレイが特定のウィンドウ(または子ウィンドウ)を一意に識別するのに使う番号です。X Window ID は典型的には「xwininfo」コマンドを使って調べますが、「xdotool」や「xwit」のような他のプログラム、そして「xprop」のような他のツールも、ウィンドウに関する情報を見つけるのに使えます。例えば、ウィンドウのクラス、名前、タイトル、そのサイズと配置、子ウィンドウ、ウィンドウマネージャーの装飾といったものです。例えば、タイトルや名前に "Mozilla Firefox" を含むすべてのウィンドウを見つけるには...
xwininfo -root -all | grep "Mozilla Firefox"
それから、上記の出力から欲しいウィンドウの X Window 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
"
ほとんどのターミナルプログラムは、テキストを表示するために使っている X Window ID を環境変数 "WINDOWID" で教えてくれます。そのため、これを XTerm や Gnome Terminal のコマンドラインから実行すると、現在のターミナルウィンドウのコピーを取得できます。
magick x:$WINDOWID this_terminal.png
さて、ちょっとした遊びを... ここでは、現在のターミナルの内容を取得し、そこに何か描き込み、それから「[display](basics.html#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 -
上記の最初のコマンドは "XTerm" ウィンドウ向けに設計されています。これは、表示先のウィンドウが、提供された "WINDOWID" の子ウィンドウであることを必要とします。2 行目は、"Gnome-Terminal" ウィンドウの場合のように 'child'(子)ウィンドウが見つからなければ、"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" ウィンドウで上記を繰り返したときに何が起きたかを示す 'スクリーンキャプチャ' です...
ただし、ターミナルの内容は変更されますが、それは一時的なものにすぎない点に注意してください。アイコン化したり、覆い隠したり、デスクトップ画面を切り替えたりしてから、ターミナルに戻ると、ターミナルプログラムがウィンドウを再描画して、あなた自身の 'drawing'(描画)を消し去るので、変更は失われます。上記は "Gnome-Terminal" では "XTerm" ほどうまく機能しません。前者はスクロールするたびにウィンドウを 're-draw'(再描画)したがるのに対し、"XTerm" はそうしないからです。より大きなクライアントプログラムの一部として、グラフや他のものの結果を様々なウィンドウに直接表示する IM スクリプトを想像してみてください。これは実際、多くの PostScript ビューアや、多くのウェブブラウザでさえ、特殊なサブプログラムからの出力を表示する方法です。つまり、そのサブプログラムに引き継がせて、提供されたサブウィンドウに直接描画させるのです。実験して、思いついたことを、E メールか IM ユーザーフォーラム を通じて、私(や他の人々)に知らせてください。
画像フォーマットのコーダーとデリゲート
コーダー は、画像入出力の "format:" の側面を扱う動的ライブラリモジュール(通常は C プログラミング言語で書かれます)です。これらは、ユーザーが特殊用途のフィルターを作成するためにも使えます。それらは、しばしば 'デリゲートライブラリ' と呼ばれる追加の外部ライブラリのインストールを必要とすることがあります。それらは必要なときにのみ動的モジュールとして読み込まれます。つまり、コーダーが使う関連ライブラリは、実際にそのコーダーを利用したい場合を除いて、インストールされている必要はありません。これらの例では、コーダーを書くのに必要な C プログラミングには立ち入りませんが、ソースの中に、独自のコーダーモジュールを作成するのに使えるコーダーの例があります。
デリゲート は、IM が異なるフォーマット間で変換できることを知っている、単なるコマンドです。これにより、IM は、ある画像ファイルフォーマットを扱うのにより複雑なバイナリコーダーを必要とする代わりに、その 'より単純な' 事前に書かれたコマンドを使えます。どのデリゲートが利用可能かのリストを得るには、特殊なコマンドを使ってください...
magick -list delegate
IM が利用する最もよく知られた 'デリゲート' プログラムは「ghostscript」です。これにより、IM は、非常に複雑な PostScript および PDF フォーマットのベクター画像を読み込み、IM が読み込める他の何らかのラスター画像ファイルフォーマットに変換できます。しかし 'デリゲートコマンド ' は、ユーザーにとっても非常に便利です。IM を拡張して、特殊な種類の画像を扱えるようにしたり、それらの画像を読み書きする代替手段を提供したりできるからです。'コマンド' 自体は「delegates.xml」という名前のファイルに列挙されており、これは IM のシステム設定ディレクトリにあります。ただし、IM はユーザーの個人用の、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>
これは完全な 'デリゲート' 設定ファイルですが、実際のデリゲートは真ん中の行だけです。これはとても単純なもので、IM に、'.flip' 接尾辞または 'flip:' フォーマット接頭辞のどちらかを持つ画像を見つけたら、上記のコマンドを呼び出して 'flip' フォーマット画像を読み込むよう伝えます。例えば.. |
magick flip:tree.gif delegate_tree_flip.gif
![[IM Output]](../static/img/files/delegate_tree_flip.gif)
この場合、デリゲートコマンドが行うのは、元の IM コマンドが画像を読み込んで処理する前に、別個の IM「magick」コマンドを使って画像を上下反転させることだけです! デリゲートは、コマンドが与えられた画像ファイルフォーマットを理解し、IM 自身が理解して処理できる任意の画像ファイルフォーマット(この場合は MIFF 画像ファイルフォーマット)を返すことを前提とします。デリゲートの '%i' と '%o' の部分は、デリゲートが使うべき入力ファイル名と出力ファイル名として提供される一時ファイル名を表します。これらのファイル名は IM によって生成され、一時ディレクトリに置かれます。これらの一時ファイル名には画像の接尾辞が一切付かないので、必要なら、望む画像フォーマットの種類を接頭辞として付けることが重要です。これはセキュリティ上の理由でこのように行われており、また IM 自身がデータのストリームを読んでいるだけで、実際のファイルを読んでいない場合があるためです。これはまた、デリゲートコマンドが、終了時にそれらのファイルのクリーンアップのようなことを扱う必要がないことも意味します。中間一時ファイル用の 2 番目の一時ファイル名、画像密度、サイズなどのための、他の '%' 置換もあります。これらのエスケープや他のデリゲートオプションについての詳細は、IM がインストールする 'システム' の「delegate.xml」ファイルの先頭のコメントに記載されています。さて、これはかなり馬鹿げた些細な例に見えるかもしれませんが、基本的には、副次的なコマンドを使って、任意のデータファイルを IM が理解する任意の画像に変換できることを意味します。IM はその後、画像の接尾辞やフォーマット接頭辞が与えられれば、すべての詳細を覚えておく必要なく、そのデータタイプを自動的に扱う方法を知ることになります。この種のデリゲートはすでに多数システムファイルに追加されているので、一見の価値があります。 | _セキュリティ上の理由から、個人用の「delegates.xml」ファイル内のデリゲートは、システムにインストールされた「delegates.xml」ファイルで定義されたデリゲートを上書きしません。ホームディレクトリの ".magick/delegates.xml" には、新しい固有のデリゲートフォーマットを追加できるだけで、後から重複したデリゲートは無視されます。
もちろん、入力フォーマットが内部的にすでに分かっている場合は、当然システムデリゲートは参照されません。
また、いつものように、すべてのユーザー(特にウェブユーザー)の入力をサニタイズしてください。ユーザーに、あなたの知らないうちにデリゲートを利用させたくないでしょうから。
_
---|---
例えば IM v6.4.2-6 以降、システムデリゲートファイルに「autotrace:' デリゲートが追加されました。これは、任意の入力画像を読み込む際に「[AutoTrace](http://autotrace.sourceforge.net/)」コマンドを実行します。IM は入力画像を、デリゲートプログラムが必要とする PNG 画像フォーマットに変換し、それをデリゲートに通し、その後、結果として得られる SVG を(典型的には外部の RSVG ライブラリ経由で)読み込んで、元の入力ビットマップ画像の滑らかなエッジのバージョンを生成します。ラスターからベクターへの変換器の例 を参照してください。変換器が複数の画像ファイル(PNG など)を生成する場合は、IM が 1 つの出力ファイルから複数の画像を読み込めるよう、それらの別々の画像をすべて MIFF のような単一のマルチイメージフォーマットにマージする必要があります。IM は、画像を読み込むために複数のデリゲートプログラムを連鎖させることもあります。例えば 'HTML' ページを画像として読み込むには、まずデリゲート「html2ps」を呼び出してそれを PostScript に変換します。それから、特殊な「ghostscript」プログラムデリゲートを使って、生成された PostScript ファイルを複数画像のセットに変換します。もちろん、このように 2 つ以上のデリゲートを使うと、デリゲートプログラムに存在するかもしれない複雑な相互作用、誤ったインストール、バグのために、別の問題を生じることがあります。しかし、一般的にはうまく機能し、ImageMagick を魔法のようにしている要素の鍵です。
出力デリゲートの例
IM が直接理解しない特定の画像ファイルフォーマットへ保存するときにも、同様のことが行われます。例えば、このデリゲートを個人用の「.magick/delegates.xml」ファイルに追加することで、IM に '.xyzzy' 画像ファイルを作成する方法を伝えられます。
<delegate decode="gif" encode="xyzzy" command='mv "%i" "%o"'/>
![[IM Text]](../static/img/files/write_stdout.txt.gif)
![[IM Text]](../static/img/files/write_identify.txt.gif)
![[IM Output]](../static/img/files/eye_magnify.gif)
![[IM Output]](../static/img/files/news_magnify.gif)
![[IM Output]](../static/img/files/storm_magnify.gif)
![[IM Output]](../static/img/files/image-0.gif)
![[IM Output]](../static/img/files/image-1.gif)
![[IM Output]](../static/img/files/image-2.gif)
![[IM Output]](../static/img/files/image_0.gif)
![[IM Output]](../static/img/files/image_1.gif)
![[IM Output]](../static/img/files/image_2.gif)
![[IM Output]](../static/img/files/image_000.gif)
![[IM Output]](../static/img/files/image_001.gif)
![[IM Output]](../static/img/files/image_002.gif)
![[IM Output]](../static/img/files/image_1_of_3.gif)
![[IM Output]](../static/img/files/image_2_of_3.gif)
![[IM Output]](../static/img/files/image_3_of_3.gif)
![[IM Output]](../static/img/files/image_101.gif)
![[IM Output]](../static/img/files/image_102.gif)
![[IM Output]](../static/img/files/image_103.gif)
![[IM Output]](../static/img/files/parrots_lrg.jpg)
![[IM Output]](../static/img/files/parrots_big.jpg)
![[IM Output]](../static/img/files/parrots_med.jpg)
![[IM Output]](../static/img/files/parrots_sml.jpg)
![[IM Output]](../static/img/files/scroll_lrg.jpg)
![[IM Output]](../static/img/files/scroll_big.jpg)
![[IM Output]](../static/img/files/scroll_med.jpg)
![[IM Output]](../static/img/files/scroll_sml.jpg)
![[IM Text]](../static/img/files/write_miff_info.txt.gif)
![[IM Text]](../static/img/files/color_table.png)
![[IM Text]](../static/img/files/info_image.txt.gif)
![[IM Output]](../static/img/files/paged.gif)
![[IM Text]](../static/img/files/info_paged.txt.gif)
![[IM Text]](../static/img/files/info_verbose.txt.gif)
![[IM Text]](../static/img/files/txt_netscape.txt.gif)
![[IM Text]](../static/img/files/txt_netscape_16.txt.gif)
![[IM Text]](../static/img/files/txt_cspace_lab.txt.gif)
![[IM Text]](../static/img/files/txt_shell_read.txt.gif)
![[IM Output]](../static/img/images/tree.gif)
![[IM Text]](../static/img/files/tree_colors.txt.gif)
![[IM Text]](../static/img/files/tree_netpbm.ppm.gif)
![[IM Text]](../static/img/files/rose_one.txt.gif)
![[IM Text]](../static/img/files/rose_sparse.txt.gif)
![[IM Text]](../static/img/files/tree_histogram.txt.gif)
![[IM Output]](../static/img/files/histogram-0.gif)
![[IM Output]](../static/img/files/histogram-1.gif)
![[IM Output]](../static/img/files/histogram-2.gif)
![[IM Text]](../static/img/files/b64_image.txt.gif)
![[snapshot]](../static/img/img_diagrams/xterm_darken.png)