ImageMagick バージョン 7 • ハイダイナミックレンジイメージング • 画素チャンネル • アルファ • グレースケール • マスク • MagickCore API • ヘッダーファイル • 削除された非推奨機能 • コマンドラインインターフェイス • 性能改善 • バージョン 7 変更点まとめ
ImageMagick の設計は進化的なプロセスであり、設計と実装の取り組みが互いに影響し合い、さらなる進歩を導きます。ImageMagick バージョン 7 では、バージョン 6 の実装から学んだ教訓に基づいて設計を改善しました。ImageMagick はもともと RGB 画像を X Windows サーバーに表示するために設計されました。時とともに RGBA 画像、さらに CMYK・CMYKA 画像形式へとサポートを拡張しました。ImageMagick バージョン 7 では、任意の数の画素チャンネルを持つ任意のカラースペースへサポートを拡張します。加えて、ImageMagick 7 は画素チャンネルを浮動小数点として格納し、帯域外の値(例: 負の値)を許容し、丸め誤差を削減します。本文で説明するとおり、ほかにも多数の設計強化があります。
MagickCore API で可変画素チャンネルをサポートするため、画素チャンネルの取得・設定時の画素処理が変更されました。チャンネルには配列 pixel[i] としてアクセスするか、GetPixelRed() や SetPixelRed() のようなアクセサメソッドを使えます。MagickCore と MagickWand API にはわずかな変更があります。Magick++ と PerlMagick API は変更されておらず、ImageMagick バージョン 6 のものと一致します。
ImageMagick バージョン 7 のシェル API(コマンドライン)は大幅に見直され、特に、コマンドラインだけでなくスクリプトやファイルストリームからも「オプション」を読み込める能力に重点が置かれました。これにより、「コプロセッシング」プログラミング技法の使用や、「デーモン/サーバーバックエンド」を使った画像処理、さらにはマルチマシン分散処理が可能になります。
シェル API の見直しに伴い、ほかにも改善が加えられました。どのオプションが失敗したかのより良い報告、オプションの統合と非推奨化、オプション引数における「画像プロパティ」(より一般には「パーセントエスケープ」として知られる)のよりグローバルな使用などです。
ImageMagick バージョン 7 は現在 プロダクション リリースとして利用可能です。
ImageMagick バージョン 7 がリリースされた今も、最低 10 年間はバージョン 6 をサポートし続けます。バージョン 6 のサポートは主にバグ修正とセキュリティパッチに限られ、機能強化はわずかです。
ハイダイナミックレンジイメージング
ImageMagick バージョン 7 はデフォルトで ハイダイナミックレンジイメージング(HDRI)を有効にします。HDRI は、最も明るい直射日光から最も深く暗い影まで、実際のシーンに見られる広い範囲の強度レベルを正確に表現します。加えて、画像処理の結果がより正確になります。欠点は、より多くのメモリを必要とし、処理時間が遅くなる可能性があることです。バージョン 6 のコマンドラインの結果がバージョン 7 で異なる場合、それはおそらく HDRI が原因です。画素を 0 〜 QuantumRange の範囲に制約するためにコマンドラインへ -clamp を追加する必要があるか、ImageMagick バージョン 7 のビルド時に HDRI を無効にする必要があるかもしれません。HDRI を無効にするには(iOS のようなスマートフォンビルドや性能が重視されるプロダクションサイトで推奨)、ImageMagick のビルド時に configure スクリプトのコマンドラインへ単純に --disable-hdri を追加します。
画素チャンネル
画素は 1 つ以上の色値、すなわちチャンネル(例: 赤の画素チャンネル)から構成されます。
以前のバージョンの ImageMagick(4-6)は 4〜5 個の画素チャンネル(RGBA または CMYKA)をサポートします。最初の 4 チャンネルは PixelPacket データ構造でアクセスされます。この構造には、赤・緑・青・不透明度(opacity)の Quantum 型(通常 16 ビット)のメンバー 4 つが含まれます。黒チャンネルやカラーマップインデックスは、別のメソッドと構造 IndexPacket でサポートされます。例として、画像画素の色成分(アルファ成分は除く)を反転する ImageMagick バージョン 6 のコードスニペットを示します。
for (y=0; y < (ssize_t) image->rows; y++)
{
IndexPacket
*indexes;
PixelPacket
*q;
q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception);
if (q == (PixelPacket *) NULL)
{
status=MagickFalse;
continue;
}
indexes=GetCacheViewAuthenticIndexQueue(image_view);
for (x=0; x < (ssize_t) image->columns; x++)
{
if ((channel & RedChannel) != 0)
q->red=(Quantum) QuantumRange-q->red;
if ((channel & GreenChannel) != 0)
q->green=(Quantum) QuantumRange-q->green;
if ((channel & BlueChannel) != 0)
q->blue=(Quantum) QuantumRange-q->blue;
if (((channel & IndexChannel) != 0) &&
(image->colorspace == CMYKColorspace))
indexes[x]=(IndexPacket) QuantumRange-indexes[x];
q++;
}
if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse)
status=MagickFalse;
}
ImageMagick バージョン 7 は 1 から 64(およびそれ以上)の任意の数のチャンネルをサポートし、Quantum 型の画素チャンネル配列を返す単一のメソッドでアクセスを簡素化します。以前のバージョンの ImageMagick に対してコンパイルされるソースコードは、ImageMagick バージョン 7 で動作させるためにリファクタリングが必要です。例で説明します。上記のバージョン 6 のコードスニペットを、ImageMagick バージョン 7 API で動作するよう素朴にリファクタリングしてみましょう。
for (y=0; y < (ssize_t) image->rows; y++)
{
Quantum
*q;
q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception);
if (q == (Quantum *) NULL)
{
status=MagickFalse;
continue;
}
for (x=0; x < (ssize_t) image->columns; x++)
{
if ((GetPixelRedTraits(image) & UpdatePixelTrait) != 0)
SetPixelRed(image,QuantumRange-GetPixelRed(image,q),q);
if ((GetPixelGreenTraits(image) & UpdatePixelTrait) != 0)
SetPixelGreen(image,QuantumRange-GetPixelGreen(image,q),q);
if ((GetPixelBlueTraits(image) & UpdatePixelTrait) != 0)
SetPixelBlue(image,QuantumRange-GetPixelBlue(image,q),q);
if ((GetPixelBlackTraits(image) & UpdatePixelTrait) != 0)
SetPixelBlack(image,QuantumRange-GetPixelBlack(image,q),q);
if ((GetPixelAlphaTraits(image) & UpdatePixelTrait) != 0)
SetPixelAlpha(image,QuantumRange-GetPixelAlpha(image,q),q);
q+=GetPixelChannels(image);
}
if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse)
status=MagickFalse;
}
もう一度やってみましょう。ただし今度は新しい可変画素チャンネルサポートを最大限に活用します。
for (y=0; y < (ssize_t) image->rows; y++)
{
Quantum
*q;
q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception);
if (q == (Quantum *) NULL)
{
status=MagickFalse;
continue;
}
for (x = 0; x < (ssize_t) image->columns; x++)
{
ssize_t
i;
if (GetPixelWriteMask(image,q) <= (QuantumRange/2))
{
q+=GetPixelChannels(image);
continue;
}
for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
{
PixelChannel channel = GetPixelChannelChannel(image,i);
PixelTrait traits = GetPixelChannelTraits(image,channel);
if ((traits & UpdatePixelTrait) == 0)
continue;
q[i]=QuantumRange-q[i];
}
q+=GetPixelChannels(image);
}
if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse)
status=MagickFalse;
}
GetPixelChannels() を使って次の画素チャンネルのセットへ進む点に注目してください。
カラーマップインデックスと(CMYK カラースペース用の)黒画素チャンネルは、以前 GetAuthenticIndexQueue() や GetCacheViewAuthenticIndexQueue() でアクセスされていたインデックスチャンネルにはもう格納されません。代わりに、それらは今や第一級の画素チャンネルとなり、画素配列のメンバー(例: pixel[4])として、または便利な画素アクセサメソッド GetPixelIndex()・SetPixelIndex()・GetPixelBlack()・SetPixelBlack() でアクセスされます。
可変画素チャンネルに配列構造を使った結果、自動ベクトル化コンパイラには画素ループを高速化する追加の機会が生まれます。
IMv6 の sync チャンネルは実際にはチャンネルではなくフラグでした。IMv7 では代わりにフラグ -define compose:sync=false を使います。
画素アクセサ
画素チャンネルには配列要素(例: pixel[1])としてアクセスするか、便利なアクセサで画素チャンネルを取得・設定できます。
GetPixela() SetPixela()
GetPixelAlpha() SetPixelAlpha()
GetPixelb() SetPixelb()
GetPixelBlack() SetPixelBlack()
GetPixelBlue() SetPixelBlue()
GetPixelCb() SetPixelCb()
GetPixelCr() SetPixelCr()
GetPixelCyan() SetPixelCyan()
GetPixelGray() SetPixelGray()
GetPixelGreen() SetPixelGreen()
GetPixelIndex() SetPixelIndex()
GetPixelL() SetPixelL()
GetPixelMagenta() SetPixelMagenta()
GetPixelReadMask() SetPixelReadMask()
GetPixelWriteMask() SetPixelWriteMask()
GetPixelMetacontentExtent() SetPixelMetacontentExtent()
GetPixelOpacity() SetPixelOpacity()
GetPixelRed() SetPixelRed()
GetPixelYellow() SetPixelYellow()
GetPixelY() SetPixelY()
これらのアクセサはヘッダーファイル MagickCore/pixel-accessor.h で定義されています。
画素トレイト
各画素チャンネルは以下のトレイトを 1 つ以上含みます。
- Undefined
- この画素チャンネルに関連付けられたトレイトはない
- Copy
- この画素チャンネルを更新せず、単にコピーする
- Update
- この画素チャンネルを更新する
- Blend
- 有効ならこの画素チャンネルをアルファマスクとブレンドする
画素トレイトを設定・取得するために以下のメソッドを提供します。
GetPixelAlphaTraits() SetPixelAlphaTraits()
GetPixelBlackTraits() SetPixelBlackTraits()
GetPixelBlueTraits() SetPixelBlueTraits()
GetPixelCbTraits() SetPixelCbTraits()
GetPixelChannelTraits() SetPixelChannelTraits()
GetPixelCrTraits() SetPixelCrTraits()
GetPixelGrayTraits() SetPixelGrayTraits()
GetPixelGreenTraits() SetPixelGreenTraits()
GetPixelIndexTraits() SetPixelIndexTraits()
GetPixelMagentaTraits() SetPixelMagentaTraits()
GetPixelRedTraits() SetPixelRedTraits()
GetPixelYellowTraits() SetPixelYellowTraits()
GetPixelYTraits() SetPixelYTraits()
便宜上、チャンネルマスクと次のメソッドで、画素チャンネルのセットに対するアクティブなトレイトを設定できます。
SetImageChannelMask()
以前は MagickCore メソッドにチャンネル版がありました。たとえば NegateImage() と NegateImageChannels() です。画素チャンネルトレイトが、特定の画素チャンネルに作用するか、アルファマスクとブレンドするかを指定するため、チャンネル版メソッドはもはや不要です。たとえば、次の代わりに
NegateImageChannel(image,channel);
次を使います。
channel_mask=SetImageChannelMask(image,channel);
NegateImage(image,exception);
(void) SetImageChannelMask(image,channel_mask);
画素ユーザーチャンネル
バージョン 7 では、画素ユーザーチャンネルを導入します。伝統的には赤・緑・青・アルファの 4 チャンネルを使います。CMYK では黒チャンネルもあります。ユーザーチャンネルは、あなたのアプリケーションにとって意味のある任意の追加チャンネル情報を含むよう設計されています。例としては、TIFF や PSD 画像の追加チャンネル、あるいは画素に赤外線情報を持つチャンネルが必要な場合などです。ユーザーチャンネルにトレイトを関連付けることで、画像処理アルゴリズム(例: ぼかし)によって作用される際に、画素がコピーされる、アルゴリズムで作用される、あるいは意味があればアルファチャンネルとブレンドされる、といった動作を指定できます。
画素メタコンテンツ
バージョン 7 では、画素メタコンテンツを導入します。メタコンテンツはコンテンツに関するコンテンツです。つまりコンテンツそのものではなく、コンテンツを記述する、またはコンテンツに関連付けられた何かです。ここでコンテンツは画素です。画素メタコンテンツはあなた専用です(内部的にデータは単にコピーされ、変更されません)。以下の MagickCore API メソッドでアクセスします。
SetImageMetacontentExtent()
GetImageMetacontentExtent()
GetVirtualMetacontent()
GetAuthenticMetacontent()
GetCacheViewAuthenticMetacontent()
GetCacheViewVirtualMetacontent()
アルファ
以前は不透明度(opacity)でしたが、今はアルファをサポートします。アルファでは、値 0 はその画素にカバレッジ情報がなく透明であることを意味します。つまり、ジオメトリがこの画素と重ならなかったため、どのジオメトリからの色の寄与もなかったということです。値 QuantumRange は、ジオメトリが画素を完全に覆ったため画素が不透明であることを意味します。その結果、バージョン 7 では PixelInfo 構造のメンバー alpha が以前の opacity メンバーを置き換えました。もう 1 つの結果として、16 進記法における sRGB 値のアルファ部分は反転されました(例: #0000 は完全に透明)。
カラースペース
Rec601Luma と Rec709Luma カラースペースはもはやサポートされません。代わりに gray カラースペースを指定し、以下の intensity オプションから選びます。
Rec601Luma
Rec601Luminance
Rec709Luma
Rec709Luminance
たとえば、
magick myImage.png -intensity Rec709Luminance -colorspace gray myImage.jpg
グレースケール
以前、グレースケール画像は Rec601Luminance で、赤・緑・青・アルファの 4 チャンネルを消費しました。バージョン 7 では、グレースケールは 1 チャンネルのみを消費し、結果としてはるかに少ないリソースで済みます。
マスク
バージョン 7 はほとんどの画像演算子でマスクをサポートします。リードマスクの白い画素は画像内の対応する画素を無視し、ライトマスクの白い画素は画像内の対応する画素を保護します。コマンドラインからは、-read-mask と -write-mask オプションでマスクを画像に関連付けられます。この極性はワークフローの移植を容易にするため ImageMagick バージョン 6 のマスクと一致しています。便宜上、バージョン 6 の動作に合わせるためにバージョン 7 でも -mask オプションを引き続きサポートします。
この例では、マスクされた再構成画像の歪みを計算します。
compare -metric rmse -read-mask hat_mask.png hat.png wizard.png difference.png
ここでは特定の画素を変更から保護します。
magick rose: -write-mask rose_bg_mask.png -modulate 110,100,33.3 +write-mask rose_blue.png
画像に関連付けられたマスクは、変更または削除されるまで持続します。これは複雑なコマンドラインで予期しない結果を生むことがあります。ここでは resize ではなく alpha オプション適用時にのみクリップしたいとします。
magick -density 300 -colorspace srgb image.eps -alpha transparent -clip -alpha opaque +clip -resize 1000x1000 -strip image.png
MagickCore API
MagickCore API への変更の一覧を以下に示します。
- ほとんどすべての画像処理アルゴリズムがチャンネルを認識するようになりました。
- MagickCore API は、バージョン 6 で欠けていたメソッドに ExceptionInfo 引数を追加します。例: NegateImage(image,MagickTrue,exception)
- すべてのメソッドのチャンネル版(例: BlurImageChannel())は削除されました。もはや不要で、代わりに画素トレイトを使います。
- パブリックおよびプライベートな API 呼び出しは GCC の visibility 属性で宣言されるようになりました。MagickCore と MagickWand の動的ライブラリは、パブリックな構造体と関数の宣言のみをエクスポートします。
- InterpolatePixelMethod 列挙型は PixelInterpolateMethod になりました。
- IntegerPixel ストレージ型は削除され(代わりに LongPixel を使用)、LongLongPixel が追加されました。
- 可変画素チャンネルを考慮して、画像のシグネチャが変更されました。
- すべての色パケット構造 PixelPacket・LongPacket・DoublePacket は、単一の色構造 PixelInfo に統合されました。
- ChannelMoments 構造のメンバー I は不変(invariant)になりました。I は complex.h ヘッダーと競合します。
- 可変長バッファを許すため、FormatMagickSize() に length パラメータを追加しました。
MagickWand API
MagickWand API への変更の一覧を以下に示します。
- ほとんどすべての画像処理アルゴリズムがチャンネルを認識するようになりました。
- DrawMatte() メソッドは DrawAlpha() と呼ばれるようになりました。
- MagickSetImageBias() と MagickSetImageClipMask() メソッドはもはやサポートされません。
Magick++ API
Magick++ API への変更の一覧を以下に示します。
- ほとんどすべての画像処理アルゴリズムがチャンネルを認識するようになりました。
- たとえばアルファチャンネルへの作用を避けるには、次の構文を使います:
image.negateChannel(Magick::ChannelType(Magick::CompositeChannels ^ Magick::AlphaChannel));
ヘッダーファイル
以前のバージョンの ImageMagick(4-6)は ImageMagick ヘッダーファイルを magick/ と wand/ として参照します。ImageMagick 7 は代わりにそれぞれ MagickCore/ と MagickWand/ を使います。たとえば、
#include <MagickCore/MagickCore.h>
#include <MagickWand/MagickWand.h>
削除された非推奨機能
ImageMagick バージョン 6 のすべての非推奨機能はバージョン 7 で削除されました。これには Magick-config と Wand-config 設定ユーティリティが含まれます。代わりに次を使います。
MagickCore-config
MagickWand-config
FilterImage() メソッドは削除されました。代わりに ConvolveImage() を使います。
加えて、すべての非推奨 MagickCore および MagickWand メソッドはバージョン 7 でもはや利用できません。
Bessel フィルタは Jinc の別名であるため削除されました。代わりに -filter Jinc を使います。
シェル API またはコマンドラインインターフェイス
前述のとおり、シェル API またはコマンドラインインターフェイスへの変更の主な焦点は抽象化であり、オプションをコマンドライン引数からだけでなく、ファイル(スクリプト)やファイルストリーム(対話コマンドやコプロセッシング)からも読み込めるようにすることです。
これを行うため、CLI パーサーは、すべてのオプションを厳密な「見たままに実行する」順序で常に実行するよう書き直す必要がありました。以前 IMv6 ではオプションはグループ('FireOptions' として知られる)で実行されていましたが、この厄介さはなくなりました。ただし厳密な順序とは、作用させる画像を提供する前に操作を与えられないことを意味します。そうするとエラーが生じます。
エラー報告は、どのオプション(コマンドライン上の引数番号、またはスクリプトの行・列)が「例外」を引き起こしたかを正確に報告するようになりました。これはまだ完全ではありませんが、良くなっています。同じく未完成なのは 'regard-warnings' 処理やその代替で、これはコプロセスや対話的使用で、報告されたエラーを無視して(エラーに応じて適切に)処理を続行できるようにするものです。
magick ユーティリティで起動される IMv7 パーサーでは、設定はメモリ内の各画像に順番に適用されます(画像があれば)。一方 option: はグローバルに一度だけ適用すればよいものです。他のユーティリティを直接使う、または magick CLI への引数として使う(例: magick)と、レガシーパーサーが使われます。
現在の画像リストと画像設定を(例: '(' と ')')スタックへ「プッシュ」するために使われていた括弧オプションは、今や完全に別個の画像設定スタックを持ちます。すなわち括弧は画像リストを「プッシュ/プル」し、波括弧(例: '{' と '}')は画像設定を「プッシュ/プル」します。
もちろん、前述の基盤となるチャンネル処理の変更により、ほとんどすべてのオプションに多くの副作用が生じます。以下にいくつか具体例を示します。
ほとんどのアルゴリズムは赤・緑・青・黒(CMYK 用)・アルファチャンネルを更新します。ほとんどの演算子はアルファを他の色チャンネルとブレンドしますが、他の演算子(や状況)ではこのブレンドを無効にする必要があり、現在は -channel オプションでアクティブチャンネルからアルファを除去することで行います(例: magick castle.gif -channel RGB -negate castle.png)。
グレースケール画像を読み込むと、1 チャンネルのみの画像が生成されます。その画像が色を受け入れる場合、1 チャンネルを別々の RGB(または他の)チャンネルへ展開するため -colorspace 設定を適用する必要があります。
以前、コマンドライン引数は 4096 文字に制限されていましたが、ImageMagick バージョン 7 では制限が 131072 文字に増えました。
コマンドの変更
ImageMagick コマンドへの変更の一覧を以下に示します。
- magick
- 重要: " magick" コマンドはシェル API の新しい主コマンドで、古い "convert" コマンドを置き換えます。これにより、"#!/path/to/command/magick -script" 形式の「magick スクリプト」を作成したり、バックグラウンドプロセスとしてコマンドへオプションをパイプ "magick -script -" したりできます。
- magick-script
- "magick" と同じですが(コマンド名のみが異なる)、暗黙の "-script" オプションを持ちます。これにより "env" スタイルのスクリプト形式で使えます。すなわち、magick スクリプトは "#!/usr/bin/env magick-script" のシェバン行で始まり、スクリプトインタプリタをユーザーのコマンド "PATH" のどこからでも見つけられるようにします。これは、ほとんどの UNIX システム(Linux を含むが MacOSX は含まない)で一般的な「シェバンの引数 1 つバグ」を回避するために必要です。
- animate, compare, composite, conjure, convert, display, identify, import, mogrify, montage, stream
- コマンドラインユーティリティのフットプリントを減らすため、これらのユーティリティは magick ユーティリティへのシンボリックリンクです。Windows ではこれらのユーティリティは別々の実行可能ファイルとしてインストールされ、レガシーの convert 実行可能ファイルはもはや含まれません。magick ユーティリティから呼び出すこともでき、たとえば magick logo: logo.png で magick ユーティリティを起動します。(言い換えると、magick compare・magick identify・magick mogrify・magick montage などのように magick を前置してこれらのユーティリティを呼び出してください。magick convert は使わないでください。それは単に magick です)
動作の変更
画像設定はコマンドライン上の各画像に適用されます。設定を特定の画像に関連付けるには、曖昧さを除くため括弧を使います。この例では各画像に固有のページオフセットを割り当てます。
magick \( -page +10+20 first.png \) \( -page +100+200 second.png \) ...
デフォルトでは、畳み込みのような画像操作はアルファを各チャンネルとブレンドします。各チャンネルを独立に畳み込むには、次のようにアルファチャンネルを非アクティブにします。
magick ... -alpha discrete -blur 0x1 ...
画像からアルファ値を除去するには -alpha off を使います。アルファチャンネルを保持しつつ、特定の画像処理操作でアルファ画素をブレンドしたくない場合は、代わりに -alpha deactivate を使います。
ImageMagick バージョン 7 で変更されたオプションがあります。これには次が含まれます。
- -channel
- デフォルトは RGBA チャンネルを更新します。以前 IMv6 ではデフォルトは RGB でした。IMv6 と異なる結果が得られる場合、コマンドラインで -channel RGB を指定する必要があるかもしれません(例: -channel RGB -negate)。
- +combine
- このオプションは引数(画像のカラースペース)を必要とするようになりました(例: +combine sRGB)。
- -format
- %Z 画像プロパティはもはやサポートされません。
- -gamma
- 複数のガンマ引数(例: -gamma 1,2,3)はもはやサポートされません。代わりに -channel を使います(例: -channel blue -gamma 2)。
- -region
- このオプションは定義した領域にライトマスクを設定します。IMv6 では代わりに別の画像が複製され、それに作用し、結果がソース画像へ合成されました。加えて、draw 変換は画像の左上隅を基準とします。以前 IMv6 では領域を基準としていました。
モルフォロジーまたは畳み込みカーネルを出力するには -define morphology:showKernel=1 を使います。以前は -define showKernel=1 でした。
新しいオプション
ImageMagick バージョン 7 は以下の新しいオプションをサポートしますが、ほとんどは "magick" コマンド、または "magick" スクリプトでの使用に限られます。
- { ... }
- 現在の画像設定(内部的には "image_info" 構造として知られる)を保存(および復元)する。これは IMv6 と同様、"-regard-parenthesis" が設定されていれば括弧(例: '(' と ')')で自動的に行われる。波括弧の不均衡エラーを防ぐため注意が必要。
- --
- オプションの終わり。IMv7 "mogrify" コマンドで、適用される操作と「その場で」処理される画像を明示的に区切るために使う(まだ未実装)。ただし提供されない場合でも、(アルファ合成などで使う)二次的な画像読み込みを、処理される「その場の」画像と区別するために "-read" を使える。他のコマンド("magick" など)では、次のオプションを画像として明示的に "-read"(後述)するのと等価(IMv6 でもそうだった)。
- -alpha activate/deactivate
- アルファチャンネルをそれぞれ有効・無効にする(持続性あり)。これは ImageMagick 6 の on/off に似ている。ImageMagick 7 では、-alpha off はアルファチャンネルを永久に除去するため、-alpha on で再有効化できない。
- -alpha discrete
- アルファチャンネルを独立に扱う(ブレンドしない)。
-channel-fx expression
1 つ以上の画像チャンネルを交換・抽出・コピーする。
式は、1 つ以上のチャンネル(ニーモニックまたは数値。例: red または 0、green または 1 など)を、以下の特定の操作記号で区切って構成される。
<=> 2 つのチャンネルを交換する(例: red<=>blue)
=> あるチャンネルを別のチャンネルへコピーする(例: red=>green)
= チャンネルに定数値を代入する(例: red=50%)
, 指定の順序でチャンネルを持つ新しい画像を書き出す(例: red, green)
; 次のチャンネル操作セットのために新しい出力画像を追加する(例: red; green; blue)
| チャンネルデータのソースとして次の入力画像へ移る(例: | gray=>alpha)
たとえば、画像の赤・緑・青チャンネルから 3 つのグレースケール画像を作成するには、次を使います。
-channel-fx "red; green; blue"
操作記号のないチャンネルは separate(すなわちセミコロン)を意味します。
ここでは sRGB 画像とグレースケール画像を取り、グレースケール画像をアルファチャンネルへ注入します。
magick wizard.png mask.pgm -channel-fx '| gray=>alpha' wizard-alpha.png
同様のコマンドでリードマスクを定義します。
magick wizard.png mask.pgm -channel-fx '| gray=>read-mask' wizard-mask.png
チャンネルモルフォロジーを追跡するには、-channel-fx オプションの前に -debug pixel を追加します。
- -exit
- この時点で処理を停止する。このオプションの後はそれ以上のオプションは処理されない。スクリプトで、オプションを処理しているパイプラインを実際には閉じずに "magick" コマンドを終了させるために使える。また、暗黙の出力画像の代わりに "magick" コマンドラインの「最終」オプションとして使い、画像の書き出しを完全に防ぐこともできる。余談: "NULL:" コーダーですら「書き出さない」ためには少なくとも 1 画像を必要とする!このオプションは画像をまったく必要としない。
- -read
- 暗黙の読み込みではなく、画像の明示的な読み込み。これにより、「オプション」文字で始まり、(既知であれ未知であれ)オプションと誤認されかねないファイル名から読み込める。これは最終的に "mogrify" で二次画像の読み込みを許し、そのコマンド内で画像リスト操作を使えるようにするために使われる。
- -read-mask
- マスクで指定された画像画素の更新を防ぐ。
- -region
- ImageMagick 7.0.2-6 以降でサポート。
- -script
- "magick" で、コマンドライン引数の画像操作としての処理を停止し、それ以降のすべてのオプションを指定のファイルまたはパイプラインから読み込む。
- -write-mask
- 画素の書き出しを防ぐ。
変更されたオプション
これらのオプションは何らかの形で変更されたことが分かっています。
- -bias
- このオプションはもはや認識されない。代わりに -define convolve:bias=value を使う。
- -draw
- matte プリミティブは alpha になった(例: -draw 'alpha 0,0 floodfill')。
- -negate
- 現在、存在すればアルファを含むすべてのチャンネルを反転する。そのため、アルファの反転を防ぐために -channel オプションを使う必要があるかもしれない(例: -channel RGB -negate)。
- -preview
- このオプションは画像演算子になった。PREVIEW 画像形式は削除された。
非推奨の警告が出るが(当面は)動作する
- -affine
- -draw "affine ..." に置き換えられた(transform を参照)。
- -average
- -evaluate-sequence Mean に置き換えられた。
- -box
- -undercolor に置き換えられた。
- -deconstruct
- -layers CompareAny に置き換えられた。
- -gaussian
- -gaussian-blur に置き換えられた。
- -/+map
- -/+remap に置き換えられた。
- -/+mask
- -/+read-mask、-/+write-mask に置き換えられた。
- -/+matte
- -alpha Set/Off に置き換えられた。
- -transform
- -distort Affine "..." に置き換えられた。
非推奨の警告が出て、(当面は)無視される
何もしなかったほとんどの「プラス」(+)オプションは非推奨としてマークされ、何もしません。関連するコードすら持ちません。たとえば "+annotate"・"+resize"・"+clut"・"+draw" です。
- -affinity
- -remap に置き換えられた。
- -maximum
- -evaluate-sequence Max に置き換えられた。
- -median
- -evaluate-sequence Median に置き換えられた。
- -minimum
- -evaluate-sequence Min に置き換えられた。
- -recolor
- -color-matrix に置き換えられた。
削除/置換されたオプション(「no such option」エラーで中止)
- -interpolate filter
- 遅く無用な補間メソッドを削除。
- -origin
- 古いオプション。意味不明。
- -pen
- -fill に置き換えられた。
- -passphrase
- 古いオプション。意味不明。
性能改善
1 チャンネルのみで済むため、グレースケール画像の操作が大幅に改善されました。以前グレースケールは 3 チャンネルを必要としました。
-fx オプションの性能が 1〜2 桁向上しました。
バージョン 7 変更点まとめ
ImageMagick バージョン 6 からバージョン 7 への変更をここにまとめます。
ハイダイナミックレンジイメージング
- ImageMagick バージョン 7 はデフォルトで HDRI を有効にします。より正確な画像処理結果が期待できますが、メモリ要求が増え、処理時間が遅くなる可能性があります。携帯電話のようなリソース制約のあるシステムでは、特定のアルゴリズム(例: リサイズ)の精度がわずかに低下するこの機能を無効にできます。
画素
- 画素はもはや PixelPacket 構造のメンバー(例: red・green・blue・opacity)ではなく、チャンネルの配列(例: pixel[PixelRedChannel])でアドレスされます。
- 画素チャンネルへのアクセスには便利なマクロを使います(例: GetPixelRed()・SetPixelRed())。
- CMYK カラースペースの黒チャンネルは、以前 GetAuthenticIndexQueue() や GetCacheViewAuthenticIndexQueue() でアクセスされていたインデックスチャンネルにはもう格納されません。代わりに今や画素チャンネルとなり、便利な画素マクロ GetPixelBlack() と SetPixelBlack() でアクセスされます。
- カラーマップ画像のインデックスチャンネルは、以前 GetAuthenticIndexQueue() や GetCacheViewAuthenticIndexQueue() でアクセスされていたインデックスチャンネルにはもう格納されません。代わりに今や画素チャンネルとなり、便利な画素マクロ GetPixelIndex() と SetPixelIndex() でアクセスされます。
- 次の画素チャンネルのセットへ進むには GetPixelChannels() を使います。
- 各画素にメタコンテンツを関連付けるにはメタコンテンツチャンネルを使います。
- すべての色パケット構造 PixelPacket・LongPacket・DoublePacket は、単一の色構造 PixelInfo に統合されました。
アルファ
- 不透明度ではなくアルファをサポートします(0 が透明、QuantumRange が不透明)。
- アルファ画素チャンネル値の取得・設定には GetPixelAlpha() または SetPixelAlpha() を使います。
グレースケール
- グレースケール画像は ImageMagick バージョン 7 で 1 画素チャンネルを消費します。RGB を処理するには、カラースペースを RGB に設定します(例: -colorspace sRGB)。
マスク
- ImageMagick バージョン 6 は限られた状況でのみリードマスクをサポートします。バージョン 7 はリードマスクとライトマスクの両方をサポートします。リードマスクはほとんどの画像処理アルゴリズムで尊重されます。
MagickCore API
- ほとんどすべての画像処理アルゴリズムがチャンネルを認識するようになりました。
- MagickCore バージョン 7 は、バージョン 6 で欠けていたメソッドに ExceptionInfo 引数を追加します。例: NegateImage(image,MagickTrue,exception);
- すべてのメソッドのチャンネル版(例: BlurImageChannel())は削除されました。もはや不要で、代わりに画素トレイトを使います。
- パブリックおよびプライベートな API 呼び出しは GCC の visibility 属性で宣言されるようになりました。MagickCore と MagickWand の動的ライブラリは、パブリックな構造体と関数の宣言のみをエクスポートします。
- InterpolatePixelMethod 列挙型は PixelInterpolateMethod になりました。
- 可変画素チャンネルを考慮して、画像が異なるシグネチャを返すことがあります。
非推奨メソッド
- すべての ImageMagick バージョン 6 の MagickCore・MagickWand 非推奨メソッドは削除され、ImageMagick バージョン 7 でもはや利用できません。
- すべての MagickCore チャンネルメソッド版は削除されました(例: NegateImageChannels())。バージョン 7 では代わりに画素トレイトを使います。
- FilterImage() メソッドは削除されました。代わりに ConvolveImage() を使います。