ImageMagick の例 --
画像の合成
- 目次
-
ImageMagick の例 はじめに と 目次
-
IM における画像の合成
-
オーバーレイ画像の配置
-
合成方法の生のテーブル (別ページ)
-
Duff-Porter アルファ合成メソッド
-
数学的合成メソッド
-
ライティング合成メソッド (Light, Dodge, Burn)
-
チャネルコピーメソッド
-
ある画像を別の画像に溶解させる
-
2つの画像をブレンドする
-
透かしを入れる、または画像を調整する
-
マスクを使用して合成領域を制限する
-
画像タイルを使用した合成
-
特殊な合成メソッド
-
画像マッピング合成メソッド
magick composite
" コマンドを使用して実行されます。また、一連のより大きな操作の一部として、または他の画像演算子によって内部的に実行されることもあります。IM における画像合成
画像合成は、2 つ(および 2 つのみ)の画像をさまざまな方法でマージするプロセスです。これは、オーバーレイのどの部分が透明であるかに基づいて結果を記述する アルファ合成 に関連付けられています。画像合成は、画像のブレンドと平均化、画像チャネルの転送、画像の奇妙な形状のセグメントのカット、結合、またはレイヤー化に使用されます。あるいは、複雑な数学的演算の一部として使用されます。画像合成の良い別の入門書は、SVG Compositing in 30 Minutes です。または、より重要な画像合成メソッドについて説明している SVG Alpha Compositing ページを読むことで、正確な数学的詳細を発見できます。次のコマンドは、ImageMagick で使用できる 2 つの直接的な画像「合成」メソッドです...
magick composite {overlay} {background} [{mask}] [-compose {method}] {result} magick {background} {overlay} [{mask}] [-compose {method}] -composite {result} |
magick composite
" コマンドは、IM で合成する従来の方法です。専用のコマンドを持つことは、画像合成がいかに重要であるかを示しています。"magick
" 演算子 "-composite" は、より大きな画像処理タスクの一部として画像合成を行うこともできます。 </> "magick
" を使用する場合、画像の順序が逆になっていることに注意してください。一般に、新しい画像を形成する画像を準備およびマージするプライマリキャンバスを操作するため、この順序は実用的です。画像の順序は重要です。両方の手法(およびそれ以上)の実用的な例は、複数の画像のレイヤーで確認できます。続行する前に読むことをお勧めします。定義と用語
より重要な画像は、背景 画像であり、宛先 画像とも呼ばれ、画像合成によって修正される画像です。背景 は、画像合成の最終サイズを設定するだけでなく、「コメント」、「ラベル」、「密度」、「プロファイル」などのメタデータも保持されます。その位置は固定されており、通常、構築中のキャンバスを形成するため、背景という名前が付けられています。これを覚えておいてください!オーバーレイ 画像、または ソース 画像は、"-compose
" メソッドが固定された 背景 または 宛先 画像をどのように修正する必要があるかを制御します。画像は、固定された 背景 画像に対して再配置できます(通常は "-geometry
" および "-gravity
" 設定を使用)。ただし、オーバーレイ 画像とそれに含まれるすべてのメタデータは、合成操作が終了すると削除されます。
compose:outside-overlay
"(Outside-Overlay 設定を参照)を 'false
' の値に設定して、オーバーレイ 画像がカバーする矩形領域の外側の 背景 画像への変更を無効にできます。これがないと、一部の合成メソッドは、合成定義の一部として、オーバーレイでカバーされていない領域をクリアします。実際の合成メソッドは、デフォルト値が '
Over
' の "-compose
" 設定によって制御されます。つまり、ソース画像は、ほとんどの人が画像合成を実行するときに考えるように、背景 画像の上に描画されます。IM Examples のこのセクションのほとんどは、さまざまな合成「メソッド」が何をするのか、およびそれらをどのように利用できるかを詳しく説明するために使用されます。合成メソッドの結果を表示するには、合成メソッドのテーブル を参照してください。テーブルは、メソッドの意図された使用法ではなく、さまざまなテスト画像からの生の出力を示しています。合成メソッドは大文字と小文字を区別せず、'_
' または '-
' 文字はオプションです。そのため、合成メソッド "Dst_Over
" は、"dst_over
"、"dst-over
"、"DstOver
"、"dstover
"、または "dstOVER
" としても指定できます。それらはすべて同じ意味です。また、合成メソッド:'Over
'、'ATop
'、'In
'、および 'Out
' は、より詳細な合成メソッド名:'Src_Over
'、'Src_ATop
'、'Src_In
'、および 'Src_Out
' の短縮形です。長い "-compose
" メソッドのリストに加えて、正しく機能するために追加の数値引数を必要とするものがあります。"magick composite
" コマンドでは、これらの引数は、特別なオプション: "-dissolve
"、"-blend
"、"-watermark
" ('modulate
')、"-displace
"、および "-distort
" を使用して渡されます。IM v6.5.3-4 以降では、"magick
" コマンドは、定義設定 "compose:args
" を使用して、"-composite
" 演算子に特別な引数を渡すことができます。例については、以下の特別な 溶解 および ブレンド メソッドを参照してください。画像合成演算子
上記に示されている直接的な 2 つの画像合成スタイルとは別に、内部画像処理の一部としてアルファ合成も使用する他の多くの画像操作があります。これらの操作は現在の "-compose
" 設定の影響を受けますが、独自の内部位置設定、または レイヤー化された画像 仮想キャンバスオフセット位置設定技術のいずれかを使用します。次に、合成設定の影響を受けることが知られているすべての演算子をリストします...
- 画像のペアの合成
- プライマリ画像合成演算子を使用する実用的な例。プリミティブな "
magick composite
" コマンドと、"magick
" の -composite" 演算子の両方を使用します。この低レベルメソッドは、Geometry/Gravity 設定を使用して、オーバーレイ画像の位置を決定します。- レイヤー化演算子
- 画像 'layerimage' 演算子 "
flatten
"、"mosaic
"、および "-layers merge
" は、現在の画像シーケンス内のすべての複数の画像を、選択したレイヤー化演算子によって決定されるサイズと位置を持つ単一の新しいキャンバス上にオーバーレイします。これは、仮想キャンバス/ページオフセット設定を使用して、オーバーレイ画像の位置を決定します。- エッジ拡張演算子
- 内部的に準備されたキャンバス上の個々の画像をオーバーレイする演算子。これには、"
-border
"、"-frame
"、および "-extent
" などの演算子が含まれます。(画像エッジの追加/削除を参照)。位置情報は使用されませんが、"-extent
" は、重力とジオメトリオフセットを使用して、単色の背景画像上にオーバーレイします。- 画像の描画
- "
-draw 'image...'
" 画像オーバーレイメソッドは、単一の外部 ソース 画像を、宛先画像のリストにオーバーレイします。これは、"mogrify
" で使用できる唯一の画像合成技術です。外部ソースから「オーバーレイ」画像を取得することで、このコマンドのリストなし演算子の制限を克服できます。サイズ変更と位置情報はユーザーによっても提供され、これらは重力の影響を受ける可能性があります。- 複数リストレイヤーの合成
- 「
-layers composite
」演算子は、2つの別々の複数画像リストを、一度に1組の画像ずつ合成し、新しい結合されたマルチ画像シーケンスを作成します。また、一連の画像を単一の画像(静的な「オーバーレイ」画像、または静的な「デスティネーション」画像のいずれか)と合成することもできます。さらに、この演算子は、ユニバーサルな「-gravity
」の影響を受ける「-geometry
」オフセット(グローバル)、およびグローバルな位置からの個々の画像の仮想キャンバス「-page
」オフセットの両方を使用できる唯一の合成演算子です。この合成演算子は、イメージアニメーションやその他の画像シーケンスを、一度に1組の画像を処理するスクリプトを必要とせずに、全体として合成する場合に特に重要です。
オーバーレイ画像の位置決め
合成における Geometry/Gravity の設定
通常のアルファ合成では、「-geometry
」設定が「-gravity
」とともに使用され、ソース画像をデスティネーション画像に対して位置決めします。これらの設定の使用方法については、グラビティを使用した画像の位置決めで詳しく説明しています。「-geometry
」のサイズコンポーネントは、画像のサイズを変更する(ジオメトリ)という点で特別です。「composite
」ではソース画像のサイズが変更されますが、「convert
」では画像シーケンスの最後の画像のサイズが変更されます。これは技術的には画像合成とは別の側面です。ジオメトリサイズ変更とコンポジットを使用した画像のレイヤー化を参照してください。アルファ合成では、「ソース」と「デスティネーション」(または「背景」)の2つの画像のみが関与しますが、3番目のマスキング画像を提供して、合成の影響を受ける領域を制限することもできます。レイヤーのキャンバス/ページオフセット
レイヤー化された画像の合成は、非常に異なる哲学を使用します。すべての画像(好きなだけ)は、指定された順序で等しく扱われます。すべてに「-page
」またはページオフセットがあり、各画像の左上隅を仮想キャンバスの「原点」(デフォルトのオフセット)に対して、グラビティなしで位置決めします。複数の画像を処理するには、実行中の操作に応じてサイズが異なる、現在の「-background
」色を使用した新しい背景画像が生成されます。これは「デスティネーション」画像(キャンバス)と見なされます。すべての画像は、この新しいキャンバスに一度に1つずつ順番に合成されます。2つの画像のみが与えられた場合でも、新しい画像が作成され、2つの別々の合成が適用されます。つまり、時間がかかる可能性があります。すべての画像は「ソース」画像として扱われ、リストされている順序によって結果が決まります。「レイヤー」オフセットは、グラビティの影響を受けません。各画像は個別の「キャンバスオフセット」を持つことができるため、複数の画像合成は、アニメーションの場合はマルチ画像シーケンス合成だけでなく、画像レイヤー化演算子を使用して適用することをお勧めします。2つのスタイルは非常に異なる位置決め手法であり、使用する予定の合成手法に適したスタイルを使用することが重要です。両方の位置決め手法
複数の画像リストレイヤー合成演算子である1つの合成手法のみが、両方の位置決め方法を同時に使用できます。まず、2つのリストは「-geometry
」と「-gravity
」を使用してグローバルに位置決めされます。これは、各リストの最初の画像の仮想キャンバスサイズに適用されます。次に、リスト内の各個々の画像は、「-page
」を使用して、そのグローバルな位置からのオフセットを調整して、最終的な位置を決定します。もちろん、オーバーレイ画像が、提供された画像内の特定のデスティネーション画像に収まらない場合、その画像によってクリップされます。そのため、一般的には、適切なサイズに必要なデスティネーション画像には、完全に合体した画像のみを使用することをお勧めします。もちろん、結果の画像は後で再びサイズをトリミングできます。ダフポーターアルファ合成メソッド
ダフポーターの画像合成メソッドは、非常に明確に定義された12個の伝統的なメソッドのセットです。画像が画像の透明度または「アルファチャンネル」のいくつかの側面に従って結合されるため、アルファ合成として知られています。これらの数学的定義は、SVGアルファ合成ドキュメントにあります。これは、2つの三角形の画像を使用した、これら12個のメソッドの結果を示す古典的な表です。![[IM Output]](tables/montage_triangles.jpg)
Over
」であり、画像を合成するときにほとんどの人が通常望むものです。上記の各コンポーズメソッドが何をするかを理解し、記憶するために、結果の画像は、次のように言った場合と同じになります...{Source} --{compose_method}--> {background}
ATop
」の結果の画像は、「背景画像の「ATop
」のオーバーレイ画像」と同じです。つまり、背景画像は「形状」を維持しますが、ソース画像の色は背景の「上」に配置されます。ただし、「magick -composite
」演算子を使用すると、画像の順序が逆になることを忘れないでください。これらの12個のメソッドは、結果で2つの画像のどちらが「表示」されるかだけでなく、ソース画像によってオーバーレイされない画像の部分がどのように影響を受けるかについても定義します。つまり、元の「背景」がそのまま残されるか、完全にクリアされるかです。上の表の「デスティネーション」画像を意図的に大きくしたので、画像の残りの部分がクリアされたかどうかを確認できます。これらの「クリア」メソッドは、「Src
」、「In
」、「Dst_In
」、「Out
」、「Dst_ATop
」、および「Clear
」です。IM v6.5.3-4以降では、定義設定「compose:outside-overlay=false
」を使用して、ダフポーター合成がオーバーレイされた領域外のデスティネーション画像をクリアするのを防ぐことができます。詳細については、「Copy
」および「Clear
」の合成メソッド、およびOutside-Overlay設定の例を参照してください。「Copy
」は、IMによって提供される特別な「13番目」の合成メソッドです。基本的には「Over
」合成と同等ですが、オーバーレイされた領域では背景がクリアされます。ただし、実装上は、outside-overlay(または背景のクリア)が無効になっている「Src
」合成です。![]() ![]() |
ImageMagick v5以前では、ソース画像によってオーバーレイされていない領域はクリアされませんでした。これはダフポーター合成演算子の誤った処理であり、IM v6の開発中に修正されました。 |
CopyOpacity
」ではなく、マスキングメソッドとしてよく選ばれる理由です。Over(背景の上にオーバーレイ画像)
これはデフォルトのコンポーズメソッドであり、別の画像の上に画像をオーバーレイするときに誰もが思い浮かべるものです。オーバーレイ画像は、「アニメーションセル」または「オーバーヘッド透明度」が背景シーンまたは画像の上に配置できるのと同じように、背景画像の上に「オーバー」に配置されます。非常に一般的なので、これ以上言う必要はないと思います。それでは、単一の文字画像を背景画像にオーバーレイする例を示します。
|
![]() ![]() |
-geometry
」設定を使用して正確に位置決めすることもできます。背景の境界外に配置されている場合、適切にクリップされるか無視されます。この例では、「convert -composite
」演算子を使用して画像がオーバーレイされますが、背景の半分上に位置決めされています。画像の順序が逆になっていることに注意してください。
|
![]() |
Dst_Over(画像を背景の「下」に配置)
他の「Dst_」メソッドと同様に、これはメソッドの「Src_」バージョンとほぼ同じように機能しますが、オーバーレイ画像と背景画像が入れ替わります。そのため、「Dst_Over
」は、ソースオーバーレイ画像をデスティネーションの「下」に配置することと同等です。その結果、デスティネーション画像または背景画像で非表示になっていないソースまたはオーバーレイ画像の部分のみが、下から覗き見えするように表示されます。これは、引数画像を入れ替えた「Over
」とまったく同じではありません。サイズ、位置決め、その他の画像メタデータは、依然として背景またはデスティネーション画像から取得されるためです。出力画像サイズは「背景」画像と同じであり、ソース画像の位置は背景に対して相対的である(「-geometry
」と「-gravity
」を使用)。たとえば、ここでは、元の白いAの「下」に黒い「A;」ラベルをオーバーレイします。黒いAを白いAの背景に対して再配置できます。ご覧のとおり、これは画像サイズを拡張することを心配せずに、ハードシャドウを追加するのに最適です。
|
![]() ![]() |
magick composite
」の「-tile
」設定も、この形式の「オーバー」を画像の下にタイルする方法として非常に役立てます。たとえば、作成したばかりの影付きの文字の下に、組み込みのチェッカーボードパターンをタイルします。
|
![]() |
Src(背景画像の寸法に「トリミング」)
この演算子は、背景画像をオーバーレイ画像で完全に置き換えます。背景の色と透明度は完全に破棄され、元のデスティネーションと同じサイズの空白の画像が残り、その上にソース画像が適用されます。しかし、それは何が良いのでしょうか?まあ、2つのことがあります。まず、背景画像をソース画像で効果的に置き換えていますが、元の背景画像に関連付けられているすべてのメタデータを保持しています。つまり、画像は変更されますが、メタデータは変更されません。次に、画像の内容が変更されても、最終的な画像のサイズは変更されません。つまり、結果の画像は元の背景と同じサイズになります。そのため、この演算子を使用して、ソースまたはオーバーレイ画像をトリミングするか、境界線を追加して、指定された背景画像と同じサイズに(背景メタデータとともに)効果的にすることができます。たとえば、プラズマ画像を作成し、それをクリップして、組み込みのバラの画像と同じサイズにしたいとします。これにより、バラの画像がどのくらいの大きさかを知る必要なく、これを行うことができます。
|
![]() |
-crop
」と同等であり、「サイズ変更」ではありません。元の画像のメタデータも保持されます。つまり、これは現在プラズマ画像ですが、画像メタデータは依然として「バラ」画像であり、「rose:」画像ソースから来たことを示しています。オーバーレイが背景画像よりも小さい場合、残りの背景画像は透明で埋められます。ただし、背景にはアルファチャンネルが必要であることに注意してください。そうしないと、余分なスペースが黒で埋められます(アルファチャンネルのない「
none
」または「transparent
」の色)。
|
![]() ![]() |
コピー(画像をコピーまたは置換)
この演算子は、上記の図にはなかった12種類の「ダフ・ポーター」合成メソッドの1つではありません。それでも非常に重要です。これは「Src
」合成メソッドとまったく同じように機能しますが、オーバーレイされた領域の外側の背景画像には触れません。つまり、コピー機能をオーバーレイされた領域だけに制限し、他の領域には影響を与えません。これにより、大きな画像の一部を切り抜き、速度を上げるために小さな画像を操作し、その結果を大きな画像に「コピー」して、その画像の他の領域に触れないようにできます。これにより、非常に大きな画像の画像処理を最適化できます。以下に示すのは、上記で使用した同じ例ですが、「Src
」の代わりに「Copy
」を使用しており、IMが「ダフ・ポーター」アルゴリズムで要求されているように残りの背景をクリアするのに時間を浪費しないことを示しています。
|
![]() |
Over
」にも非常に似ていますが、ソース画像の透明度もコピーされ、背景画像が完全に置き換えられます。透明度がなければ、「Over
」とまったく同じように動作します。内部的には、特別な合成制御設定「outside-overlay
」(次を参照)を修正します。Outside-Overlay設定
IM v6.5.3-4以降、合成メソッドがオーバーレイされた領域外の領域にも影響を与えるかどうかを、「compose:outside-overlay
」を定義することでユーザーが制御できるようになりました。デフォルトでは「オン」ですが、値を「false
」に設定するとオフにできます。たとえば、以下に示すのは、より伝統的なSrc合成メソッドを使用するCopy合成メソッドと同等です。
|
![]() |
Outside-OverlayとSVG 'clip-to-self'
「compose:outside-overlay
」定義は、多くの点でSVGの「clip-to-self」属性の使用に似ています。どちらも、合成をオーバーレイされた領域だけに制限し、宛先画像の残りの部分には影響を与えません。ただし、SVGの「clip-to-self」は描画された領域(マスクのようなもの)にのみ適用され、IMの「outside-overlay」設定は、ソース画像の背景画像にオーバーレイする矩形領域全体に適用されます。与えられた例があまりうまく説明されていないため、SVG合成マニュアルではこれが非常に明確ではありません。そのため、非常に混乱します。ただし、理解しようとする場合は、SVG合成「clip-to-self」プロパティまたはSVG 1.2合成、clip-to-selfの理解を参照してください。書き込みマスクを使用して、このタイプの制御を実現することもできますが、指定されたマスクに従って成形された領域を使用します。この点では、ソース画像も書き込みマスクとして使用されるSVGの「clip-to-self」属性によく似ています。Dst(「何もしない」合成)
この演算子は何も行いません。ソース画像、つまりオーバーレイ画像は完全に無視され、宛先画像、つまり背景画像は変更されません。このメソッドの実際の用途は、他の画像演算におけるアルファ合成操作を「オフにする」手段です。たとえば、フレーム演算子を使用して(透明な背景で)バラの画像をフレーム化しますが、「-compose Dst
」を使用して、画像がフレームに追加されないようにします。言い換えれば、バラを使用して結果の内部フレームのサイズを設定するだけです。フレーム、そしてフレームのみが結果となります。
|
![]() |
-bordercolor
」は、通常ソース画像の下に配置されるフレーム内の色を定義します。「Dst
」メソッドは、2つの異なるIMコマンドを作成する必要なく、大きくて複雑なコマンドでアルファ合成を無効にするスクリプトでも役立ちます。Dst_In(または、ソースで背景を「マスク」する)
「Dst_In
」メソッドは、ソース画像を背景画像の「Copy_Opacity
」マスクとして使用するようなものです。クッキー生地からクッキーの形を切り抜くクッキーカッターのように、背景画像からオーバーレイ画像の形を削除します。たとえば、上記の派手な「A」をマスクとして使用して、バラの画像からその形を切り抜いてみましょう。
|
![]() |
Copy_Opacity
」メソッドとは異なり、この操作ではオーバーレイ画像のアルファチャンネルのみが使用されるため、グレースケール画像をマスクとして使用することはできません。オーバーレイの色は完全に無視されます。![]() ![]() |
「Dst_In 」および「Src_In 」メソッドはすべて、実際には2つの画像のアルファチャンネルを掛け合わせるだけです。適切な画像の色(メソッドに応じて)は保持されます。 |
Dst_Out(または、「消去」操作)
「Dst_In
」の「クッキー生地」のメタファーを使用すると、「Dst_Out
」メソッドの結果は、クッキーが切り抜かれた後に残された生地です。オーバーレイの形を使用して、背景画像に穴を開けたり、かじり取ったりするために使用できます。オーバーレイの色は再び完全に無視されます。
|
![]() |
Dst_In
」と「Dst_Out
」を使用した場合に、ジグソーパズルのように(「Plus
」メソッドを使用して)それらを元に戻せるように明示的に設計されています。たとえば、ここでは、上で生成した最後の2つの画像を「追加」しています(「Plus
」合成を使用)。この画像は、元の「rose:
」画像と(ピクセルレベルで)まったく同じです。
|
![]() |
-draw
」操作では、画像に色を追加することしかできません。キャンバスに適用された色を、上から描画して削除することはできません。ガラスのドアや窓に広告を描いている画家を想像してみてください。彼は、または彼女は、ペンキを追加することはできますが、上から描画することでペンキを削除することはできません。消去したい形を透明なキャンバスに描画することで、「Dst_Out
」を使用して作業中の画像から削除できます。これは、私たちの画家が、特別な形をしたぼろ布で慎重に濡れたペンキを拭き取るのに似ています。この形を使用して、すべての色または一部の色を削除して、完全に透明または半透明にすることができます。たとえば、透明なキャンバスに三日月の記号を描画するとします。このアルファ合成メソッドを使用すると、2つの円をオーバーレイすることで、この複雑な形を簡単に描画できます。
|
![]() |
![]() ![]() |
2番目の画像は、括弧で囲んで作成および描画する必要があります。そうしないと、「-draw 」がオーバーレイ画像と元の背景の両方に描画されることがわかります。これは明らかに間違っています。
括弧を使用しなかった場合、消去された画像の部分の周りに半透明の黒いピクセルの円が表示されます。私がこの例を作成中に私自身を非常に悩ませたように、私は知っています。 |
ATop(「Over」だが、背景画像にクリップする)
「Over
」と同様ですが、結果を背景画像の元の形に制限します。言い換えれば、宛先のアルファチャンネルは変更されませんが、画像の色はソース画像の透明でない部分でオーバーレイされます。背景画像が完全に不透明(透明度がない)の場合、この操作は通常の「Over
」合成とまったく同じように動作します。背景にオーバーレイをクリップする透明度が含まれている場合にのみ異なります。これが役立つのは、宛先のオブジェクト(シェイプ)に限定された照明効果や影の効果をオーバーレイする場合です。たとえば、赤い円があり、それが3次元のボールであるかのようにハイライトを追加するとします。円とハイライトを作成し、「ATop 」を使用してハイライトをオーバーレイして、円に制限できます。
|
![]() ![]() ![]() |
![]() ![]() |
白いハイライトの作成は、「-negate 」を使用して、画像全体が実際に白になるようにすることで行われました。これは、"-blur "演算子のバグを回避するために使用されました。これはIMバージョン6.2.4で修正されています。この古いバグの詳細については、透明度バグのあるぼかしを参照してください。 |
|
![]() |
ATop
」合成メソッドの使用に関するさらに詳しい例は、3Dロゴの生成で確認できます。Clear(背景をクリアします。オーバーレイ画像を無視します)
これは、本質的にオーバーレイ画像を完全に無視し、背景画像をクリアするだけの珍しい合成メソッドです。これにより、複雑なプロジェクトで、背景画像と同じサイズの透明または黒のキャンバスを作成するのに理想的な方法になります。オーバーレイ画像は使用されないため、単一ピクセルの「null:
」画像を使用するとよいでしょう。
|
![]() |
|
![]() |
compose:outside-overlay
」を使用すると、オーバーレイ画像に透明度が含まれているかどうかに関係なく、このクリアをオーバーレイされた領域のみに制限できます。たとえば
|
![]() |
Xor(共有された領域をクリアする)
これは非常に奇妙で、ほとんど使用されない合成メソッドです。2つの画像をオーバーレイし、オーバーラップした領域を透明にクリアします。
|
![]() |
|
![]() |
FUTURE: Xor effects on semi-transparent images get extremely weird. Explore this and create an example demonstrating this weirdness.
数学的な合成方法
この合成方法のグループでは、画像に対して数学的な演算を実行できます。これはあまり役に立たないように思えるかもしれませんが、低レベルの画像操作では、通常は考えられないような操作が可能になります。前のDuff-Porter画像合成方法とは異なり、これらは一般的にグレースケールメソッドです。つまり、通常は片方または両方の画像がグレースケールである画像に適用され、通常は透明度を含みません。透明度を使用できないという意味ではありません(下記の数学的な合成とアルファを参照)が、あまり一般的な方法ではありません。数学的な合成のデフォルトの使用法は、SVG画像ファイル形式の仕様で定義されています。詳細については、SVG Composition Guide (2009)、Pegtop Blend Modes、およびSimpelFilter: Photoshop Blend Modesを参照してください。以下の各演算子の隣にある特別なグラデーション画像は、色値にどのように影響するかという点で演算子を視覚化しています。結果は、次のように2つのグラデーション画像を合成することによって生成されます。
magick -size 64x64 gradient: gradient_src.png magick -size 64x64 gradient: -rotate 90 gradient_dst.png magick composite gradient_src.png -compose Multiply gradient_dst.png \ gradient_result.png |
![]() ソース |
![]() |
![]() デスティネーション |
![]() |
![]() 結果 |
乗算
' は一般的に画像を暗くし、どちらかの入力画像に黒(0)の値がある場合は、黒の結果が生成されることがわかります。これは非常に役立つことがあります。
![[IM Output]](gradient_op_multiply.png)
乗算 (
) (図/テキストのために白色を透明にする)
最も便利で、過小評価されている合成方法の1つで、2つの画像を単純に乗算します。その式は当然、Src*Dest
です。つまり、画像の1つが純粋な白の場合、結果はもう一方の画像になります。一方、1つの画像が黒の場合、結果は黒になります。これらの極端な値の間では、1つの画像が指定された量だけデスティネーション画像を暗くします。'乗算
' は画像を暗くするだけで、明るくすることはありません。つまり、画像を黒に向かって「減衰」させるため、この合成方法は「焼き込み」スタイルの合成となります。(下記の照明合成方法を参照)
|
![]() ![]() |
0.5
」のガンマ演算子、または値が「2.0
」のEvaluate PowerOf演算と同等です。たとえば、スタージェネレーターを参照して、より現実的な星の強度分布を生成します。または、衛星雲画像で結果を地理地図に重ねる前に使用することもできます。 ![[IM Output]](gradient_op_screen.png)
スクリーン(図/テキストのために黒色を透明にする)
これは、'乗算
' とほぼ同じですが、合成前に両方の入力画像が否定され、最終結果も再び否定されて画像が正常に戻されます。専門的には、2つの方法は互いに「双対」です。その式は、1-(1-Src)*(1-Dest)
となります。つまり、画像の1つが純粋な黒の場合、結果はもう一方の画像になります。一方、1つの画像が白の場合、結果は白になります。これらの極端な値の間では、1つの画像が指定された量だけデスティネーション画像を明るくします。'スクリーン
' 合成は、画像を明るくするだけで、決して暗くすることはありません。これは、「覆い焼き」合成として知られる合成スタイルです。(下記の照明合成方法を参照)この合成方法は、黒い背景に白いテキストを重ねて、他の画像に重ねるのに最適です...
|
![]() ![]() |
![[IM Output]](gradient_op_bumpmap.png)
バンプマップ(グレースケール乗算)
'バンプマップ
' メソッドは、基本的に '乗算
' と同じですが、ソース画像が重ねられる前にグレースケールに変換される点が異なります。つまり、ソース画像が暗い場所では画像を暗くします。これは、「強度による乗算」タイプの演算子と考えることができます。例:
|
![]() |
hand_point.gif
" 画像が適用前にグレースケール化されていることに注意してください。本来の目的は、画像にテクスチャ(紙や布のテクスチャなど)を追加することです。ただし、画像を暗くすることしかできないため、画像を明るくしたり暗くしたりできる 'ハードライト
' メソッドほど便利ではありません(下記参照)。 ![[IM Output]](gradient_op_divide.png)
除算、除算_Dst、除算_Src (
) (陰影効果の除去)
2つの画像がお互いに除算されます。どの画像がどの画像を除算するかは、'除算_Src
' または '除算_Dst
' が適用されるかによって異なります。'除算_Dst
' の式は Src / Dest
であり、'除算_Src
' の式は Dest / Src
です。画像合成で通常定義されている画像の順序と "magick composite
" コマンドにより、元のメソッド '除算
' は次の意味になりました...{Source} Divide {background}
除算
" は "除算_Dst
" の同義語であり、「デスティネーションで除算」を意味します。また、表示されるグラデーションチャートを定義するために使用される演算子でもあります。画像を交換したり、演算子を交換したりすると、まったく異なる結果が得られるため、画像の順序は非常に重要であることに注意してください。これは、デスティネーション画像をソース画像の前に持つ "magick
" コマンドの場合に特に当てはまります。デスティネーション画像が実際の最終的なサイズと、2つの画像の合成の結果のメタデータを定義することを忘れないでください。また、デスティネーション画像に対して位置付けられるのはソース画像であることを忘れないでください。この合成方法は、写真からのビネットの除去において最も実用的な用途があります。次の例では、これを背景を削除する手段として使用します。正規化された色値が使用され、これらは通常0.0(黒)から1.0(白)の範囲であるため、除算は実際には、除算する画像内の「黒」の量によって、分子画像を明るくします。したがって、画像を分割し、「分子」画像(演算子で指定されていない画像)を明るくするのは奇妙に聞こえるかもしれません。しかし、それは非常に便利な操作です。これは、レンズのビネット、スキャンの失敗、または経年劣化による色あせによって生じた画像の暗いパッチを効果的に削除できることを意味します。たとえば、手書きのテキストの画像があります。これは、フラッシュなしでデジタルカメラを使用して非常に大まかにスキャンされた(デジタルノイズを除去するためにサイズが縮小された)ものです。紙の端は色あせており、フラッシュを使用しなかったため、背景は非常に暗く、紙が完全に平らでなかったために陰影効果があります。画像のコントラストを高めるために画像を正規化するだけでは、端の着色やその他の陰影効果を削除するのに役立ちません。ただし、画像をぼかして線を削除し、それを元の画像から除算することで、画像からすべての大きな陰影効果を効果的に削除します。除算の結果は、背景色が白になり、テキストの細い線はクリアなままですが、わずかに「細く」なります。ご覧のとおり、正規化するだけよりもはるかにクリアですが、アンチエイリアシングの一部も削除されました。除数画像にいくつかの追加調整を行うこともできましたが、ほぼ予想どおりです。ぼかしを小さくすると、輪郭画像の塗りつぶしに示されているような芸術的な輪郭画像を生成する別の手段を作成できます。この演算子は、スパースカラーグラデーションなどの背景グラデーションジェネレーターと組み合わせて、画像全体をぼかすだけよりも、より優れた背景「除数」画像を生成できます。
除算演算子は、実際には '
カラー覆い焼き
' 合成方法に似ていますが、除数画像を否定し、ソース画像として使用している点が異なります。これは通常Photoshopで使用される合成ですが、画像を交換して否定する必要がある場合があります。等価性については、'カラー覆い焼き
' を参照してください。![]() ![]() |
IM v6.6.8-5 より前は、元の '除算 ' メソッドのみが提供されていました(新しい '除算_Dst ' と同等)。 |
![[IM Output]](gradient_op_plus.png)
プラス (
) (色を足し合わせてブレンドを形成する)
オーバーレイの色を背景に追加します。本質的に2つの画像を等しくブレンドさせます。その式は当然、Src + Dest
です。ただし、加算された色が色の制限を超えると、色は通常の色の範囲制限でクリップされることに注意してください。これが、結果のグラデーション画像の半分が純粋な白である理由であり、これらの値は最大値でクリップされたためです。結果の画像が不要な場合にクリップされないように注意することをお勧めします。演算子には多くの主要な用途があります。個々のチャネルのみに色があるが、別々のチャネルの色を含む画像をマージすること。例:
magick -size 60x60 xc:none -fill red \ -draw 'circle 30,21 30,3' compose_R.png magick -size 60x60 xc:none -fill lime \ -draw 'circle 39,39 36,57' compose_G.png magick -size 60x60 xc:none -fill blue \ -draw 'circle 21,39 24,57' compose_B.png magick composite -compose plus compose_R.png compose_G.png compose_plus_RG.png magick composite -compose plus compose_R.png compose_B.png compose_plus_RB.png magick composite -compose plus compose_G.png compose_B.png compose_plus_GB.png magick composite -compose plus compose_R.png compose_plus_GB.png \ compose_plus_RGB.png |
![[IM Output]](compose_R.png)
![[IM Output]](compose_G.png)
![[IM Output]](compose_B.png)
![[IM Output]](compose_plus_RG.png)
![[IM Output]](compose_plus_RB.png)
![[IM Output]](compose_plus_GB.png)
![[IM Output]](compose_plus_RGB.png)
![]() ![]() |
IMはSVG標準に準拠しているため、「緑」は(X11の色名のように)真の緑色ではなく、暗い緑色または半分の明るさの緑色です。上記の例で行ったように、真のRGB緑色は色「lime 」で指定できます。 |
Plus
」は、画像に白いテキストを追加するために使用されることもあります。これは正しい使い方ではなく、アンチエイリアスの不整合を引き起こす可能性があります。より良い方法は、「Screen
」コンポーズメソッドを使用することです。これは、明るさを増加させるために加算ではなく乗算を使用します。Linear Dodgeコンポーズメソッドは「Plus
」と同等ですが、より一般的な「Over
」アルファブレンディングを使用しています。PlusとPlusブレンディング
「Plus
」がより重要である理由は、「Over
」ブレンディングとは異なるブレンディング関数を実装しているほぼ唯一の数学演算子であるということです。これは、色を「加算」するだけでなく、アルファチャンネルの値も「加算」し、デフォルトでこれを行うほぼ唯一の演算子です。これは、相補的なマスク画像の正しい結合を可能にするため重要です。例えば、Dst In and Out画像の結合を参照してください。また、透明度を使用して、2つの画像の加重平均またはブレンドを生成することもできます。「Plus
」のこの特別なブレンディングメソッドがなければ、これらの特別な透明度処理テクニックは通常不可能でしょう。IM v6.6.1-6以降では、「
-channel
」設定からデフォルトの「Sync
」フラグを削除するだけで、アルファチャンネルへの数学演算子の使用がすべての数学コンポーズメソッドに追加されました(適用したい特定のチャンネルを指定するだけです)。下記の画像合成を使用した画像チャンネル演算を参照してください。これは、「Plus
」演算子が、デフォルトで既に適用されているため、この機能の影響を受けない唯一の数学コンポーズメソッド演算子であることを意味します。![[IM Output]](gradient_op_minus.png)
Minus、Minus_Dst、Minus_Src (
)
結果は、一方の画像からもう一方の画像が減算されたものです。どの画像からどの画像が減算されるかは、「Minus_Src
」または「Minus_Dst
」が適用されるかどうかによって異なります。具体的には、「Minus_Dst
」は「デスティネーションを減算」することを意味し、「magick composite
」コマンドで適用された場合は... 「Minus_Dst
」の式は Src - Dest
であり、「Minus_Src
」の式は Dest - Src
です。通常、画像合成で定義される画像の順序と「magick composite
」コマンドにより、元のメソッド「Minus
」は...{Source} Minus {background}
Minus
」は「Minus_Dst
」、つまり「デスティネーションをマイナス」の同義語です。これは、表示されるグラデーションチャートを定義するために使用される演算子でもあります。例えば、上記の「Plus
」操作の最終結果から円を減算します。
|
![]() |
Plus
」を除く他のすべての数学演算子と同じです。数学合成とアルファブレンディングを参照してください。この処理は、特別な「Sync
」チャンネルフラグを使用して変更できます。詳細については、下記の画像チャンネル演算を参照してください。「Linear Burn
」コンポーズメソッドも色の減算に使用できますが、減算する画像をユーザーが反転させることで機能します。詳細については、Linear Burnコンポーズメソッドを参照してください。![]() ![]() |
IM v6.6.8-5より前は、元の「Minus 」メソッド(新しい「Minus_Dst 」と同等)のみが提供されていました。 |
![[IM Output]](gradient_op_modulusadd.png)
ModulusAdd
「ModulusAdd
」は「Plus
」によく似ていますが、結果が白を超えた場合、黒に戻って折り返されます(剰余)。例えば、2つのグレースケールグラデーションを追加すると、最も明るい色が折り返して2番目のグラデーションを形成します。
|
![]() |
|
![]() |
|
![]() |
gray50
」の背景を使用して、グラデーションを剰余サイクルの半分だけ実質的に「ロール」する方法に注目してください。 ![[IM Output]](gradient_op_modulussubtract.png)
ModulusSubtract
「ModulusSubtract
」演算子は「Minus
」と同じですが、剰余減算である点が異なります。「白」を「グレー」から減算すると、値が折り返すため、黒ではなく元の「グレー」になります。剰余減算の副作用として、一部のパーツが制御不能に見える方法で黒ではなく白になる場合があります。
|
![]() |
ModulusAdd
」を行うと、同じ結果が得られます。 ![[IM Output]](gradient_op_difference.png)
Difference(画像の比較、および選択的な反転)
結果の画像は、色値の絶対差です。その式は次のとおりです。abs(Src - Dest)
「黒
」と「白
」の差は、最大の白の結果を生成しますが、同じ色の場合は黒を生成します。基本的には、簡単な形式の画像比較です。このコンポーズメソッドのより一般的な用途は、同じサイズの2つの画像を比較して、それらがどのように異なるかを確認し、その差のパーセンテージを生成することです。この演算子は、通常、比較差分画像を生成するために使用されます。この演算子は、選択的に画像を反転させるためにも使用できます。黒をオーバーレイしても背景には影響しませんが、白をオーバーレイすると、その場所の画像の色が反転します。つまり、この演算子(および次の演算子)は、画像がマッピングされた反転演算子を提供します。例えば、バラの画像の半分を反転してみましょう。
|
![]() ![]() |
![[IM Output]](gradient_op_exclusion.png)
Exclusion(グレーを除く画像の差)
その式は次のとおりです。Src + Dest - 2*Src*Dest
これは、一種の平均化された差です。白と白は黒(差なし)を生成し、黒と黒も同様です。ただし、グレーとグレーはグレーの結果を生成します。白と黒は当然、白(最大差)を生成します。別の見方をすると、明るい画像領域は、それぞれの他のレイヤーに反転を引き起こします。非常に暗い領域は何も変化させません。この方法では、Exclusionメソッドは「Difference
」(上記参照)と同じです。この演算子の1つの用途は、ディスプレースメントマップに使用されるような「バイアスされたグラデーション」を乗算することです。これらは、50%のグレー値が「ゼロ」と見なされ、暗い色が「負」の値を表し、明るい色が-1から+1の範囲の値で「正」の値を表すグラデーションです。詳細については、Multiply Biased Gradientsを参照してください。ジョー・フライによって提出されたこのコンポーズメソッドのもう1つの用途は、複数の差分画像をマージする方法です。最終的な画像は、2つの画像間だけでなく、すべての画像の変更を示します。つまり、画像A、B、Cが与えられた場合、最初にA、B、およびB、Cの差分画像を生成し、それらの結果に対してexclusionを使用して、3つすべての画像がどのように変更されたかを示す1つの画像を取得します。このメソッドは、Xor合成ブレンディング演算子がアルファ透明度値を処理する方法にも密接に関連しています。 ![[IM Output]](gradient_op_darken.png)
![[IM Output]](gradient_op_lighten.png)
LightenとDarken(最大/最小値を選択)
ソース画像とデスティネーション画像の色の値を比較し、それぞれ明るい値または暗い値を取得します。Lightenの式は次のとおりです。 | Src > Dest の場合 |
then Src |
else Dest |
「Lighten
」の1つの用途は、元の画像のぼやけたバージョンを合成して、元の画像の「ハイライト」に柔らかい輝きを与えることです。
これらの演算子は、個々のRGBチャンネル値を比較して選択することで機能するため、特に画像の原色を扱う場合、色の歪みを引き起こす可能性があります。例えば、ここでは赤と青のグラデーション画像を作成し、Lightenを使用してそれらを合成します。
magick -size 100x100 gradient:red-black -rotate 90 red_gradient.png magick -size 100x100 gradient:blue-black blue_gradient.png magick red_gradient.png blue_gradient.png \ -compose Lighten -composite lighten_by_value.png |
![[IM Output]](red_gradient.png)
![[IM Output]](blue_gradient.png)

