ImageMagick バージョン 7 • ハイダイナミックレンジイメージング • ピクセルチャネル • アルファ • グレースケール • マスク • MagickCore API • ヘッダーファイル • 非推奨機能の削除 • コマンドラインインターフェース • パフォーマンスの向上 • バージョン 7 の変更概要
ImageMagick の設計は進化の過程であり、設計と実装の努力が互いに影響し合い、さらなる進歩を導くのに役立っています。ImageMagick バージョン 7 では、バージョン 6 の実装から得られた教訓に基づいて設計を改善しました。ImageMagick はもともと、RGB 画像を X Windows サーバーに表示するように設計されました。その後、RGBA 画像、そして CMYK および CMYKA 画像形式のサポートを拡張しました。ImageMagick バージョン 7 では、任意の数のピクセルチャネルを持つ任意のカラースペースのサポートを拡張します。さらに、ImageMagick 7 はピクセルチャネルを float 型として格納し、範囲外の値 (例: 負の値) を許可し、丸め誤差を減らします。その他にも、数多くの設計上の改善点が記述されています。
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 が原因である可能性があります。-clamp をコマンドラインに追加してピクセルを 0 .. QuantumRange の範囲に制限するか、ImageMagick バージョン 7 をビルドするときに HDRI を無効にする必要がある場合があります。HDRI を無効にするには (iOS などのスマートフォンビルドや、パフォーマンスが重要な本番サイトで推奨)、ImageMagick をビルドするときに、configure スクリプトのコマンドラインに --disable-hdri を追加するだけです。
ピクセルチャネル
ピクセルは、1 つ以上の色値、つまり チャネル (例: 赤のピクセルチャネル) で構成されます。
以前のバージョンの ImageMagick (4-6) は、4〜5 つのピクセルチャネル (RGBA または CMYKA) をサポートしています。最初の 4 つのチャネルは、PixelPacket データ構造を使用してアクセスされます。この構造には、赤、緑、青、および不透明度の 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 つ以上が含まれています。
- 未定義
- このピクセルチャネルに関連付けられた特性はありません
- コピー
- このピクセルチャネルを更新せずに、コピーするだけです
- 更新
- このピクセルチャネルを更新します
- ブレンド
- アルファマスクが有効になっている場合、このピクセルチャネルをアルファマスクとブレンドします
ピクセル特性を設定および取得するために、これらのメソッドを提供します。
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()
アルファ
アルファ (以前は不透明度) をサポートします。アルファでは、0 の値は、ピクセルにカバレッジ情報がなく、透明であることを意味します。つまり、ジオメトリがこのピクセルと重ならなかったため、ジオメトリからの色の寄与はありませんでした。QuantumRange の値は、ジオメトリがピクセルを完全にオーバーラップしたため、ピクセルが不透明であることを意味します。その結果、バージョン 7 では、PixelInfo 構造体のメンバーであるアルファが、以前の不透明度メンバーに置き換わりました。もう 1 つの結果として、16 進数表記の sRGB 値のアルファ部分は反転されました (例: #0000 は完全に透明)。
カラースペース
Rec601Luma および Rec709Luma カラースペースはサポートされなくなりました。代わりに、gray カラースペースを指定し、次の強度オプションから選択します。
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
画像に関連付けられたマスクは、変更または削除されるまで持続します。これにより、複雑なコマンドラインでは予期しない結果が生じる可能性があります。ここでは、サイズ変更ではなく、アルファオプションを適用するときにのみクリップしたいと思います。
convert -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 の可視性属性で宣言されるようになりました。MagickCore および MagickWand 動的ライブラリは、パブリック struct および関数宣言のみをエクスポートするようになりました。
- InterpolatePixelMethod 列挙型が PixelInterpolateMethod になりました。
- IntegerPixel ストレージタイプが削除され (代わりに LongPixel を使用)、LongLongPixel が追加されました。
- 可変ピクセルチャネルに対応するように、イメージ署名が変更されました。
- PixelPacket、LongPacket、および DoublePacket のすべてのカラーパケット構造が、単一のカラー構造である PixelInfo に統合されました。
- ChannelMoments構造体のメンバーIがinvariantになりました。Iはcomplex.hヘッダーと競合します。
- 可変長バッファーに対応するため、FormatMagickSize()に長さパラメーターを追加しました。
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またはコマンドラインインターフェースの変更の主な焦点は、コマンドライン引数からだけでなく、ファイル(スクリプト)またはファイルストリーム(インタラクティブなコマンドまたはコプロセッシング)からもoptionsを読み取れるように抽象化することです。
これを行うために、CLIパーサーを書き直す必要がありました。これにより、すべてのオプションを厳密に、記述された順序で実行します。以前のIMv6では、オプションはグループ(「FireOptions」と呼ばれます)で実行されていましたが、この不便さは解消されました。ただし、厳密な順序になったため、操作対象の画像を提供する前に操作を実行することはできなくなりました。これを実行するとエラーが発生します。
エラー報告は、どのオプション(コマンドラインの引数カウント、またはスクリプト内の行、列)が「例外」を引き起こしたかを正確に報告するようになりました。これはまだ完全ではありませんが、改善されつつあります。また、完了していないのは、「regard-warnings」処理またはその代替機能であり、コプロセスまたはインタラクティブな使用で、報告されたエラーを無視して処理を継続できます(エラーに応じて適切に処理します)。
`magick`ユーティリティによってアクティブ化されるIMv7パーサーでは、設定は(存在する場合)メモリ内の各イメージに順番に適用されます。ただし、オプションは、グローバルに一度だけ適用する必要があります。他のユーティリティを直接使用するか、`magick` CLI(例:`magick`)の引数として使用すると、レガシーパーサーが利用されます。
現在のイメージリストとイメージ設定(例:'('および')')をスタックに「プッシュ」するために使用される括弧オプションには、完全に分離されたイメージ設定スタックがあります。つまり、括弧はイメージリストを「プッシュ/プル」し、中かっこ(例:'{'および'}')はイメージ設定を「プッシュ/プル」します。
もちろん、前述のチャネル処理への変更により、ほぼすべてのオプションに多くの副作用が生じます。以下にいくつかの例を示します。
ほとんどのアルゴリズムは、赤、緑、青、黒(CMYKの場合)、およびアルファチャネルを更新します。ほとんどの演算子は、アルファを他のカラーチャネルにブレンドしますが、他の演算子(および状況)では、このブレンドを無効にする必要があり、現在では-channelオプションを使用してアクティブなチャネルからアルファを削除することで行われています(例:magick castle.gif -channel RGB -negate castle.png)。
グレースケール画像を読み取ると、チャネルが1つしかない画像が生成されます。その画像で色を受け入れるには、-colorspace設定を適用して、1つのチャネルを個別のRGB(または他の)チャネルに拡張する必要があります。
以前は、コマンドライン引数は4096文字に制限されていましたが、ImageMagickバージョン7では、制限が131072文字に増加しました。
コマンドの変更
ImageMagickコマンドの変更点は以下のとおりです。
- magick
- 重要:"magick"コマンドは、古い"convert"コマンドに代わる、シェルAPIの新しいプライマリーコマンドです。これにより、"#!/path/to/command/magick -script"という形式の「magickスクリプト」を作成したり、"magick -script -"のようにバックグラウンドプロセスとしてコマンドにオプションをパイプしたりできます。
- magick-script
- これは、"magick"と同じですが(コマンド名のみが異なります)、暗黙的な"-script"オプションがあります。これにより、"env"スタイルのスクリプト形式で使用できます。つまり、magickスクリプトは、ユーザーのコマンド"PATH"上のどこでもスクリプトインタープリターを見つけられるように、"#!/usr/bin/env magick-script"という「she-bang」行で始まります。これは、ほとんどのUNIXシステム(Linuxを含むがMacOSXを除く)で一般的な「1つの引数she-bangバグ」を回避するために必要です。
- 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では、代わりに別のイメージがクローンされ、操作され、結果がソースイメージに合成されていました。さらに、描画変換はイメージの左上隅を基準にして行われます。以前の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のオン/オフのようなものです。Imagemagick 7では、-alpha offはアルファチャネルを完全に削除するため、-alpha onで再度有効にすることはできません。
- -alpha discrete
- アルファチャネルを独立して処理します(ブレンドしません)。
- -channel-fx expression
-
1つ以上のイメージチャネルを交換、抽出、またはコピーします。
式は、1つ以上のチャネルで構成され、ニーモニックまたは数値(例:赤または0、緑または1など)のいずれかで、次のように特定の演算記号で区切られます。
<=> exchange two channels (e.g. red<=>blue) => copy one channel to another channel (e.g. red=>green) = assign a constant value to a channel (e.g. red=50%) , write new image with channels in the specified order (e.g. red, green) ; add a new output image for the next set of channel operations (e.g. red; green; blue) | move to the next input image for the source of channel data (e.g. | gray=>alpha)
たとえば、イメージの赤、緑、青のチャネルから3つのグレースケールイメージを作成するには、次を使用します。
-channel-fx "red; green; blue"
演算記号がないチャネルは、個別のチャネル(つまり、セミコロン)を意味します。
ここでは、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 {image}
- 暗黙的な読み取りではなく、イメージの明示的な読み取り。これにより、「オプション」文字で始まるファイル名から読み取ることができ、そうでない場合はオプション(不明またはその他)として誤解される可能性があります。これは最終的に、"mogrify"で二次イメージの読み取りを可能にし、そのコマンド内でイメージリスト操作を使用できるようにするために使用されます。
- -read-mask
- マスクで指定されたイメージピクセルへの更新を防止します
- -region
- ImageMagick 7.0.2-6以降でサポートされています
- -script {file}
- 「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 "..." に置き換えられました。
非推奨の警告が表示され、(今のところは)無視されます。
実質的に何もしなかった 'plus' (+) オプションは非推奨とマークされ、何もしなくなりました。関連するコードすらありません。たとえば、"+annotate", "+resize", "+clut", "+draw"などです。
- -affinity
- -remap に置き換えられました。
- -maximum
- -evaluate-sequence Max に置き換えられました。
- -median
- -evaluate-sequence Median に置き換えられました。
- -minimum
- -evaluate-sequence Min に置き換えられました。
- -recolor
- -color-matrix に置き換えられました。
削除/置き換えられたオプション(「そのようなオプションはありません」エラーと中止)
- -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()を使用します。
- 各ピクセルにメタコンテンツを関連付けるには、metacontentチャンネルを使用します。
- 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 の可視性属性で宣言されるようになりました。MagickCore および MagickWand 動的ライブラリは、パブリック struct および関数宣言のみをエクスポートするようになりました。
- InterpolatePixelMethod 列挙型が PixelInterpolateMethod になりました。
- 可変ピクセルチャンネルに対応するため、イメージは異なるシグネチャを返す場合があります。
非推奨メソッド
- ImageMagickバージョン6のすべての非推奨のMagickCoreおよびMagickWandメソッドは削除され、ImageMagickバージョン7では使用できなくなりました。
- すべてのMagickCoreチャンネルメソッドのアナログ(例:NegateImageChannels())は削除されました。バージョン7では、代わりにピクセルの特性を使用します。
- FilterImage()メソッドは削除されました。代わりにConvolveImage()を使用してください。