Edited at

ImageMagickの使用例 -- 基本

More than 1 year has passed since last update.

原文:ImageMagick v6 Examples -- Basic Usage


ここでは、IMがたどるコマンドライン処理、いくつかの新しい画像処理能力、アイディア、哲学、方法論、および内部的には実際何が起こっているのかについて、詳細に説明します。

この背景知識があるとページを割いた残りの例がより明確になります。アプリケーションプログラムインターフェース(API)しか使わないにしても、このセクションは学び理解する価値が十分にあります。


ImageMagickコマンドライン処理


なぜコマンドラインスタイルは変わったのか! もとい前バージョンIMに伴う問題

ImageMagickの以前のメジャーバージョン(バージョン5.5.7以前)において、IMライブラリのコマンドラインインターフェースは操作が実行された順序に関係した問題をよくおこしていました。それはとても出鱈目でなにが起こっているのか理解しようとする人を混乱させてきました。また、一度動作したものが次の時には同じ順序でも動作しない可能性があり、IMの開発者として、人々が期待するようなインターフェースの動作になるよう戦い続けてきました。

問題の原因はImageMagickがかなり標準的なUNIXのコマンドラインスタイルを追従していたことでした、、、

command [options] input_image output_image

時が経つにつれ、画像が他の画像に関与しつつ行われる膨大な数の操作を伴う複雑なオブジェクトである場合に、このことが問題を生むようになりました。

結果として上記コマンドはこんなふうに拡張されました。

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

これは上手くいったのでバージョン5.5.7の基本的なスタイルになりました。

"-negate"や"-resize"、"-crop"といった様々な画像操作は、適用対象となる画像の前にも後ろにも登場させることが可能でした。

例えば、バージョン5.5.7において以下の2コマンドは等しく有効で同じ動きをしました。

convert  -negate  image.gif   output.gif

convert image.gif -negate output.gif

問題は、2つの画像処理操作を扱う場合でした。例えば、

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

IM v5.5.7での結果は、まず2つの入力画像が回転して、それから結合して、こんな画像を生成しました、、、

alt

つまり、おそらくユーザーの意図通りではなく、"-rotate"演算子が"-append"の前に適用されてしまっています。

ImageMagickバージョン6においては、演算子はいつもユーザーによって与えられたコマンドラインの順番で適用されます。

先の例をIMv6で実行した場合、まず2つの画像が合体して、それから回転します、こんなふうに、、、

alt

もしがユーザーが合体前の回転を実際にやりたいのであれば、IMv6に対して明示的に順番を指示することができます。

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

この種の微調整は以前のIMバージョンを超えていて、おそらくパイプラインやアーカイブ用の中間ファイル保存を要求していました。

残念ながら、問題の解決は抜本的な対策と非互換性を要求しました。一方、IMバージョン5で動作した’単純な’コマンドすべてにおいてはIMバージョン6で期待するように動くでしょう。

バージョン6以前のバージョンでのコマンドライン使用方法は本質的にはっきりしませんでしたし、多くの奇妙で予想だにしない結果を生み出していたため、私の考えではあれは故障でした。


IMv6コマンドシンタックス

最低1つの画像が読み込まれるか作られるかする前に'操作'は与えられるべきではないことに注意してください。実際、あなたは'画像読み込み/作成'を操作と同じものとして考える傾向があるかもしれない。

これはIMv6シンタックスがこんな風に単純化できることを意味している、、、

command { [-setting]... "image"|-operation }... "output_image"

画像を要求された通り正確な順番で処理するため、あなたがやりたいかもしくは必要な、できるだけ多くの'読み込み'または'操作'が{...}の部分で繰り返されます。


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

下記の要約は現在ではImageMagick WebsiteThe Anatomy of the Command Lineからでも入手可能です。

すべてのコマンドラインオプションは2つの基本的なグループに分類されます:'設定系'と'画像操作系'です。設定系は値をセットして、操作系は実際に処理を実行します。


設定オプション

設定オプションとは、他の'画像演算子'によって後で使用される情報を保存するだけのコマンドラインオプションです。つまりこれは後で使用されるための値を設定すること以外に何かをすることはありません。オプションの多くには'-'と'+'両方のスタイルがあります。後者は通常、設定を取り消すためか、状態を初期化するために使用されます。これは設定の効果を迅速かつ簡単に取り除かせてくれます。