![[IM Output]](lighten_by_value.png)
Lighten
」合成は色の値で機能するため、結果は赤と青の画像を単純にマージして、赤-青のグラデーション画像を生成するだけです。つまり、上記は単純なチャンネルコピー合成と同等でした。色の歪みを防ぐための1つの方法は、HSL カラースペースを使用して、画像の「明度」チャンネルのみを調整するように演算子を制限することです。ただし、これは必ずしも良い結果が得られるとは限りません。![]() ![]() |
「Gimp 」、「Photoshop 」、「PhotoLine 」、「Paint Shop Pro 」は、すべてIMと同じようにチャンネルを直接比較することに注意してください。「 Photo-Paint 」は、色の強さで画像を比較し、それを使用してどの画像から色を選択するかを決定するため、色の整合性が維持されます。下記のLighten-Intensityメソッドを参照してください。一方、「 Picture Publisher 」と「PhotoImpact 」は、比較に(HSLカラースペースで定義されている)色の明度を使用します。さまざまなカラースペースからのグレースケールの差の比較については、例カラースペースを使用したグレースケーリングを参照してください。 |
![[IM Output]](gradient_op_darken.png)
![[IM Output]](gradient_op_lighten.png)
Lighten-IntensityとDarken-Intensity(強度によって色を選択)
IM v6.6.9-5以降、「Lighten_Intensity
」および「Darken_Intensity
」バリアントが追加されました。これにより、2つの画像のピクセルの強度を比較し、その結果に基づいてピクセル値を選択します。つまり、画像に新しい色が追加されることはありませんが、新しい画像は両方の画像の色が混ざり合ったものになります。また、サイズとメタデータがデスティネーション画像から取得されることを除いて、画像の順序は関係ありません。例えば、赤と青のグラデーションを含む画像のうち明るい方を取得します。
magick red_gradient.png blue_gradient.png \ -compose Lighten_Intensity -composite lighten_intensity.png |
![[IM Output]](red_gradient.png)
![[IM Output]](blue_gradient.png)

![[IM Output]](lighten_intensity.png)
![]() ![]() |
この合成メソッドは、これまで見てきたすべての合成メソッドで使用されているSVG合成ガイド(2009)では定義されていません。そのため、アルファチャンネルがピクセルの比較にどのように影響するかについての明確な定義はありません。 |
アルファに関して、このメソッドには2つの動作モードがあります。「
-channel
」設定の特別な「Sync
」フラグが有効になっている場合(デフォルト)、比較はアルファ(透明度)チャンネルによって重み付けされた色の強度に基づいて行われます。つまり、「半透明の白」は、「不透明の中間グレー」の色とほぼ同じ加重強度を持ちます。これは、他のすべてが同じである場合、「Lighten_Intensity
」はシェイプされた画像の「和集合」を作成し、「Darken_Intensity
」は(少なくとも黒ではない)シェイプされた画像の「交差点」を作成することを意味します。これは理想的ではなく、変更される可能性がありますが、アルファ入力がないよりはましです。
Sync
」チャンネルフラグをオフにした場合に使用されます(下記の「Sync」フラグの使用を参照)。例えば、「-channel All
」を使用した場合です。この場合、ピクセルの選択は、アルファ重み付けの影響を受けず、純粋に色の強度に基づいて行われます。ただし、実際に選択されたピクセルデータにはアルファチャンネルの値がコピーされます。透明度がない画像の場合、モードに関係なく結果は同じになります。また、この2番目のモードでは、より制限された「-channel
」を使用して、ソースからデスティネーション画像にコピーできるチャンネルを定義することもできます。ただし、選択は依然として、重み付けされていない色の強度のみに基づきます。これは、2つの画像の色の強度に基づいて、選択範囲の「シェイプマスク」をより簡単に作成できることを意味します。色の強度に基づいて画像を比較しますが、結果ではアルファチャンネルの値のみを気にします。「マスク」を作成するには、アルファ透明を使用して、一方の画像を完全に透明(ただし、色あり)にし、もう一方の画像を完全に不透明(デフォルト)にします。最後に、アルファ抽出を使用して、どの画像のピクセル位置の色が明るかったかのマスクを取得できます。
|
![]() |
![]() ![]() |
IM v6.6.9-5以降で追加されました。ただし、このメソッドの正式な定義は見つかっていません。そのため、現在の実装は高度に実験的として分類されており、ユーザーの提案に基づいて変更される可能性があります。ただし、基本的な考え方は健全です。 |
IMの旧バージョン向けの強度代替案
ImageMagickのバージョンで「Lighten_Intensity
」メソッドが利用できない場合は、2つの画像のグレースケールコピーで「Lighten
」を使用し、その結果をグレースケールコピーと比較して、元の画像に適用する選択マスクを作成することにより、純粋な色のみのバージョンを再作成できます。これは簡単ではありません。以下にそのような解決策の1つを示します...Darken_Intensity
」バージョンを取得するには、「-delete 1
」を「-delete 0
」に置き換えるか、「-compose Lighten
」を「-compose Darken
」に置き換えます。どちらでも機能します。集合論と同等の演算
上記の数学的なメソッドの多くは、図形を使用した集合論またはブール演算の実行にも使用されます。「Lighten
」合成メソッドは、2つ(またはそれ以上)のグループ(セット)またはピクセルの「和集合」(ブール値「Or」)を見つけるために使用できます。
magick -size 64x64 xc: -draw 'circle 22,32 5,32' -negate circle_left.gif magick -size 64x64 xc: -draw 'circle 41,32 58,32' -negate circle_right.gif magick circle_left.gif circle_right.gif \ -compose Lighten -composite circle_union.gif |
![[IM Output]](circle_left.gif)