例えば、"+gravity"はgravity設定を初期の'gravity none'状態に戻します。(訳注:gravity設定を使うと画像の位置を大雑把に指定できます。)設定はさらにいくつかのサブカテゴリに分けることができます、、、

演算子設定は後に続くの演算子の機能を制御します。これらは演算子が使用する色やフォントを設定したり、画像やテキストの配置を制御したり、ソース画像から色を検索したり、もっと複雑な演算子で処理の方法を制御したり、などなど、いろいろとやってます。

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

大半の設定オプションはこのカテゴリに入ります。

入力設定は生成されるか読み込まれるかする画像生成の制御に特に限定されます。典型的なところでこれらは、設定が定義された後で生成される画像に関係づけられる特定のメタデータの割り当てや上書きに使用されます。

これらは生成されるか外部ファイルから読み込まれます。

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

これらは画像が生成されるか読み込まれるかしたときだけに適用されて、そうでなければ完全に無視されます。

特別な演算子"-set"は、メモリに読み込まれるか、何らかの処理がされた後の画像のメタデータを変更するために提供されてきました。詳しくはMeta-Dataを参照してください。

出力設定はディスクに対して画像の書き込みまたは保存が行われている間だけ使用されます。

これらがコマンドライン上のどこへでも与えられるとは言え、初期設定である最終画像ファイル名引数演算子(訳注:コマンドラインの最後に書いたファイル名が出力ファイルになるといういつものあれ)か、もしくは"-write"か"-identify"演算子を介して画像が書き出されるときのみ適用されます。

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

設定も取り消し('+'フォームを使用すること)もされていない場合、適切な初期値が使用されます。通常この初期値は最後に読み込まれた画像から保存した値です。

ファイル形式が要求している場合、"-background"の現在値のような二三の'操作設定'もまた画像に割り当てられます。

制御&デバッグ設定は一般的にどのようにIMがタスクを処理するかを制御します。こういうものが含まれます、、、

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

これら特別な設定について、詳しくはIM Operation Controlsを参照してください。


画像演算子

画像演算子は何らかの方法で画像を修正するコマンドライン引数です。これらは発見されるとすぐに実行されます。そしてコマンドラインの前で与えられた他の'設定オプション'を使用するかもしれません。

これらの演算子は二三のサブカテゴリにグループ化することができます。

画像生成演算子はファイルやパイプラインから画像を読み込むか、新しい画像を生成するかします。こういうものがあります、、、

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

'演算子'として、コマンド上で見つかるとすぐにこれらも実行されます。これらは単にメモリの中で新しい画像を追加するだけですが、事前に読み込んだものに触れることはありません。

当然、演算子なので、事前に定義された'設定'は適用されます。特にファイルやファイルストリームからの入力を制御するのに使われる入力設定がそうです。例えば、"-size"はあなたが作りたい画像サイズのヒントになりますし、"-delay"と"-page"は画像メタデータの定義または上書きをします。

単純な画像処理演算子はすでにメモリに読み込まれたすべての画像を修正します。各々の画像はあらゆる他の画像に別々に修正されます。演算子にはこういうものがあります、、、

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

それとたぶん私が忘れているその他多くの演算子があるはず! (それかもう書き加え済みか)

なぜならばすべての画像演算子はコマンドライン上で発見されるとすぐに処理されるので、これらは必ず、処理される予定でメモリに読み込まれ済みの画像の後に、与えなくてはなりません。

2つ以上の画像が存在する場合、すべての画像が一つずつ順番に処理されます。そういうことなので現在の画像リストの内容について注意するようにしてください。

これらのうちいくつかの演算子は複数の画像を生成できることに注意してください。例えば"-crop"は複数画像の'タイル'を生成できますし、"-separate"は画像をチャンネル分解することができます。そのようにしてメモリ上の画像はもっと増える羽目になるかもしれない。しかしこれらすべては入力において一度に一つの画像をとるだけです。

多くのAPIは、与えられた画像リストのはじめにあるものだけに等価な演算子を適用するだけであることに注意してください。すなわちこれら演算子は画像の一つ一つを調べたりはしないかもしれません。でも"convert"と他のCLI(command line interface)コマンドは現在の画像リストから順番に一つ一つ演算子を適用します。