![[IM Output]](circle_right.gif)

![[IM Output]](circle_union.gif)
Darken
」合成メソッドは、ピクセルの「積集合」(ブール値「And」)を生成します。「Difference
」合成メソッドは、2つのセットの「排他的OR」(ブール値「XOR」)を生成します。「Exclusion
」メソッドもこの目的で使用できますが、グレースケール(非ブール)値を異なる方法で処理します。ただし、これは「XOR
」ダフ・ポーター アルファブレンドに使用されるメソッドです。そして最後に、「Minus
」を使用して、2つのピクセルセットの「相対補集合」を生成できます。上記の「セット」または「ブール」合成メソッドを適用する場合、範囲外の値の生成を防ぐために、ImageMagickのHDRIバージョンでは「-clamp
」が必要になる場合があることに注意してください。数学的合成とアルファブレンディング
上記の数学的合成メソッドを使用して、画像に対して数学的演算を実行できます。ただし、これには大きな注意点があります。透明度を含む画像では、期待どおりに動作しない可能性があります。デフォルトでは、上記のほとんどすべての数学的合成は、SVG仕様で定義された規則に従います。SVG合成ガイド(2009年)。これは、アルファチャンネル(つまり、何らかの透明度)を持つ画像で数学的合成を使用しようとすると、真の数学的合成ではなく、合成の「ブレンド」形式になる可能性があることを意味します。例えば、ここでは、周囲に透明度があるグラデーション画像を作成します。次に、それらを一緒に「Multiply
」します。
magick -size 64x64 xc:none -draw 'rectangle 20,0 43,63' \ gradient: -compose In -composite alpha_src.png magick alpha_src.png -transverse alpha_dst.png magick alpha_dst.png alpha_src.png \ -compose Multiply -composite alpha_result.png |
![]() ソース |
![]() |
![]() デスティネーション |
![]() |
![]() 結果 |
![]() ![]() |
プラス合成は、数学的合成メソッドの中で、「アルファブレンド上書き」を実行しない唯一のメソッドです。代わりに、SVG仕様に従って、各チャンネルを個別に追加します。ただし、色のチャンネルは、追加される前にアルファ値で重み付けされます。異なるのはアルファ値の処理(ブレンド)のみです。 これは、DstOut合成で示されているように、マスクされたシェイプの正しい「加算」を提供するために重要です。 |
画像合成を用いた画像チャネルの数学
数学的合成メソッドで使用する画像が完全に不透明なグレースケール画像である場合は、問題なくこれらのメソッドを直接使用できます。ただし、デフォルトでは、合成メソッドは、上記のように、アルファブレンドを使用して、すべてのカラーチャンネルに適用されます。これにより、アルファチャンネルなどの特定のチャンネルのみに適用することが難しくなります。例えば、ここでは、透明なグラデーションを含む2つの黒い画像を「Multiply
」します。デフォルトの「-channel
」設定を使用します。
magick -size 64x64 gradient:black-none alpha_grad_src.png magick alpha_grad_src.png -transverse alpha_grad_dst.png magick alpha_grad_dst.png alpha_grad_src.png \ -compose Multiply -composite alpha_grad_result.png |
![]() ソース |
![]() |
![]() デスティネーション |
![]() |
![]() 結果 |
黒
」と「黒
」を乗算すると「黒
」になるため、この例では色は変わりません。結果の透明度のみが変更されます。ただし、SVG定義によれば、半透明度は「上書き」メソッドを使用してブレンドされるため、その結果は画像のアルファチャンネル値の乗算では決してありません。これは、アルファチャンネルの「Screen
」合成に数学的に相当し、乗算ではありません。シンクチャネルフラグと数学的合成
IM v6.6.1-6以降、数学的合成メソッドは、「-channel
」設定の「Sync
」フラグに従うように変更されました。このフラグは、事実上、「色とアルファチャンネルの操作を同期する」ことを意味します。デフォルトの「-channel
」設定は、「RGBK,Sync
」です。したがって、デフォルトでは、色とアルファチャンネルは、SVN仕様に従って、適切に「同期して」処理されます。ただし、「Sync
」フラグを削除すると、数学的合成メソッドは「チャンネル演算子」になり、各チャンネルに個別に数学関数を適用します。
|
![]() |
これはすべて、数学的合成メソッド(上記で詳述)と、特別な「
Mathematics
」合成メソッド(下記参照)にのみ適用されます。他の合成メソッド(例えば、照明合成メソッド(次を参照))には適用されません。少なくともまだ。また、「Sync
」フラグは、強度による明/暗合成メソッド(SVGで定義された合成メソッドではない)がアルファチャンネルを処理する方法にも影響します(上記)。画像処理の使用に関する詳細については、グラデーションの数学を参照してください。具体的には、これらの例では、バイアスグラデーション画像を生成するための数学的合成の使用について説明しており、これはもう少し複雑です。照明合成メソッド-- ライト、覆い焼き、焼き込み
これらのメソッドは、非常に複雑な方法で画像の色を変更し、通常、画像の陰影や強度を調整して、一部の領域を明るく、他の領域を暗くするために使用されます。- 照明合成メソッドは、関連する演算子の3つのサブカテゴリに分類されます。
- 「焼き込み」は、一般的に画像を暗くします。
- 「覆い焼き」は、一般的に画像を明るくします。
- 「ライト」は、画像の1つの明るさや暗さに基づいて、画像を暗くしたり明るくしたりします。
Multiply
」(色を暗くする)は、一般的に純粋な「焼き込み」合成演算と見なされ、「Screen
」(明るくする)は「覆い焼き」合成演算子です。通常、一方の画像はカラーパターンまたは写真で構成され、もう一方の画像は、画像を適切に明るくしたり暗くしたりするために使用されるグレースケール画像です。どちらの画像をカラーにするか、どちらをグレースケールにするかは議論の余地があり、メソッドの実装方法によって異なります。この点に関する標準はないため、注意と実験をお勧めします。これらの演算子の標準がないため、多くのユーザーがこれらの演算子を理解していないか、誤用しています。また、これらの合成メソッドを正しく使用する方法に関するガイドも実質的に存在しないため、以下の例を参考に最善を尽くしました。 ![[IM Output]](gradient_op_overlay.png)
オーバーレイ(グレースケールオブジェクトに色を追加する)
この合成メソッドは、「Multiply
」(暗くする)と「Screen
」(明るくする)の両方を同時に行うように設計されている点で非常に珍しいです。特定のピクセルに適用されるメソッドは、デスティネーション画像の値によって選択されます。これは「照明マスク」と見なすことができます。このため、デスティネーションは通常、色が追加されるグレースケール画像です。その式は次のとおりです。 | Dest <= 0.5 の場合 |
次に | 2*Src*Dest |
それ以外の場合は | 1-2*(1-Src)*(1-Dest) |
magick -size 64x64 gradient:yellow-blue gradient_yell-blue.jpg magick -size 64x64 gradient: -rotate 90 gradient_grey.jpg magick gradient_grey.jpg gradient_yell-blue.jpg \ -compose Overlay -composite compose_overlay_gradients.jpg |
![]() デスティネーション |
![]() |
![]() オーバーレイ |
![]() |
![]() 結果 |
Multiply
」や「Screen
」とは異なり、結合法則が成り立ちません。
magick gradient_yell-blue.jpg gradient_grey.jpg \ -compose Overlay -composite compose_overlay_gradients2.jpg |
![]() デスティネーション |
![]() |
![]() オーバーレイ |
![]() |
![]() 結果 |
-shade
」演算子の出力に色を追加するのに最適です。ただし、ハイライトのない領域で正しい着色を行うには、その演算子から完璧なミドトーンのグレーを生成するように非常に注意する必要があります。詳細については、シェードオーバーレイハイライトを参照してください。例えば、円が与えられた場合、それをシェーディングして3次元効果を生成し、その結果を元の画像で色付けして元の色を復元することができます。
magick -size 64x64 xc:dodgerblue \ -draw 'fill skyblue circle 32,32 7,27' circle_blue.jpg magick circle_blue.jpg -shade 120x30 -auto-level circle_shaded.jpg magick circle_shaded.jpg circle_blue.jpg \ -compose Overlay -composite circle_shaded_tinted.jpg |
![]() デスティネーション |
![]() |
![]() オーバーレイ |
![]() |
![]() 結果 |
オーバーレイ
」メソッドのより実践的な使用例については、「背景ジェネレーターの例」ページの「levels_3d」画像を参照してください。この合成メソッドの最大の問題点は、どちらの画像でも透明度が保持されないことです。つまり、どちらの画像でも見える部分は、結果にも表示されます。通常、この演算子は透明度を含まない画像で使用されます。これは通常、出力または背景画像の透明度を復元するために追加の手順が必要になることを意味します。透明度を保持する簡単な方法の1つは、出力画像のアルファチャンネルをオフにして、アクセスできないようにすることです。合成が完了したら、再度オンにすることができます。この例は、シェーディングされたシェイプ画像で示されています。別の方法は、元の画像の「マスク」またはコピーを保存し、そのマスクまたは画像を使用して透明度を復元することです。これを行う例は、オーバーレイカラーティントで提供されています。または、より複雑な例として、より良い3Dロゴ生成で示されています。![]() ![]() |
IMバージョン6.1.6までは、「オーバーレイ」合成メソッドは壊れており、純粋な黒または白の結果しか生成しませんでした(ほとんどの場合、純粋な黒の結果しか得られなかったでしょう)。その結果、ほとんどのIMユーザーはこの演算子を理解する機会がほとんどありませんでした。これが修正されたことで、ユーザーはこのメソッドを有効に活用できるようになりました。 |
![[IM Output]](gradient_op_hardlight.png)
ハードライト(画像にテクスチャまたはハイライト/シャドウを追加します)
これは「オーバーレイ
」と同じですが、ソース画像と出力画像が入れ替わっています。これら2つの演算子のグラデーション画像を比較すると、グラデーションが斜めに転置されていることがわかり、ソースと出力の入力が入れ替わっていることがわかります。その式は次のとおりです。 | Src <= 0.5 の場合 |
次に | 2*Src*Dest |
それ以外の場合は | 1-2*(1-Src)*(1-Dest) |
オーバーレイ
」がグレースケールでシェーディングされたオブジェクトに色を追加できるのに対し、「ハードライト
」は画像にグレースケールの照明効果を追加します。どちらのメソッドを使用するかは、画像の照明効果の追加についてどのように考えているかによって異なります。重要な違いは、画像メタデータを保持するために、または一時的にアルファチャンネルを無効にすることによって操作中にそれを保持するために、どの画像が出力画像であるかです。たとえば、ここでは、元の画像と同じサイズの純粋なグレー画像のぼかしをかけた「-raise
」操作を使用して「照明効果」を生成します。次に、これを「ハードライト
」を使用して合成し、その照明効果を画像に追加します。
magick rose: -fill gray50 -colorize 100% \ -raise 4 -normalize -blur 0x4 lighting_effect.png magick rose: lighting_effect.png \ -compose hardlight -composite compose_hardlight.png |
![]() デスティネーション |
![]() |
![]() オーバーレイ |
![]() |
![]() 結果 |
|
![]() |
ハードライト
」を使用することの欠点です。これに対処するために、オーバーレイされたテクスチャのコントラストを弱めたいと思うかもしれません。
|
![]() |
ソフトライト
」などの他の照明合成メソッドは、より直接的に優れた結果を生み出す可能性もあります。より良い例については、写真クックブックのテクスチャのオーバーレイを参照してください。「ハードライト
」シェーディングを使用する実際の例は、平面ソース画像から3D DVDカバーを生成するIMディスカッションフォーラムで提供されています。 「オーバーレイ
」と「ハードライト
」の両方のシェーディングは、本質的に同じ合成メソッドであることを覚えておいてください。唯一の違いは、画像の順序です。 ![[IM Output]](gradient_op_softlight.png)
ソフトライト(画像のソフトなハイライト)
「ソフトライト
」合成メソッドは、既存のカラー画像にもハイライトとシャドウを追加します。ただし、出力画像の色は、よりソフトなコントラストと、照明効果のより滑らかなグラデーションを生み出すように変更されます。「グレースケールマップ画像」(右側を参照)を注意深く見ると、実際には2つありますが、シャープな不連続性はないことがわかります。(次の「ペグトップライト
」も参照)。これは「ハードライト
」よりも「オーバーレイ
」合成に密接に関連しているため、通常、出力はグレースケールの照明マスクになります。これが意図的なものかどうかは不明ですが、「ハードライト
」とは異なり、メイン画像をシェーディング画像に合成する方が、逆の場合よりも優れていることを意味します。 :-(![]() ![]() |
警告:この照明効果は、「ハードライト 」よりも「オーバーレイ 」のように定義されています。ただし、グレースケールの照明画像を含めるべきものは不明です。ソースを使用すると、完全な黒と白の結果が生成される可能性がありますが、出力を使用してもこれらの極端な結果は生成できません。決定的な参照をお持ちの方がいらっしゃいましたら、お知らせください。 |
ソフトライト
」テクスチャマッピングを示します。
|
![]() |
granite:
」画像を使用しても、色の変化は「ハードライト
」や「オーバーレイ
」よりもソフトで強度が低くなっています。ただし、結果の画像に追加された純粋な黒の影や純粋な白のハイライトを取得することは決してありません。基本的に、「ソフトライト
」はよりソフトなテクスチャ効果があり、ソース画像の元の色を保持します。ここでは、純粋な黒、白、および完全なグレーカラーのオーバーレイを使用した結果として達成される色の変化を示します。
|
![]() ![]() |
ハードライト
」で行った場合、画像の側面は50%の暗くまたは明るくするだけでなく、純粋な黒と白になります。![]() ![]() |
IM v6.5.4-3より前は、「ソフトライト 」は期待どおりに機能せず、グレー以外の色合いの画像のオーバーレイに対して明るくしていました。実際には、公式の2004 SVG仕様に従って正しく実装されていることを確認しました。残念ながら、間違っていたのは実装ではなく仕様でした。2009年3月のSVG仕様で修正されました。そのため、IM v6.5.4-3以降では、この演算子は期待どおりに光シェーディング演算子として機能するようになりました。 |
![[IM Output]](gradient_op_pegtoplight.png)
ペグトップライト(ソフトライトのスムーズなバリエーション)
「ソフトライト
」は「ソフトライト
」または「オーバーレイ
」よりもはるかにスムーズですが、実際には2つの別々の関数を結合したものです。 「ペグトップライト
」メソッドは、「ソフトライト
」とほぼ同じ結果を生成しますが、不連続性がない単一のスムーズな関数を使用します。「ソフトライト
」で使用されている2つのマイナーな不連続性もありません。このため、実際にははるかにシンプルで高速です。その式は次のとおりです。 2*Src*Dest + Src2*(1 - 2*Dest)
詳細については、ペグトップソフトライト代替ページを参照してください。![]() ![]() |
警告:この照明効果は、「ハードライト 」よりも「オーバーレイ 」のように定義されています。 |
![]() ![]() |
「ペグトップライト 」合成メソッドは、IMバージョン6.5.4-3に追加されました。 |
![[IM Output]](gradient_op_linearlight.png)
線形ライト(非常にシンプルですが強力なシェーディングスキーム)
オーバーレイされたシェーディング画像に非常に敏感な別の画像シェーディングメソッド。純粋な黒と白の限界領域がはるかに大きくなっています。その式は次のとおりです。2*Src + Dest - 1
連続関数ですが、「線形ドッジ
」(「プラス
」合成と同等)と「線形バーン
」(画像を減算するために使用されるオフセット「プラス」)の組み合わせと考えることができます。![]() ![]() |
IM v6.5.4-3より前は、「線形ライト 」が正しく実装されていないことが証明されていました。 |
![[IM Output]](gradient_op_vividlight.png)
ビビッドライト(線形ライトのバリアント)
「ビビッドライト
」メソッドは、Photoshop 7で実装されているものと同じであり、基本的に「線形ライト
」メソッドのマイナーな改良版です。これが行うのは、極端なシェーディングを回避し、画像内の強い原色をより「鮮やか」にすることです。その式は次のとおりです。 | Src <= 0.5 の場合 |
次に | 1-(1-Dest)/(2*Src) |
それ以外の場合は | Dest/(2*(1-Src)) |
カラーダッジ
」と「カラーバーン
」の混合ですが、中間調の場合は「線形ライト
」です。![]() ![]() |
「ビビッドライト 」合成メソッドは、IMバージョン6.5.4-3に追加されました。 |
![[IM Output]](gradient_op_pinlight.png)
ピンライト
「ピンライト
」関数は、出力画像の中間調をより適切に保持し、そのシェーディングをより明るく、より暗いオーバーレイシェーディングに制限するように設計されています。これは、より拡散した「ソフト」な光源ではなく、小さなピンホール光源から生じる過酷でシャープな照明の変化をシミュレートするとされています。その式は次のとおりです。 | もし | Dest < 2*Src-1 |
次に | 2*Src - 1 |
elif | Dest > 2*Src |
次に | デスティネーション |
|
それ以外の場合は | 2*Src |
![]() ![]() |
「ピンライト 」合成メソッドは、IMバージョン6.5.4-3に追加されました。 |
![[IM Output]](gradient_op_lineardodge.png)
線形ドッジ(Photoshop「追加」合成)
「線形ドッジ
」のグラデーション画像(右)を「プラス
」のグラデーション画像と比較すると、2つの不透明な画像の場合、まったく同じ効果が得られます。その式はもちろん次のとおりです。 Src + Dest
つまり、透明度がない画像の場合、これらの2つのコマンドで画像「A
」と「B
」を使用すると、同じ結果画像「R
」が生成されます...
magick A B -compose Plus -composite R magick A B -compose LinearDodge -composite R |
![]() ![]() |
「線形ドッジ 」合成メソッドは、IMバージョン6.5.4-3に追加されました。 |
![[IM Output]](gradient_op_linearburn.png)
線形バーン(Photoshop「減算」メソッド)
「Linear Burn
」合成メソッドは、「Add Minus One」合成の一種で、'Linear Dodge
' または 'Plus
' 合成メソッドの入力画像と出力画像のすべてを反転した場合と同じ結果を生成します。その計算式は、Src + Dest - 1
です。Photoshopでは、これは「Linear Burn
」だけでなく、「Subtract
」としても知られています。つまり、入力画像のいずれか(例えば、ソース画像)を反転させると、その画像はもう一方の画像から減算されます。例えば、ソース画像を反転した場合の計算は以下のようになります。(1-Src) + Dest - 1 ==> Dest - Src
A
」から画像「B
」を減算して、同じ結果の画像「R
」を生成できます...
magick A B -compose minus_src -composite R magick B A -compose minus_dst -composite R magick A \( B -negate \) -compose linear_burn -composite R magick B -negate A -compose linear_burn -composite R |
Linear Burn
' が他方から減算する画像です。画像がソース画像であろうとデスティネーション画像であろうと関係ありません。ある意味で、この合成メソッドはより汎用性が高くなります。例えば、ここでは右側の円の画像(反転しています)を左側の画像から減算します。
magick circle_left.gif \( circle_right.gif -negate \) \ -compose LinearBurn -composite circle_subtract.gif |
![[IM Output]](circle_left.gif)

![[IM Output]](circle_right.gif)

![[IM Output]](circle_subtract.gif)
Linear Burn
' は画像のアルファチャンネルに直接適用することはできませんが、より数学的な合成メソッドのMinusは適用できます。![]() ![]() |
'Linear_Burn ' 合成メソッドは、IMバージョン6.5.4-3で追加されました。 |
![[IM Output]](gradient_op_colordodge.png)
Color_Dodge(Photoshopの除算)
この合成メソッドでは、ソースのオーバーレイ画像をマスクとして使用し、長期間の「光への露出」から背景画像を保護するような効果を生み出します。明るいマスクに露出した部分は明るく(またはドッジ処理)なり、黒い部分は変化しません。長時間、写真の上に物体を置いた場合、光にさらされた部分が時間の経過とともにゆっくりと白くなり、覆われた部分はそのまま残るような効果と考えることができます。純粋な黒のオーバーレイは画像を変化させませんが、純粋な白のオーバーレイは純粋な黒の部分を除いて、すべての背景色を白にします。しかし、'Screen
'(反転乗算)または 'Linear_Dodge
'(加算)ドッジ合成メソッドとは異なり、純粋な黒またはすべての白のデスティネーション画像は照明マスクの影響を受けません。つまり、グレーと純粋でない色を含む領域のみが影響を受けます。その計算式は、Dest / (1-Src)
です。ここに例と実用的な使用例が必要です。実際には、'ColorDodge
' と2つの 'Divide
' 演算子は同じ結果を生成できます。ただし、'ColorDodge
' は、「除数」として使用される画像を反転させ、演算子の「ソース」画像として使用する必要があります。例えば、画像「N
」(分子)を「D
」(分母)で割るこれらのコマンドはすべて、同じ結果の画像「R
」を生成します...すべての画像が同じサイズであると仮定します。
magick N \( D -negate \) -compose ColorDodge -composite R magick N D -compose DivideSrc -composite R magick D N -compose DivideDst -composite R |
Divide
」の例を参照してください。 ![[IM Output]](gradient_op_colorburn.png)
Color_Burn
これは、'Color_Dodge
' の逆であり、すべての入力画像と出力画像を反転させるのと同等です。その結果、背景画像は暗いマスキング画像によって暗くなり、白は暗くしません。しかし、'Multiply
' または 'Linear_Burn
' バーン合成メソッドとは異なり、純粋な黒またはすべての白のデスティネーション画像は照明マスクの影響を受けません。つまり、グレーと純粋でない色を含む領域のみが影響を受けます。その計算式は、1 - ( (1-Dest) / Src)
です。ここに例と実用的な使用例が必要です。このコマンドは、画像の除算を実装するための以前の数式と同じです。コマンドの最後の反転に注意してください。
magick N -negate D -compose ColorBurn -composite -negate R |
Color_Burn
' の使用法の1つは、暗いグラデーションの背景を純粋な黒にクリーンアップすることです。'Color_Dodge
' が背景を白に分割できるのと同様です。![]() ![]() |
IM v6.5.4-3より前では、'Color_Burn ' は正しく実装されていないことが証明されていました。 |
チャンネルコピーメソッド
これらの画像合成メソッドは、ある画像から別の画像に画像チャンネル情報を転送するように設計されています。ただし、チャンネルがコピーされる画像についてはいくつかの仮定があります。使用する前に、画像の色空間およびカラーチャンネル演算子のセクションを読んで、IMがメモリ内の画像のカラーチャンネルをどのように表現するかを理解することをお勧めします。最も便利なチャンネルコピー合成メソッドは、'Copy_Opacity
'(下記参照)です。これは、別のグレースケールマスク画像を使用して、既存の画像のアルファチャンネルだけを完全に置き換える(または追加する)最も簡単な方法です。Copy_Opacity(グレースケールマスクから透明度を設定する)
'Copy_Opacity
' 演算子の本来の目的は、ソース画像の透明度チャンネルをデスティネーション画像にコピーして、その画像の透明な部分を設定することでした。これは、アルファ透明度を持つ画像を合成するために特別に設計されたダフポーター演算子を使用してより一般的に行われます。例えば、デスティネーションが完全に不透明な場合(この演算子の典型的な使用法)、'Dst_In
' または 'Dst_ATop
' 演算子のいずれかが同じ結果を達成します。では、代替手段があるのに、'Copy_Opacity
' 演算子がなぜそれほど重要なのでしょうか?その答えは、この演算子が特別なケースをどのように処理するかです。オーバーレイ(ソース)画像にアルファチャンネルがない場合、この演算子はそれを単純なグレースケール画像マスクとして扱います。つまり、画像の既存のアルファチャンネルを、指定されたグレースケール画像で置き換えます。要約すると、グレースケール画像で黒いものは完全に透明と見なされ、白いものは完全に不透明と見なされます。これは非常に重要であり、非常に一般的に使用されるため、経験則として、Copy_Opacity
' 合成設定を使用して合成する前に、両方の入力画像のアルファチャンネルをオフにすることで、画像にアルファチャンネルがないことを確認できます。例えば、グレースケールの月の画像(描くのは簡単です)を作成し、それを青いプラズマグラデーションのマスクとして使用して、まだらな青い月を作成します。
|
![]() ![]() |
Dst_In
' を使用して、ソースオーバーレイの透明な領域をデスティネーションから減算します(この場合、両方の画像でアルファチャンネルを有効にして使用する必要があります)。この演算子については、フォントでマスク画像を使用すると画像マスクの編集でさらに詳しく説明しています。また、これらのページの他の多くの例でも使用されています。 Copy_Red、Copy_Green、Copy_Blue
ソース画像の指定されたカラーチャンネルをデスティネーション画像にコピーします。グレースケールRGB画像は3つのカラーチャンネルすべてに同じデータを持っているため、これらのメソッドはグレースケールチャンネル画像をコピーして、デスティネーション画像の指定されたチャンネルを置き換えるものと考えることができます。'Copy_Opacity
'(上記参照)がグレースケール画像で画像の「アルファチャンネル」を置き換えることができるのと同様です。これらのチャンネルコピーメソッドは、グレースケールチャンネル画像を介してカラーチャンネルを分離して再結合するためのさまざまなカラーチャンネル演算子の使用のおかげで、今日ではめったに使用されません。さまざまなグレースケールグラデーションパターンをマージすると、これらの演算子を使用して非常に興味深いカラー画像を生成できることに注意してください。いくつかの例については、生の合成演算子テーブルのカラーグラデーションの組み合わせをご覧ください。 Copy_Cyan、Copy_Magenta、Copy_Yellow
これらは、前のセクションの同じメソッドの同義語です。基本的に、RGB画像の「Red
」チャンネルは、CYMK画像の「Cyan
」チャンネルとしても使用されます。 'Green
' チャンネルと 'Magenta
' チャンネル、および 'Blue
' チャンネルと 'Yellow
' チャンネルも同様です。このため、「Cyan
」チャンネルをコピーすることは、「Red
」チャンネルをコピーすることと同じです。画像データが表しているチャンネルの種類は、メモリ内の画像の現在の色空間によって異なります。Copy_Black
これは、ソースからデスティネーションに「Black
」チャンネルが存在する場合、それをコピーするだけです。ただし、そのチャンネルはCMYK画像にのみ存在します。「Black」チャンネルが存在しない場合、これは何も行いません。これはおそらくバグです。おそらく、グレースケールの「Black」チャンネル画像を、デスティネーション画像の黒チャンネル(存在すると仮定)にコピーする必要があります。Hue(RGB画像のhueをデスティネーションにコピーする)
この演算子は、ソース画像のhue Hをコピーして、デスティネーション画像のhueを置き換え、背景の彩度Sと輝度L(または輝度Y?)は変更しません。これは、両方の画像がRGB色空間の画像であることを前提としています。RGB以外の色空間の画像でこれをテストしていません。Saturate(RGB画像の彩度をデスティネーションにコピーする)
ソースからデスティネーションに彩度Sをコピーします(画像がRGB色空間の画像であることを前提としています)。色のhue Hと輝度L(または輝度Y?)は変更しません。これは、両方の画像がRGB色空間の画像であることを前提としています。RGB以外の色空間の画像でこれをテストしていません。Luminize(RGB画像の輝度をデスティネーションにコピーする)
ソースから輝度L(輝度Yのことか?)をコピーし、色の色相Hと彩度Sは変更しません。これは両方の画像がRGBカラースペースで保存されていることを前提としています。RGB以外のカラースペースの画像ではテストしていません。色付け(色の色相と彩度をコピー先へコピーする)
ソースから色相Hと彩度Sをコピーし、色の輝度L(輝度Yのことか?)は変更しません。これは両方の画像がRGBカラースペースで保存されていることを前提としています。RGB以外のカラースペースの画像ではテストしていません。ある画像を別の画像に溶解
「-dissolve
」演算子が行うことは、制御された「Over
」合成メソッドを提供することです。与えられたパーセンテージに従って、オーバーレイ画像の透明度を調整してから、背景の上に重ねます。-
magick composite -dissolve {percent} overlay bgnd result
magick composite -dissolve {src_percent}x{dst_percent} overlay bgnd result
magick bgnd overlay -compose dissolve \
-define compose:args={src_percent},{dst_percent} \
-composite result
Over
」合成メソッドを使用)。さらに、100%の値を超えて継続すると(IM v6の新機能)、背景画像の溶解を開始します。言い換えれば、0〜100パーセントの範囲では、背景画像はまったく溶解されず(dst_percentは100%
)、100〜200の範囲では、オーバーレイはそのまま残り(src_percentは100%
に設定)、引数が200%
の値に達すると完全に消えるように背景が溶解されます。さまざまな溶解引数を使用した結果の表を次に示します...
|
![]() ![]() |
![]() |
-dissolve
」は、まず新しい画像を背景の上にゆっくりと溶解し、次に元の背景画像をゆっくりと溶解します。これは、透明な領域を含む画像に非常に適しています。背景の溶解を制御することもできるため、ある画像が上に溶解している間、背景を下に溶解するように配置できます。これは非常に優れていますが、画像間の適切なスライドショー形式の溶解にはあまり適していません。ある画像が重ね合わされると、画像は均等にマージされず、画像引数(および対応する溶解引数)を交換すると、異なる結果が生成されます。![]() ![]() |
100%〜200%の範囲、または2番目のパーセンテージ引数が機能するためには、背景画像にアルファチャンネルが含まれている必要があります。これは、デフォルトで透明度を含まないJPEG画像にとって特に重要なことです。
したがって、「 |
|
![]() |
Dissolve
'合成から完全に不透明な画像を取得できるのは、画像の1つ(通常は「背景」)が溶解されず(100パーセント値)、不透明なままの場合のみです。これが、少なくとも最初は「背景」に100の値を使用するのがデフォルトである理由です。以下は、特定の「-dissolve
」引数の特別なケースです...0x0 |
両方の画像が完全に透明に溶解します。 ' Clear '合成メソッドと同等。 |
|
---|---|---|
0 |
背景画像は変更されていません(ソースは透明になっています)。 ' Dst '合成メソッドと同等。 |
|
100 |
オーバーレイ画像を背景に通常重ねます。 ' Over '合成メソッドと同等。 |
|
200 |
空白のキャンバス上のオーバーレイ画像(背景が透明になっています)。 ' Src '合成メソッドと同等。 |
-dissolve
」合成メソッドは、特にカラーウォーターマークを使用して、画像による透かしの代替方法としてよく使用されます。2つの画像を一緒にブレンド
「-blend
」合成メソッドは、「-dissolve
」合成メソッドが元々提供しようとしていたものを提供します。 「-dissolve
」メソッドは画像を互いに重ね合わせますが、「-blend
」は与えられたパーセンテージ引数に従って両方の画像が等しく扱われる(単に一緒に追加されるだけ)ように画像をマージします。そのため、パーセンテージと画像引数を交換することで、(最終的な画像サイズを除いて)同じ結果を得ることができます。これは、「-dissolve
」メソッドでは当てはまりません。言い換えれば、「-blend
」は結合的(引数を交換可能)ですが、「-dissolve
」は結合的ではありません。
magick composite -blend {percent} overlay bgnd result |
単一のパーセンテージ値のみが与えられた場合、オーバーレイの溶解パーセンテージとして使用され、背景画像は正反対の量だけ溶解されます。つまり、「-blend 30
」はオーバーレイを30%、背景を70%溶解してから、2つの画像を一緒に追加します。したがって、これは「-blend 30x70
」と同等です。この結果、2つの画像の不透明度(重ねられた領域)は100%になります。
|
![]() ![]() |
![]() |
-blend
」を使用すると、オーバーレイせずに一方の画像をもう一方の画像にゆっくりと均等に置き換えることができます。たとえば、ブレンドの結果をディスプレイのサイズと同じサイズの黒いキャンバスに重ねると、ある画像が別の画像にゆっくりと溶解する、見栄えの良いスライドショープログラムを簡単に作成できます。また、画像が一緒に追加されるため(内部では'Plus
'合成演算子を使用)、カラーチャンネルの最大値を簡単にオーバーロードし、アーティファクトを生成できることがわかります。特に100%の白色は、すべてのカラーチャンネルがすでに最大値であるため、他の画像が何も表示されないようにします。ほとんどの場合、ブレンドの単一引数バージョンのみを使用する必要があることをお勧めします。![]() ![]() |
「-dissolve 」と同様に、背景画像を溶解するには、「-blend 」が正しく機能するために、背景画像にアルファチャンネルが含まれている必要があります。
したがって、「 |
-blend
」引数の特別なケースです...0x0 |
両方の画像が完全に透明に溶解します。 ' Clear '合成メソッドと同等。 |
|
---|---|---|
0 |
背景画像は変更されていません。 ' Dst '合成メソッドと同等。 |
|
100 |
空白のキャンバス上のオーバーレイ画像。 ' Src '合成メソッドと同等。 |
|
100x100 |
2つの画像が一緒に追加されただけ。 ' Plus '合成メソッドと同等。 |
|
50 |
両方の画像の平均。これは、「-evaluate-sequence mean 」画像シーケンス演算子と同等ですが、2つの画像があります。(画像の平均化も参照) |
ブレンドと溶解の比較
溶解とブレンドの両方で画像が半透明になりますが、「-dissolve
」は'Over
'を使用して画像を合成し、「-blend
」は'Plus
'を使用して画像をマージします。これはあまり重要ではないように思えるかもしれませんが、オーバーレイされていない画像の部分やオーバーレイが透明な領域で、2つの合成メソッドがどのように処理するかを定義するため、非常に重要になる可能性があります。例えば。
magick dragon_sm.gif star.gif -alpha on \ -compose dissolve -define compose:args=50 \ -gravity South -composite dissolve_50.png magick dragon_sm.gif star.gif -alpha on \ -compose blend -define compose:args=50 \ -gravity South -composite blend_50.png |
![]() 溶解 |
![]() ブレンド |
{dst_percent}
」引数を計算できるようにすると、完全に不透明になり、同じ結果が得られます。たとえば、ここで「ドラゴン」画像と組み込みの「バラ」画像をマージします。両方の画像を同じサイズにトリミングして、両方の完全に不透明な画像が互いに完全に重なり合うことができるようにします。
magick dragon_sm.gif rose: -crop 70x46+0+0 +repage -alpha on \ -compose dissolve -define compose:args=50 \ -gravity South -composite dissolve_50_opaque.png magick dragon_sm.gif rose: -crop 70x46+0+0 +repage -alpha on \ -compose blend -define compose:args=50 \ -gravity South -composite blend_50_opaque.png |
![]() 溶解 |
![]() ブレンド |
ブレンドを使用して単一の画像を修正する
ブレンドは基本的に、「補間関数」または「重み付け平均」であり、2つの完全に不透明な画像を制御された線形な方法で結合できます。つまり、ソースの30%と背景の70%を足して、新しい100%不透明な画像を生成します。ただし、2つの画像を結合する以上のことができます。特定の画像の明るさ、コントラスト、彩度、色付け、さらにはシャープネスを設定するためにも使用できます。このブレンドの使用法については、BugBear <bugbear@papermule.co.uk>によってWWW上で見つけられたドキュメント、「補間および外挿による画像処理(Grafica Obscuraのコピー、これは外部ソースから直接リンクすることはできません)で詳しく説明されています。この関数を使用するための詳細については、このドキュメントを読むことをお勧めします。![]() ![]() |
外挿機能は、IM v6.3.5-10の「-blend 」演算子に追加されました。 |
magick composite -blend 0 rose: -size 70x46 xc:black -alpha Set blend_dark_0.jpg magick composite -blend 50 rose: -size 70x46 xc:black -alpha Set blend_dark_50.jpg magick composite -blend 100 rose: -size 70x46 xc:black -alpha Set blend_dark_100.jpg magick composite -blend 150 rose: -size 70x46 xc:black -alpha Set blend_dark_150.jpg magick composite -blend 200 rose: -size 70x46 xc:black -alpha Set blend_dark_200.jpg |
![]() 0% |
![]() 50% |
![]() 100% |
![]() 150% |
![]() 200% |
---|
magick composite -blend 0 rose: -size 70x46 xc:'#808080' -alpha Set blend_gray_0.jpg magick composite -blend 50 rose: -size 70x46 xc:'#808080' -alpha Set blend_gray_50.jpg magick composite -blend 80 rose: -size 70x46 xc:'#808080' -alpha Set blend_gray_80.jpg magick composite -blend 100 rose: -size 70x46 xc:'#808080' -alpha Set blend_gray_100.jpg magick composite -blend 120 rose: -size 70x46 xc:'#808080' -alpha Set blend_gray_120.jpg magick composite -blend 150 rose: -size 70x46 xc:'#808080' -alpha Set blend_gray_150.jpg |
![]() 0% |
![]() 50% |
![]() 80% |
![]() 100% |
![]() 120% |
![]() 150% |
---|
magick rose: -type grayscale rose_gray.png magick composite -blend 0 rose: rose_gray.png -alpha Set blend_color_0.jpg magick composite -blend 50 rose: rose_gray.png -alpha Set blend_color_50.jpg magick composite -blend 100 rose: rose_gray.png -alpha Set blend_color_100.jpg magick composite -blend 150 rose: rose_gray.png -alpha Set blend_color_150.jpg magick composite -blend 200 rose: rose_gray.png -alpha Set blend_color_200.jpg |
![]() 0% |
![]() 50% |
![]() 100% |
![]() 150% |
![]() 200% |
---|
magick rose: -blur 0x5 rose_blurred.png magick composite -blend 0 rose: rose_blurred.png -alpha Set blend_blur_0.jpg magick composite -blend 50 rose: rose_blurred.png -alpha Set blend_blur_50.jpg magick composite -blend 100 rose: rose_blurred.png -alpha Set blend_blur_100.jpg magick composite -blend 150 rose: rose_blurred.png -alpha Set blend_blur_150.jpg magick composite -blend 200 rose: rose_blurred.png -alpha Set blend_blur_200.jpg |
![]() 0% |
![]() 50% |
![]() 100% |
![]() 150% |
![]() 200% |
---|
透かしオプション - 'Modulate
'を合成
「-watermark
」合成オプションまたは「modulate
」合成メソッドは、著作権のためにHSB空間で画像を変色させるためのものです。
magick composite -watermark {brightness}[x{saturation}] overlay bgnd result \ |
0
」の場合、画像の明るさは変更されませんが、「100
」の値は、明るさをオーバーレイ画像の強度に置き換えます。つまり、オーバーレイが黒の場合、コピー先は黒になり、白の場合、コピー先画像の色は完全に飽和されます。「彩度」はデフォルトで「100
」に設定され、最大の色飽和度を生成します。「0
」に設定すると、マスクされた領域は彩度が低下して白黒になります。さまざまな引数を使用した結果の表を次に示します...
|
![]() ![]() |
![]() |
-watermark
」引数に対する特殊なケースです。0 |
宛先画像には何も変更は加えられません。 | |
---|---|---|
100 |
オーバーレイが黒色の場合は宛先が黒色になり、オーバーレイが白色の場合は完全に彩度の高い色相になります。 | |
0x0 |
マスクされたオーバーレイ領域は、グレースケールに彩度が落とされます。 | |
100x0 |
グレースケールのオーバーレイは、単に宛先の上に「ATop 」で重ねられます。 |
コンポーズマスクを使用して、合成される領域を制限する
「magick composite
」コマンドと「-composite
」演算子も、3番目のマスク画像を受け取り、それによって「-compose
」メソッドによって影響を受ける領域を制限します。たとえば、2つの画像とマスク画像がある場合、マスクで定義された領域内でソース画像の一部を背景画像に重ねることができます。ただし、背景画像が最終的な画像のサイズを定義することに注意してください。マスク画像は、宛先画像の一部とみなされ、アルファ合成の結果によって宛先のどの部分を変更できるかを定義します。つまり、白い部分は変更できますが、黒い部分(およびマスク画像の外側の部分)はそのまま残されます。残念ながら、「-gravity
」と「-geometry
」の設定でソース画像の再配置が可能ですが、マスク画像は再配置されず、宛先画像と揃えたままになります。これを明確にしておきましょう。重力/幾何学的な設定は、マスクには適用されません。
magick
」バージョン(ソースと背景画像の引数が入れ替えられています)で、マスク画像は背景画像に対する相対的な移動を調整しています。
|
![]() |
magick
」コマンドの「-composite
」演算子は、最初に宛先または背景画像を定義することを覚えておいてください。結果は、マスクに「+10+25
」のオフセットを与えたように見えますが、ソース画像と背景画像はどちらも移動しません。マスクをソース画像と揃えたい場合は、ソース画像を別途マスクする方が良い場合があります(「Copy_Opacity
」またはその他の技術を使用)。これにより、配置の問題なく結果を背景に配置できます。同様の例を次に示しますが、今回は背景画像と同じサイズのグラデーションマスクを使用して、2つの画像をブレンドし、「浅瀬」効果を生成します。
|
![]() |
マスクと透明度の合成
上記から、3つの画像合成マスクを使用することは、オーバーレイ画像の透明度を設定するために「Copy_Opacity
」を使用し、それを背景に合成することに非常によく似ていると考えるかもしれません。そして、透明度のない画像(上記のような)の場合、その考えは正しいでしょう。しかし、それはすべてではありません。まず、マスクはソース画像ではなく宛先画像に結び付けられているため、オフセットや重力の影響を受けません。また、「Copy_Opacity
」とは異なり、マスク画像は純粋なグレースケール画像として扱われます。IMは、マスクが持つ可能性のあるすべてのアルファ透明度を無視します。そのため、マスク画像で「アルファチャネルをオフにする」ことを心配する必要はありません。そして最後に、マスクは変更された領域を制限することによって機能します。これは、ソース画像をマスクするだけとは大きく異なります。単純な「Over
」合成では、これはマスクがソース画像の透明度と乗算され、オーバーレイされる内容を制限するのと同じです。したがって、完全に不透明なソース画像の場合、ソース画像の透明度と考えることができます。たとえば、2つの円を通常どおりに重ね、次にマスクで宛先画像が変更される領域を制限して重ねます。
magick -size 60x60 xc:none -fill red -draw 'circle 35,21 35,3' m_src.png magick -size 60x60 xc:none -fill blue -draw 'circle 21,39 24,57' m_bgnd.png magick -size 60x60 xc: -draw 'polygon 0,59 59,0, 0,0' m_mask.png magick composite m_src.png m_bgnd.png m_over.png magick composite m_src.png m_bgnd.png m_mask.png m_over_masked.png |
![[IM Output]](m_src.png)
![[IM Output]](m_bgnd.png)

![[IM Output]](m_over.png)
![[IM Output]](m_src.png)
![[IM Output]](m_bgnd.png)
![[IM Output]](m_mask.png)

![[IM Output]](m_over_masked.png)
Src
」メソッドを使用しました。
|
![]() |
FUTURE: Using masked composition to overlay an object in front of a backdrop, but behind some foreground object. Also develop an animated example, of something being obscured by foreground objects in the destination.
![]() ![]() |
上記は、透明度を持つソース画像またはオーバーレイ画像が含まれる場合、または「Over 」コンポーズメソッド以外の他のアルファ合成を使用しようとした場合に、合成マスクに関する長期にわたる重大なバグでした。詳細については、「合成マスクのバグ」を参照してください。 |
画像タイルを使用したコンポーズ
「magick composite 」の「-tile 」設定は、「magick 」または「magick montage 」の同じ設定とは大きく異なります。与えられた場合、ソース画像が背景画像の上にタイル化されることを意味します。たとえば、ここでは、「カラースター」をネットスケープカラーマップ画像の上にタイル化します...
|
![]() |
magick composite
」操作に対するブール値のオンとオフのフラグにすぎません。したがって、背景画像をタイル化するために使用することはできません。それは、IMが背景画像を使用して結果の最終的なサイズを設定できないことを意味します。ただし、代わりに「Dst_Over
」を使用して、別の画像の下に画像をタイル化できます。
|
![]() |
magick
」コマンドでタイル化されたアルファ合成を実行する簡単な方法はありません。これは、メモリ内の既存の画像でタイル化を現在よりもはるかに簡単にするため、残念です。「magick」を使用した合成タイル化の基本的な手法は、元の画像を複製し、タイルキャンバスに示されているいずれかの方法を使用してタイル化することです。例:
|
![]() |
Multiply
」を使用して、ラベルの「白い背景」を置き換えています。「画像マスク、数学的合成の使用」も参照してください。特殊な合成メソッド
また、何らかの理由で追加された特殊な目的の合成メソッドもいくつかあります。数学(ユーザー定義の数学的コンポーズメソッド)
この合成メソッドは、ユーザーがさまざまな数学的コンポーズメソッドを定義できるように、4つの数値を受け取ります。4つの引数「A
」、「B
」、「C
」、「D
」は、次の式を定義します...A*Sc*Dc + B*Sc + C*Dc + D
Sc
」はソースまたはオーバーレイ画像であり、「Dc
」は背景または宛先画像です。4つの値はすべて指定する必要があります。たとえば、値「1,0,0,0
」を使用して、「Multiply
」コンポーズメソッドの同等のものを生成できます。
magick gradient_dst.png gradient_src.png \ -compose Mathematics -define compose:args='1,0,0,0' -composite \ mathematics_multiply.png |
![]() ソース |
![]() |
![]() デスティネーション |
![]() |
![]() 結果 |
Screen
:1-(1-Sc)*(1-Dc) => -Sc*Dc + Sc + Dc => -1,1,1,0
|
![]() |
LinearLight
」は、「0,2,1,-1
」の引数を使用して直接定義されます...
|
![]() |
コンポーズメソッド | 数学引数 |
---|---|
Multiply |
1,0,0,0 |
スクリーン |
-1,1,1,0 |
Exclusion |
0,1,1,-1 |
線形ドッジ |
0,1,1,0 |
線形バーン |
0,1,1,-1 |
線形ライト |
0,2,1,-1 |
|
![]() |
|
![]() |
![]() ![]() |
「Mathematics 」コンポーズメソッドは、IMバージョン6.5.4-3で追加されました。現在、「-compose 」演算子を使用した場合のみ使用できます。引数が必要なため、「magick composite 」コマンドからは使用できません。 |
Change_Mask(類似したピクセルを透明にする)
これは、宛先画像の特定のピクセルのみを完全に透明にするという珍しいメソッドです。つまり、現在のファズファクター設定に従って、指定されたソース画像と一致する宛先画像のピクセルです。たとえば、複雑な(ただし非常に異なる)背景に重ねられた画像に透明度を再追加するために使用できます。たとえば、これはまさにJesper Eijeが提示した問題でした...簡単です。JPEG画像の色は、ファイル形式の損失性のためにわずかな色の変化があることが多いため、非常に類似した色を一致させるには、わずかなファズファクター設定が必要になることに注意してください。また、画像の変更された部分が背景色やパターンと一致した場合、結果の画像またはマスクに「穴」が開いてしまうため、非常に類似した画像で使用する場合は常に注意が必要です。2つの画像を入れ替えて、背景画像を宛先画像として指定すると、オーバーレイされた画像によって置き換えられたり変更されたりした背景の部分を抽出できます。
|
![]() |
この合成方法は、ピクセルを完全に透明にするだけであり、アルファチャネルは常に結果の画像に追加されます。ただし、他のほとんどのアルファ合成方法とは異なり、宛先画像の色はクリアされません。そのため、アルファチャネルを反転させて、変更されていない色を取得できます。
|
![]() |
![]() ![]() |
「ChangeMask 」合成メソッドは、GIFアニメーションの透明度の最適化のためのメソッドを提供するために、IM v6.3.4に追加されました。3つ以上の合成メソッドを組み合わせることなく、必要な要件を提供する既存の合成メソッドはありませんでした。特に、透明度の最適化に必要なブール値(またはファズファクターの閾値処理)要件です。ただし、結果はそれ自体が非常に有用であるため、ユーザーが直接使用できるように公開されており、このやや複雑な合成メソッドの名前が定義されました。 |
画像マッピング効果メソッド
厳密には合成メソッドではない、いくつかの特別なメソッドもあります。ピクセル単位で2つの画像を直接結合するのではなく、ソースまたはオーバーラップ画像は、より大きな効果のための特別な制御マップです。それらが表すメソッドは比較的単純ですが、その使用法は非常に複雑であるため、独自の使用例セクションがあります。画像マッピング効果。これらの特別なメソッドには、... 「Blur
」メソッドは、ピクセル単位でさまざまな方法で画像をぼかすためのメソッドを提供します。幅広いDIY画像ぼかし効果を生成できます。詳細については、可変ぼかしマッピングを参照してください。 一方、「Displace
」メソッドは、特定画像歪みメソッドだけでなく、ガラス、レンズ、リップル効果も生成する、絶対および相対的なピクセルルックアップ変位技術を提供します。詳細については、歪みと変位マッピングを参照してください。