複数画像リスト演算子は、これらが現在の画像リスト全体を一つの実体として修正するという点において特別です。これらはリスト全体を一つの合成画像で置き換えるか、前後で見つかった他の画像に従って画像を各々修正することができました。これらはアルファチャンネル(訳注:色データとは別の補助データのこと。一般的には不透明度を表現する。)や、アニメーション処理、カラーチャンネル処理などで使用されます。

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

リスト全体は一つの実体としてみなされることを思い出してください。いくつかの画像は取り除かれるか、置き換えられるかもしれません。上の演算子の大半は与えられた複数の画像を最終的な一つの画像にすべてマージします。

Layers Compositeメソッドは、全く新しい画像リストを形成するためのマージを行う前に、現在の画像リストを完璧に2つに分かれた画像リストに分割する、今のところ唯一の演算子です。現在の画像リストのどこかにある特別な'null:'画像を探すことによってリストの分割を行います。

これら演算子のどれも"mogrify"コマンドの中で使うことはできません。このコマンドは(最後に与えられた)入力画像のリストを独立した一画像として処理するためです。

画像スタック演算子はメモリ上の画像リストを順序付ける効果があります。特にこれらは'on the side'という特別な画像処理を提供します。これらは多くの点で前述の複数画像リスト演算子と似ていますが、これら自体が実際に画像修正をおこなうわけではなく、メモリ上での配置方法だけを修正します。

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

コマンドラインシェルインターフェース(CLI)によって特別な意味が与えられるのを防ぐため、括弧はバックスラッシュかクオートを必要とするかも知れないことに注意してください。

これら演算子のどれも"mogrify"コマンドの中で使うことはできません。このコマンドは(最後に与えられた)入力画像のリストを独立した一画像として処理するためです。

その他の特別な演算子は、(上と比べると)普通ではないか標準的ではない方法で事を成す演算子です。

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

"-geometry"演算子は、何らかの方法ですべての画像に影響を与えるというより、画像リストの(最後の)1画像のみに影響を与える唯一の演算子という意味で、特別なものです。これは下位互換性と特別なアルファチャンネル要件に対してのみ提供されます。詳しくはGeometry, resize just the last imageを参照してください。

他の2つ"-version"と"-list"は情報生成演算子で、要求された情報を返した後、IMを明示的に終了させます。これらオプションの詳細についてはIM Special Controlsを参照してください。

いくつかのオプションはコマンド全体を複数回実行しさえもします。基本的にこれらは、風変わりで珍しい方法で特別に扱われます。

通常これらは、特別な状況か、特定のグローバル情報を回復させるため以外では、使用されません。

現在のIMの動作方法にとって極めて重要であるため、設定と演算子へのオプションの分割が明確であることを私は望みます。

ImageMagickバージョン6において思い出してほしいことは、、、

'設定'は後で使うため何らかの方法で保存され、'演算子'はすぐに画像へ適用される。

これこそがバージョン6を以前のどのバージョンとも違うものにしています。すべてのオプションは'設定'か'演算子'かに定義され、いつ、どの画像に、オプションが適用されるか、順番は厳密に決定します。

どれが'設定'でどれが'演算子'であるかを識別するには、IM Examples Options Referenceが使えます。


実際に動作するIMコマンドの例

さあここに使用例があります。IMバージョン6ではどのように処理されるのかみてみましょう。

 convert  eye.gif news.gif -append    storm.gif tree.gif \

-background skyblue +append result.gif

これを分解して、IMv6がしていることをみてみましょう。

引数
動作
画像

convert
画像リストの初期化と生成をします。

eye.gif
画像を読み込んで画像リストの最後に追加します。
1

news.gif
2番目の画像をリストに追加します。
2

-append
リスト中のすべての画像を垂直につなげます。すべての画像は1つの画像に置き換えられます。
1

storm.gif
別の画像をリストに追加します。
2

tree.gif
そしてもう一つ。
3

-background skyblue
後で使う背景色を設定します。画像は変更されません。
3

+append
3画像すべてを水平につなげます。背景色は空空間になります。
1

result.gif
最終引数なので、これとともに明示的な-write演算子が実行されます。リスト中の1つの画像が与えられたファイル名と画像フォーマットで書き出されます。
書き出し

ImageMagickバージョン6のコマンド処理は、ご覧のとおり、非常にまっすぐ進みまして、かつ論理的で、結果を予測可能なものとしています。そしてそれこそがポイントなのです。

(続きはそのうち書きます)