ImageMagick 使用例 -- 画像の合成
- 定義と用語
-
Over,Dst Over,Src,Copy,
Dst,In,Dst In,Out,Dst Out,
ATop,Dst ATop,Clear,Xor -
Multiply,Screen,Bumpmap,Divide,
Plus,Minus,ModulusAdd,ModulusSubtract,
Difference,Exclusion,Lighten,Darken,
LightenIntensity,DarkenIntensity, - 集合論の等価操作
- 数学的合成とアルファブレンド
- 画像合成を用いた画像チャンネル演算
-
Overlay,Hard Light,Soft Light,Pegtop Light,
Linear Light,Vivid Light,Pin Light,
Linear Dodge,Linear Burn,Color Dodge,Color Burn, -
Copy Opacity,Copy Red,Copy Green,Copy Blue,
Copy Cyan,Copy Magenta,Copy Yellow,Copy Black,
Hue,Saturate,Luminize,Colorize, -
Mathematics,Change Mask画像マッピング合成メソッド可変
Blur,Displaceマッピング 画像合成とは、透明度やアルファチャンネルを持つ、または持たない画像を組み合わせる手法です。これは通常、IM の "magick composite" コマンドを使って行われます。また、より大きな一連の操作の一部として、あるいは他の画像演算子の内部で実行される場合もあります。
IM における画像合成
画像合成とは、2 つの (そしてちょうど 2 つだけの) 画像をさまざまな方法で結合する処理のことです。これは アルファ合成 と関連しており、アルファ合成はオーバーレイのどの部分が透明であるかに基づいて結果を記述します。画像合成は、画像のブレンドや平均化、画像チャンネルの転送、変な形をした画像の断片の切り抜き・結合・重ね合わせのために使われます。あるいは、複雑な数学的演算の一部としても使われます。画像合成についての良い別の入門としては SVG Compositing in 30 Minutes があります。あるいは、より重要な画像合成メソッドを記述している SVG Alpha Compositing のページを読めば、正確な数学的詳細を知ることができます。以下のコマンドは、ImageMagick で利用できる 2 つの直接的な画像 'composite' メソッドです...
magick composite {_overlay_} {_background_} [{_mask_}] [-compose {_method_}] {_result_}
magick {_background_} {_overlay_} [{_mask_}] [-compose {_method_}] -composite {_result_}
"magick composite" コマンドは IM における従来からの合成方法です。専用のコマンドが存在すること自体が、画像合成がいかに重要であるかを示しています。"magick" の演算子 "[-composite](https://imagemagick.org/command-line-options/#composite)" も、より大きな画像処理タスクの一部として画像合成を行うことができます。</> "magick" を使う場合は、画像の順序が逆になることに注意してください。この順序は実用的なものです。なぜなら、あなたは一般に、画像を準備しマージして新しい画像を形成していくプライマリのキャンバスを扱っているからです。画像の順序は重要です。両方の手法 (とさらに多くのもの) の実用的な例は 複数画像のレイヤー で確認でき、続きを読む前に読んでおくことをおすすめします。
定義と用語
より重要な画像は background 画像であり、しばしば destination 画像とも呼ばれます。これは画像合成によって加工される画像です。background は、画像合成の最終的なサイズを決めるだけでなく、'comments'、'labels'、'density'、'profiles' などの メタデータ も保持されます。その位置は固定されており、通常はあなたが構築していくキャンバスを形作るため、background という名前が付いています。これを覚えておいてください!
overlay 画像、すなわち source 画像は、"[-compose](https://imagemagick.org/command-line-options/#compose)" メソッドが、固定された background あるいは destination 画像をどのように加工すべきかを制御します。この画像は固定された background 画像に対して相対的に再配置できます (通常は "[-geometry](https://imagemagick.org/command-line-options/#geometry)" と "[-gravity](https://imagemagick.org/command-line-options/#gravity)" の設定を使います)。ただし、overlay 画像と、それが含むあらゆるメタデータは、合成操作が終わると削除されます。
ときには 3 つ目の mask 画像がコマンドに追加されることもあります。この画像は、background 画像のどの部分が、結果として得られる合成によって、どの程度加工されるかを定義し制御するために使われます。詳細は下記の 合成マスク を参照してください。IM v6.5.3-4 以降では、特別な Define 設定 "compose:outside-overlay" (参照: Outside-Overlay 設定) を 'false' の値に設定することで、overlay 画像が覆う矩形領域の外側にある background 画像への加工を一切無効にできます。これがないと、いくつかの合成 method は、compose の定義の一部として、overlay で覆われていない領域をクリアしてしまいます。
実際の合成 method は "[-compose](https://imagemagick.org/command-line-options/#compose)" 設定によって制御され、その既定値は 'Over' です。つまり、source 画像が background 画像の 上に (Over) 描かれます。これは、ほとんどの人が画像合成を行うときに思い浮かべるものです。IM 使用例のこのセクションのほとんどは、さまざまな合成 'メソッド' が何をするのか、そしてそれらをどう活用できるのかを詳しく説明するために費やされています。合成メソッドの結果を見るには 合成メソッドの一覧表 を参照してください。一覧表はメソッドの意図された用途を示しているのではなく、さまざまなテスト画像からの生の出力を示しているだけです。合成メソッドは大文字小文字を区別せず、'_' や '-' の文字は任意です。そのため、合成メソッド "Dst_Over" は次のようにも指定できます: "dst_over"、"dst-over"、"DstOver"、"dstover"、あるいは "dstOVER" でさえも。これらはすべて同じ意味です。また、合成メソッドの 'Over'、'ATop'、'In'、'Out' は、より冗長な合成メソッド名 'Src_Over'、'Src_ATop'、'Src_In'、'Src_Out' の短縮形です。長い "[-compose](https://imagemagick.org/command-line-options/#compose)" メソッドの一覧に加えて、正しく動作させるために追加の数値引数を必要とするものもあります。"magick composite" コマンドでは、これらの引数は特別なオプション "[-dissolve](https://imagemagick.org/command-line-options/#dissolve)"、"[-blend](https://imagemagick.org/command-line-options/#blend)"、"[-watermark](https://imagemagick.org/command-line-options/#watermark)" ('modulate')、"[-displace](https://imagemagick.org/command-line-options/#displace)"、"[-distort](https://imagemagick.org/command-line-options/#distort)" を使って渡されます。IM v6.5.3-4 以降では、"magick" コマンドは Define 設定 "compose:args" を使うことで、"[-composite](https://imagemagick.org/command-line-options/#composite)" 演算子に特別な引数を渡せます。例については、下記の特別な Dissolve と Blend のメソッドを参照してください。
画像合成演算子
上で示した直接的な 2 画像合成スタイルとは別に、内部の画像処理の一部としてアルファ合成を使う画像操作が他にもいくつかあります。これらの操作は現在の "[-compose](https://imagemagick.org/command-line-options/#compose)" 設定の影響を受けますが、それぞれ独自の内部位置決めを使うか、あるいは レイヤー画像 の仮想キャンバスオフセットによる位置決め手法を使います。以下は、compose 設定の影響を受けることが知られているすべての演算子の一覧です...
画像のペアの合成 プライマリの画像合成演算子を使った実用的な例。原始的な "
magick composite" コマンドと、"magick" の -composite" 演算子の両方を扱います。この低レベルなメソッドは ジオメトリ/グラビティ設定 を使ってオーバーレイ画像の位置を決定します。 レイヤー演算子 画像 'layerimage' 演算子 "[flatten](layers.html#flatten)"、"[mosaic](layers.html#mosaic)"、"[-layers merge](layers.html#merge)" は、現在の画像シーケンス内の複数の画像すべてを、1 つの新しいキャンバスの上に重ねます。そのキャンバスのサイズと位置は、選んだレイヤー演算子によって決まります。これは 仮想キャンバス/ページオフセット設定 を使ってオーバーレイ画像の位置を決定します。 エッジ拡張演算子 各個別の画像を、内部的に用意されたキャンバスの上に重ねる演算子です。これには "[-border](https://imagemagick.org/command-line-options/#border)"、"[-frame](https://imagemagick.org/command-line-options/#frame)"、"[-extent](https://imagemagick.org/command-line-options/#extent)" などの演算子が含まれます。(参照: 画像の縁の追加/削除)。位置決め情報は使われませんが、"[-extent](https://imagemagick.org/command-line-options/#extent)" は単色背景画像の上に重ねるために、グラビティとジオメトリのオフセットを利用します。 画像の描画 "[-draw 'image...'](https://imagemagick.org/command-line-options/#draw)" の画像オーバーレイメソッドは、単一の外部 source 画像を destination 画像のリストの上に重ねます。これは "[mogrify](basics.html#mogrify)" で利用できる唯一の画像合成手法です。'overlay' 画像を外部ソースから取得することで、そのコマンドのリスト演算子を持たないという制限を克服しています。リサイズと位置の情報もユーザーによって与えられ、これらはグラビティの影響を受けることがあります。 マルチリスト Layers Composite "[-layers composite](anim_mods.html#composite)" 演算子は、2 つの別々の複数画像リストを、画像のペアを 1 組ずつ合成して、新しいマージ済みの複数画像シーケンスを形成できるようにします。また、画像のシーケンスを単一画像 (静的な 'overlay' 画像でも、静的な 'destination' 画像でもよい) と合成します。さらに、グローバルに普遍的な "[-gravity](https://imagemagick.org/command-line-options/#gravity)" の影響を受ける "[-geometry](https://imagemagick.org/command-line-options/#geometry)" オフセットと、そのグローバル位置からの個々の画像の仮想キャンバス "[-page](https://imagemagick.org/command-line-options/#page)" オフセットの両方を使える唯一の合成演算子です。この合成演算子は、画像アニメーション や他の画像シーケンス全体を合成する際に特に重要です。画像のペアを 1 組ずつ処理するスクリプトを必要としないからです。
オーバーレイ画像の位置決め
Composite のジオメトリ/グラビティ設定
通常のアルファ合成では、"[-geometry](https://imagemagick.org/command-line-options/#geometry)" 設定が "[-gravity](https://imagemagick.org/command-line-options/#gravity)" とともに使われ、source 画像を destination 画像に対して相対的に位置決めします。これらの設定の使い方は グラビティを使った画像の位置決め で非常に詳しく扱われています。"[-geometry](https://imagemagick.org/command-line-options/#geometry)" のサイズ成分は特別で、画像のリサイズ (ジオメトリ) を行うことに注意してください。"[composite](../static/img/compose/composite)" では source 画像をリサイズしますが、"[convert](../static/img/compose/magick)" では画像シーケンスの最後の画像がリサイズされます。これは技術的には 画像合成 とは別の側面です。ジオメトリによるリサイズ と Composite による画像のレイヤー化 を参照してください。アルファ合成では 'source' と 'destination' (あるいは 'background') の 2 つの画像だけが関わりますが、3 つ目の マスク画像 も提供されて合成の影響領域を制限することがあります。
レイヤーのキャンバス/ページオフセット
レイヤー画像の合成は、非常に異なる考え方を使います。すべての画像 (好きなだけ多く) が、与えられた順序で平等に扱われます。それらはすべて、各画像の左上隅を仮想キャンバスの 'origin' (既定のオフセット) に対して相対的に位置決めする "[-page](https://imagemagick.org/command-line-options/#page)" すなわち ページオフセット を持ちますが、グラビティはありません。複数の画像を処理するために、現在の "[-background](https://imagemagick.org/command-line-options/#background)" 色を使った新しい background 画像が、実行される操作に依存するサイズで生成されます。これは 'destination' 画像 (キャンバス) と見なされます。すべての画像が、この新しいキャンバスの上に 1 つずつ順番に合成されます。たとえ 2 つの画像しか与えられなくても、やはり新しい画像が作られ、2 回の別々の合成が適用されます。つまり、遅くなることがあります。すべての画像は 'source' 画像として扱われ、それらが列挙される順序が結果を決定します。ただし 'layer' オフセットはグラビティの影響を受けません。各画像が別々の 'canvas offset' を持てるため、複数画像の合成は 画像レイヤー演算子 や、アニメーション向けの 複数画像シーケンス合成 を使ってのほうがうまく適用できます。この 2 つのスタイルは非常に異なる位置決め手法であり、使おうとしている合成手法に正しいスタイルを使うことが重要です。
両方の位置決め手法
合成手法の中で唯一、複数画像リストの Layers Composition 演算子だけが、両方の位置決め方法を同時に使うことを可能にします。まず 2 つのリストが "[-geometry](https://imagemagick.org/command-line-options/#geometry)" と "[-gravity](https://imagemagick.org/command-line-options/#gravity)" を使ってグローバルに位置決めされ、それが各リストの最初の画像の仮想キャンバスサイズに適用されます。次に、リスト内の各個別の画像が、そのグローバル位置から "[-page](https://imagemagick.org/command-line-options/#page)" を使ってオフセットされ、最終的な位置が決定されます。もちろん、オーバーレイ画像が、提供された画像群の中の特定の destination 画像に収まらない場合、それはその画像によってクリップされます。そのため、destination 画像には、必要な適切なサイズに完全にコアレッセンスされた画像だけを使うのが一般に良い考えです。結果として得られる画像は、もちろんあとからサイズを再びトリミングできます。
Duff-Porter のアルファ合成メソッド
Duff-Porter の画像合成メソッドは、非常によく定義された 12 個のメソッドからなる伝統的な一式です。これらは、画像の透明度すなわち 'アルファチャンネル' の何らかの側面に従って画像がマージされるため、アルファ合成として知られています。これらの数学的定義は SVG Alpha Compositing のドキュメントで見つけられます。以下は、2 つの三角形の画像でこれら 12 個のメソッドの結果を示した古典的な一覧表です。
また、異なる画像の形状とグラデーションでより多くの合成メソッドを示した図を含む 合成メソッドの生の一覧表 も参照してください。既定の合成メソッド (完全に未定義のとき) は 'Over' であり、これはほとんどの人が画像を合成するときに通常望むものです。上記の各合成メソッドが何をするのかを理解し記憶するには、結果として得られる画像が次のように言ったときと同じになると考えるとよいでしょう...
**{_Source_} --{_compose_method_}--> {_background_}**
****
つまり、メソッド 'ATop' の結果として得られる画像は、"オーバーレイ画像が background 画像の 'ATop' (上に)" というのと等価です。意味としては、background 画像はその '形状' を保ちますが、source 画像の色がその background の '上に乗る' ということです。ただし、"[magick -composite](https://imagemagick.org/command-line-options/#composite)" 演算子を使う場合は画像の順序が逆になることを覚えておいてください。これら 12 個のメソッドは、2 つの画像のうちどちらが結果に 'visible' (見える) かを定義するだけでなく、source 画像で覆われていない画像部分にどう影響するかも定義します。つまり、元の 'background' がそのまま残されるか、完全にクリアされるかです。上記の一覧表で 'destination' 画像をわざと大きくしたのは、残りの画像がクリアされたかどうかを見られるようにするためです。これら 'clearing' (クリアする) メソッドは次のとおりです: '[Src](#src)'、'In'、'[Dst_In](#dstin)'、'Out'、'Dst_ATop'、'[Clear](#clear)'。IM v6.5.3-4 以降では、Define 設定 "compose:outside-overlay=false" を使うことで、Duff-Porter 合成が overlay された領域の外側の destination 画像をクリアするのを防げます。詳細は '[Copy](#copy)' と '[Clear](#clear)' の合成メソッド、および Outside-Overlay 設定 の例を参照してください。'[Copy](#copy)' は IM が提供する特別な '13 番目' の合成メソッドであることに注意してください。基本的には '[Over](#over)' 合成と等価ですが、overlay された領域で background をクリアします。ただし実装の面では、outside-overlay (すなわち背景のクリア) を無効にした '[Src](#src)' 合成です。 |
ImageMagick v5 およびそれ以前は、source 画像で overlay されていない領域を一切クリアしませんでした。これは Duff-Porter 合成演算子の誤った扱いであり、IM v6 の開発中に修正されました。 |
|---|---|
Duff-Porter のアルファ合成メソッドの最も重要な側面の 1 つは、いかなる '完全に透明な色付きピクセル' も決して可視化しないということです。これは重要です。なぜなら、画像の完全に透明な部分は未定義の色を持つからです。そこには実際、画像の可視結果に影響を与えることなく、任意の色の値が含まれている可能性があります。'透明度チャンネルの扱い' についての詳細は 画像の透明度の制御 を参照してください。これが、Duff-Porter 合成がしばしば好まれるマスキング手法である理由です。代替手段である '[CopyOpacity](#copyopacity)' は画像のアルファチャンネルを完全に置き換えてしまい、未定義の不可視な色を可視化してしまうことがあるのとは対照的です。 |
Over (オーバーレイ画像を背景の上に重ねる)
これは既定の合成メソッドであり、ある画像を別の画像の上に重ねるときに誰もが思い浮かべるものです。オーバーレイ画像は、'アニメーションのセル' や 'OHP の透明シート' を背景のシーンや画像の上に置けるのと同じように、background 画像の '上に' 置かれます。あまりに一般的なので、これ以上多くを語る必要はないと思います。では、1 文字の画像を背景画像の上に重ねる例を示しましょう。 |
magick -background none -fill white \
-font Ravie -pointsize 36 label:A label_A_white.png
magick composite -gravity center label_A_white.png rose: compose_over.gif
![[IM Output]](../static/img/compose/label_A_white.png)
![[IM Output]](../static/img/compose/compose_over.gif)
オーバーレイは上記のようにグラビティで中央に配置することも、"[-geometry](https://imagemagick.org/command-line-options/#geometry)" 設定を使って正確に位置決めすることもできます。背景の境界の外側に位置決めされた場合は、適切にクリップされるか無視されます。この例では、画像は "convert -composite" 演算子を使って重ねられていますが、背景の半分上の位置に配置されています。画像の順序が逆になっていることに注意してください。 |
magick rose: label_A_white.png \
-geometry +5-15 -composite convert_over.gif
Dst_Over (画像を背景の '下に' 置く)
他の 'Dst_' メソッドと同様、これはメソッドの 'Src_' バージョンとほぼ正確に同じように動作しますが、overlay 画像と background 画像が入れ替わります。そのため '[Dst_Over](#dstover)' は、source オーバーレイ画像を destination の '下に' 置くことと等価です。結果として、destination すなわち background 画像によって隠されていない source すなわち overlay 画像の部分だけが、下からのぞくように見えます。これは引数画像を入れ替えた '[Over](#over)' とまったく同じではありません。なぜなら、サイズ、位置決め、その他の画像メタデータは、依然として background すなわち destination 画像から来るからです。出力画像のサイズが 'background' 画像と同じであること、そして source 画像の位置が ("[-geometry](https://imagemagick.org/command-line-options/#geometry)" と "[-gravity](https://imagemagick.org/command-line-options/#gravity)" を使って) background に対して相対的であることを覚えておいてください。たとえば、ここでは元の白い A の '下に' 黒い 'A' のラベルを重ねます。黒い A を白い A の background に対して相対的に再配置できます。ご覧のとおり、これは画像サイズの拡大を気にする必要なく、くっきりした影を追加するのに最適です。 |
magick -background none -fill black \
-font Ravie -pointsize 36 label:A label_A_black.png
magick composite -compose Dst_Over -geometry +5+5 \
label_A_black.png label_A_white.png compose_under.png
![[IM Output]](../static/img/compose/label_A_black.png)
![[IM Output]](../static/img/compose/compose_under.png)
注目すべき重要な点は、background のサイズが保持される一方で、overlay の位置が background に対して相対的に変更でき、background によってクリップされるということです。これがこの演算子をそれほど重要で便利な演算子にしているものです。"magick composite" の "[-tile](https://imagemagick.org/command-line-options/#tile)" 設定も、画像の下にタイル状に敷き詰める方法として、この形の 'over' を非常に便利にします。たとえば、先ほど作った影付きの文字の下に、組み込みのチェッカーボードパターンをタイル状に敷き詰めてみましょう。 |
magick composite -compose Dst_Over -tile pattern:checkerboard \
compose_under.png compose_under_tiled.jpg
Src (背景画像の寸法に 'クロップ' する)
この演算子は background 画像を overlay 画像で完全に置き換えます。background の色と透明度は完全に捨てられ、元の destination と同じサイズの空白の画像が残り、その上に source 画像が適用されます。しかし、それの何が良いのでしょうか? 実は 2 つの良い点があります。第 1 に、実質的に background 画像を source 画像で置き換えながら、元の background 画像に関連付けられたすべてのメタデータを保持します。つまり、画像は変わりますがメタデータは変わりません。第 2 に、画像の内容が変わっても最終的な画像のサイズは変わりません。つまり、結果として得られる画像は元の background と同じサイズを持ちます。そのため、この演算子を使えば、source すなわち overlay 画像が、与えられた background 画像と同じサイズになるように (background のメタデータとともに)、効果的にクロップしたり縁を追加したりできます。たとえば、plasma 画像を作って、それを組み込みの rose 画像と同じサイズになるようにクリップしたいとします。これにより、rose 画像がどれくらいの大きさかを知る必要なく、それを実現できます。 |
magick composite -compose Src -size 100x100 plasma:tomato-dodgerblue \
rose: compose_crop.gif
![[IM Output]](../static/img/compose/compose_crop.gif)
もちろん上記は、plasma 画像の 'resize' ではなく "[-crop](https://imagemagick.org/command-line-options/#crop)" と等価です。元の画像のメタデータも保持されます。つまり、これが今や plasma 画像であっても、画像のメタデータはそれが依然として 'rose' 画像であり、"rose:" 画像ソースから来たものだと言うのです。
overlay が小さい場合、background 画像の残りの部分は透明度で置き換えられてそれを埋めます。ただし、background はアルファチャンネルを持っていなければならないことに注意してください。さもないと、余分な空間が黒 (アルファチャンネルなしで 'none' あるいは 'transparent' が持つ色) で埋められます。 |
magick composite -compose Src -gravity South \
hand_point.gif rose: -alpha set compose_expand.gif
Copy (画像をコピーまたは置換する)
この演算子は 12 個の 'Duff-Porter' 合成メソッドの 1 つではないため、上記の表には載っていませんでした。それでもなお非常に重要です。これは "Src" 合成メソッドとまったく同じように動作しますが、overlay された領域の外側の background 画像には手を触れません。つまり、コピー能力を overlay された領域だけに限定し、それ以外には何もしません。これにより、大きな画像の小さな一部を切り抜き、速度のためにその小さな画像で作業し、それから他の領域に手を触れることなく結果を大きな画像に 'copy' して戻すことができます。これにより、非常に大きな画像の画像処理を最適化できます。ここでは上で使ったのと同じ例を、'[Src](#src)' の代わりに '[Copy](#copy)' を使って示します。'Duff-Porter' アルゴリズムが要求するように IM が background の残りをクリアする時間を無駄にしないことを示しています。 |
magick composite -compose Copy -gravity South \
hand_point.gif rose: -alpha set compose_copy.gif
![[IM Output]](../static/img/compose/compose_copy.gif)
この演算子は '[Over](#over)' にも非常に似ていますが、source 画像の透明度もコピーされ、background 画像を完全に置き換える点が異なります。透明度がなければ、これは '[Over](#over)' とまったく同じように動作します。内部的には、特別な合成制御設定 "outside-overlay" を加工します (次を参照)。
Outside-Overlay 設定
IM v6.5.3-4 以降、合成メソッドが overlay された領域の外側にも影響するかどうかを制御する能力が、"compose:outside-overlay" を Define することでユーザーが制御できるようになりました。これは既定で 'on' ですが、値を "false" に設定することでオフにできます。たとえば、ここでは Copy 合成メソッド と等価なものを、より伝統的な Src 合成メソッド を使って示します。 |
magick rose: hand_point.gif -alpha set -gravity South \
-define compose:outside-overlay=false \
-compose Src -composite compose_copy_src.gif
![[IM Output]](../static/img/compose/compose_copy_src.gif)
このフラグを使う例については PageCurl の角のオーバーレイ を参照してください。
Outside-Overlay 対 SVG の 'clip-to-self'
"compose:outside-overlay" の define は、多くの点で SVG の 'clip-to-self' 属性を使うのに似ています。どちらも合成を overlay された領域だけに制限し、destination 画像の残りには影響を与えません。ただし、SVG の 'clip-to-self' は (マスクのように) 描画された領域だけに適用されるのに対し、IM の 'outside-overlay' 設定は source 画像が background 画像を overlay する完全な矩形領域に適用されます。これは SVG の合成マニュアルではあまり明確ではありません。与えられている例があまりうまく説明されておらず、非常に紛らわしくなっているからです。しかし、それらを理解しようとしたければ、SVG Composition 'clip-to-self' property または Understanding SVG 1.2 composition, clip-to-self を参照してください。書き込みマスク も、この種の制御を実現するために使えますが、与えられたマスクに従って形状を持った領域を使う点が異なることに注意してください。この点で、それは SVG の 'clip-to-self' 属性にはるかに近く、そこでは source 画像が書き込みマスクとしても使われます。
Dst ('no-op' な合成)
この演算子は何もしません。source すなわち overlay 画像は完全に無視され、destination すなわち background 画像は変更されないまま残ります。このメソッドの本当の用途は、他の画像演算子でアルファ合成操作を 'オフにする' 手段としてです。たとえば、(透明な background を持つ) rose 画像をフレームで囲むために Frame 演算子 を使いますが、"-compose Dst" を使って画像がフレームに追加されるのを防ぎます。言い換えると、結果の内側のフレームのサイズを設定するためだけに rose を使います。フレーム、そしてフレームだけが結果です。 |
magick rose: -alpha set -mattecolor Gold -bordercolor none \
-compose Dst -frame 7x7+3+2 compose_frame_dst.gif
![[IM Output]](../static/img/compose/compose_frame_dst.gif)
特別な Alpha Set 操作は、画像に アルファチャンネル が利用可能であることを保証します。さもないと、透明な中央ではなく黒い中央になってしまいます。"[-bordercolor](https://imagemagick.org/command-line-options/#bordercolor)" は、通常 source 画像の下に置かれるフレーム内側の色を定義します。'[Dst](#dst)' メソッドは、2 つの異なる IM コマンドを作る必要なく、大きく複雑なコマンド内でアルファ合成を無効にするためにスクリプト内でも便利です。
Dst_In (または source で背景を 'マスク' する)
'**Dst_In**' メソッドは、source 画像を background 画像の 'Copy_Opacity' マスクとして使うようなものです。これは、クッキーの抜き型がクッキー生地からクッキーの形を切り抜くように、background 画像から overlay 画像の形を取り除きます。たとえば、上記で作った装飾的な 'A' をマスクとして使い、rose 画像からその形を切り抜いてみましょう。 |
magick composite -compose Dst_In -gravity center \
label_A_white.png rose: -alpha Set compose_mask.png
![[IM Output]](../static/img/compose/compose_mask.png)
'[Copy_Opacity](#copyopacity)' メソッドとは異なり、この操作では overlay 画像のアルファチャンネルだけが使われるため、グレースケール画像をマスクとして使うことは できません。overlay 内のいかなる色も完全に無視されます。 | 'Dst_In' と 'Src_In' のメソッドが実際に行うのは、2 つの画像のアルファチャンネルを掛け合わせることだけです。(メソッドに応じて) 適切な画像の色が保持されます。
---|---
Dst_Out (または 'erase' 操作)
'[Dst_In](#dstin)' の 'クッキー生地' のたとえを使うと、'**Dst_Out**' メソッドの結果は、クッキーが切り抜かれたあとに残った生地です。これは overlay の形を使って、background 画像に穴を開けたり、一口かじり取ったりするために使えます。overlay 内のいかなる色も、ここでも完全に無視されます。 |
magick composite -compose Dst_Out -gravity center \
label_A_white.png rose: -alpha Set compose_erase.png
![[IM Output]](../static/img/compose/compose_erase.png)
これら 2 つの合成メソッドの数学的な式は、同じ画像セットに対して '[Dst_In](#dstin)' と '[Dst_Out](#dstout)' を使えば、ちょうどジグソーパズルのように ('[Plus](#plus)' メソッドを使って) それらを元どおりにつなぎ合わせられるように、明示的に設計されています。たとえば、ここでは上で生成した最後の 2 つの画像を ('[Plus](#plus)' 合成を使って) '加算' します。この画像は、(ピクセル単位で) 元の 'rose:' 画像とまったく同じです。 |
magick composite -compose Plus compose_mask.png compose_erase.png \
compose_rejoin.png
![[IM Output]](../static/img/compose/compose_rejoin.png)
画像の一部を消去するのは、どんなグラフィックスプログラムでも簡単な作業ではありません。たとえば、"[-draw](https://imagemagick.org/command-line-options/#draw)" 操作は画像に色を追加することしかできません。いったんキャンバスに適用された色を取り除くことはできません。ガラスのドアや窓に広告を描いている画家を考えてみてください。彼または彼女は塗料を加えることはできますが、その上から塗り重ねることで塗料を取り除くことはできません。消去したい形を透明なキャンバスに描くことで、'[Dst_Out](#dstout)' を使ってそれを作業中の画像から取り除けます。それは、画家が特別な形をしたぼろ布で湿った塗料を丁寧に拭き取るのに少し似ています。この形を使って、色のすべてあるいは一部を取り除き、完全にあるいは半透明にできます。たとえば、透明なキャンバスに三日月のシンボルを描きたいとします。このアルファ合成メソッドは、2 つの円を重ねることで、この難しい形を簡単に描けるようにします。 |
magick -size 70x70 xc:none -fill white -draw 'circle 35,35 35,5' \
\( -size 70x70 xc:none -fill black -draw 'circle 28,30 35,5' \) \
-alpha Set -compose Dst_Out -composite moon_crescent.png
![[IM Output]](../static/img/compose/moon_crescent.png)
| 2 つ目の画像は括弧内で作成して描画しなければなりません。そうしないと、"[-draw](https://imagemagick.org/command-line-options/#draw)" が overlay 画像と元の background の両方に描画してしまい、これは明らかに間違いです。 括弧を使わなかった場合、画像の消去された部分の周りに半透明の黒いピクセルの円ができることに気づくでしょう。私は知っています。この例を作っているときにそれが起こり、自分でもとても腹が立ちました。
---|---
ATop ('Over' だが背景画像にクリップする)
'[Over](#over)' に似ていますが、結果を background 画像の元の形状に制限します。言い換えると、destination のアルファチャンネルは変更されませんが、画像の色は source 画像の透明でない部分によって上塗りされます。background 画像が完全に不透明 (透明度なし) の場合、この操作は通常の '[Over](#over)' 合成とまったく同じように動作します。違いが出るのは、background が透明度を含み、それが overlay もクリップする場合だけです。これが便利なのは、destination のオブジェクト (形状) に制限されたライティングやシェーディングの効果を重ねる場合です。 たとえば、赤い円があって、それが 3 次元のボールであるかのようにハイライトを追加したいとします。円とハイライトを作り、それからハイライトを '[ATop](#atop)' を使って重ねて円に制限できます。 |
magick -size 70x70 xc:none \
-fill red -draw 'circle 35,35 10,30' red_circle.png
magick -size 70x70 xc:none -draw 'circle 35,35 35,20' \
-negate -channel A -blur 0x8 red_highlight.png
magick composite -compose ATop -geometry -13-17 red_highlight.png \
red_circle.png red_ball.png
![[IM Output]](../static/img/compose/red_ball.png)
| 白いハイライトの作成は、画像全体が確実に白くなるように "-negate" を使って行われました。これは "-blur" 演算子のバグを避けるために使われましたが、そのバグは現在 IM バージョン 6.2.4 で修正されています。この古いバグの詳細については 透明度を伴う Blur のバグ を参照してください。
---|---
同様に、ボール自体の境界にクリップされたぼやけた影をボールに追加して、さらに 3-D らしく見せることができます。以下のコマンドがどのようにこの結果を実現しているかを解明するのは、読者への練習問題として残しておきます。 |
magick moon_crescent.png -fx 0 -channel A -blur 0x7 \
red_ball.png +swap -compose ATop -composite red_ball2.png
![[IM Output]](../static/img/compose/red_ball2.png)
準備画像にもう少し気を配れば、上記の画像はさらにリアルにできます。この合成メソッドの用法を示すためとしては、悪くありません。'[ATop](#atop)' 合成メソッドを使うさらなる例は 3-D ロゴの生成 で見られます。
Clear (背景をクリアする。オーバーレイ画像を無視する)
これは、overlay 画像を完全に無視し、ただ background 画像をクリアするだけの珍しい合成メソッドです。これにより、複雑なプロジェクトのために、background 画像と同じサイズの透明あるいは黒のキャンバスを作るのに理想的なメソッドになります。overlay 画像は使われないので、1 ピクセルの "null:" 画像を overlay として使うのが良いでしょう。 |
magick composite -compose Clear null: rose: -alpha Set compose_clear.png
![[IM Output]](../static/img/compose/compose_clear.png)
もちろん Alpha Set 操作は (この場合は必要ありませんが)、画像を透明にクリアするときに使えるアルファチャンネルが destination にあることを保証します。アルファチャンネルを 明示的にオフにする と、関わる数学の都合上、演算子は画像を黒にクリアします。 |
magick composite -compose Clear null: rose: -alpha Off compose_black.png
![[IM Output]](../static/img/compose/compose_black.png)
特別な Define 設定 "compose:outside-overlay" を使うと、overlay 画像が透明度を含むかどうかに関係なく、このクリアを overlay された領域だけに制限できます。たとえば: |
magick rose: hand_point.gif -alpha Set -gravity South \
-define compose:outside-overlay=false \
-compose Clear -composite compose_clear_limited.gif
Xor (共有された領域をクリアする)
これは非常に奇妙で、ほとんど使われない合成メソッドです。2 つの画像を重ね、それから重なった領域を透明にクリアします。 |
magick -size 60x60 \
\( xc:none -fill blue -draw 'circle 21,39 24,57' \) \
\( xc:none -fill red -draw 'circle 39,39 36,57' \) \
-compose Xor -composite compose_xor_2.png
![[IM Output]](../static/img/compose/compose_xor_2.png)
上記の結果に 3 つ目の画像が xor されると、さらに興味深いことが起こります。 |
magick -size 60x60 compose_xor_2.png \
\( xc:none -fill green -draw 'circle 30,21 30,3' \) \
-compose Xor -composite compose_xor_3.png
![[IM Output]](../static/img/compose/compose_xor_3.png)
ご覧のとおり、複数の画像を重ねることで素晴らしい効果を生み出せます。偶数枚の画像が重なる部分はクリアされ、奇数枚の画像が重なる部分は最後に重ねた画像が透けて見える結果になります。
FUTURE: 半透明画像での Xor 効果は極めて奇妙になる。
これを探求し、その奇妙さを実証する例を作る。
数学的な合成メソッド
このグループの合成メソッドを使うと、画像で数学を実行できます。これはあまり便利には見えないかもしれませんが、画像の低レベルな操作にとって、これらのメソッドは通常思いつかないようなことを可能にします。前述の 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
![[IM Output]](../static/img/compose/gradient_src.png)
Source | | ![[IM Output]](../static/img/compose/gradient_dst.png)
Dest | | ![[IM Output]](../static/img/compose/gradient_result.png)
Result
---|---|---|---|---
基本的に、overlay (source) ピクセルの色の値を縦方向に、background (destination) ピクセルを横方向に使えば、その演算子をそれらの値で適用したときに得られる値を調べられます。上記の例では、'[Multiply](#multiply)' は一般に画像を暗くすること、そしてどちらかの入力画像の黒の値 (0) が黒の結果を生み出すことがわかります。これは非常に便利なことがあります。 ![[IM Output]](../static/img/compose/gradient_op_multiply.png)
Multiply ( ) (図やテキスト向けに白を透明にする)
これはより便利でありながら過小評価されている合成メソッドの 1 つで、2 つの画像の単純な乗算です。その式はもちろん: _Src_ *_Dest_ です。これは、一方の画像が純白なら、結果はもう一方の画像になることを意味します。逆に一方の画像が黒なら、結果は黒になります。これらの両極端の間では、一方の画像が destination 画像を与えられた量だけ暗くします。'Multiply' は画像を暗くするだけで、決して明るくしないことに注意してください。つまり、画像を黒に向かって '減衰させ' ます。これにより、この合成メソッドは 'Burn' スタイルの合成になります。(下記の ライティング合成メソッド を参照) |
magick label:Rose label_white.gif
magick composite -compose Multiply -gravity center \
label_white.gif rose: compose_multiply.gif
![[IM Output]](../static/img/compose/label_white.gif)
![[IM Output]](../static/img/compose/compose_multiply.gif)
このメソッドは多くの状況で非常にうまく機能しますが、特にテキスト画像のように、一方の画像がほぼ白い背景に黒 (またはグレースケール) の線を持つ場合に優れています。両方の画像が色のある領域を含む場合は、変わった結果になることがあります。言い換えると、この手法は、白あるいは非常に明るい色の背景を持つ線画の上に、画像や他の図を直接重ねるのに最適です。たとえば、レイトレース画像に含めるテキストのページに図を追加したいとします。この 'テキストのページ' は、私の 多面体の研究 の結果画像の中で見られます。2 つのグレースケール画像マスクが与えられれば、multiply は何らかのマスクに基づいて画像の一部を黒に消去する良い方法でもあります。これは線形に行われるので、マスクは純粋なブール値のオン/オフ画像ではなく、グレースケール画像であってもかまいません。数学的合成 を参照してください。画像をそれ自身と乗算するのは、実は画像の 2 乗的な暗化を生み出す便利な手法であり、明るい色は目立ったままで、他の色はより暗くなります。実際、これは値 "0.5" の Gamma 演算子、あるいは値 "2.0" の Evaluate PowerOf 操作と等価です。例については 星の生成器 を参照してください。これはより現実的な星の強度の分布を生み出します。あるいは、地理的な地図の上に重ねる前に、気象衛星の雲画像に使うこともできます。 ![[IM Output]](../static/img/compose/gradient_op_screen.png)
Screen (図やテキスト向けに黒を透明にする)
これは '[Multiply](#multiply)' とほぼ正確に同じですが、合成の前に両方の入力画像が反転され、最終結果も再び反転されて画像を通常に戻します。技術的な用語で言えば、この 2 つのメソッドは互いの '双対' です。それにより、その式は次のようになります: 1-(1-_Src_)*(1-_Dest_)。これは、一方の画像が純黒なら、結果はもう一方の画像になることを意味します。逆に一方の画像が白なら、結果は白になります。これらの両極端の間では、一方の画像が destination 画像を与えられた量だけ明るくします。'Screen' 合成は画像を明るくするだけで、決して暗くしないことに注意してください。これは 'Dodge' 合成として知られる合成スタイルです。(下記の ライティング合成メソッド を参照) この合成メソッドは、黒い背景の上に白いテキストを重ね、それからそれを他の画像の上に重ねるのに最適です... |
magick -background black -fill white label:Rose label_black.gif
magick composite -compose Screen -gravity center \
label_black.gif rose: compose_screen.gif
![[IM Output]](../static/img/compose/label_black.gif)
![[IM Output]](../static/img/compose/compose_screen.gif)
これを使って白い形を画像の上に重ねる例については 数学的マスキング を参照してください。 ![[IM Output]](../static/img/compose/gradient_op_bumpmap.png)
Bumpmap (グレースケール乗算)
'[Bumpmap](#bumpmap)' メソッドは本質的に '[Multiply](#multiply)' と同じですが、source 画像が重ねられる前にグレースケールに変換される点が異なります。言い換えると、source 画像が暗い場所ならどこでも画像を暗くします。これを '強度による乗算' のような演算子だと考えることもできます。たとえば... |
magick composite -compose Bumpmap -gravity SouthEast -geometry +3+3 \
hand_point.gif cyclops.gif -alpha Set compose_bumpmap.gif
![[IM Output]](../static/img/compose/compose_bumpmap.gif)
"hand_point.gif" 画像が適用前にグレースケール化されていることに注目してください。その本来の目的は、画像に (紙や布地のような) テクスチャを追加することです。ただし、画像を暗くすることしかできないので、画像を明るくも暗くもできる '[HardLight](#hardlight)' メソッド (下記を参照) ほどは便利ではありません。 ![[IM Output]](../static/img/compose/gradient_op_divide.png)
Divide, Divide_Dst, Divide_Src ( ) (シェーディング効果を除去する)
2 つの画像が互いに除算されます。どちらの画像がどちらを除算するかは、'Divide_Src' と 'Divide_Dst' のどちらが適用されるかによります。'Divide_Dst' の式は _Src_ / _Dest_ で、'Divide_Src' の式は _Dest_ / _Src_ です。画像合成と "magick composite" コマンドで通常定義される画像の順序のため、元のメソッド 'Divide' は次を意味していました...
**{_Source_} Divide {_background_}**
****
つまり、元のメソッド名 'Divide' は "Divide_Dst" の同義語であり、"destination で割る" ことを意味します。これは、表示されているグラデーションチャートを定義するのに使われている演算子でもあります。画像や演算子が入れ替わると非常に異なる結果が得られるため、画像の順序が非常に重要であることに注意してください。これは特に "magick" コマンドの場合に当てはまり、こちらは destination 画像が source 画像の前に来ます。destination 画像が、2 つの画像の合成結果の実際の最終サイズとメタデータを定義することを覚えておいてください。また、source 画像が destination 画像に対して相対的に位置決めされることも覚えておいてください。この合成メソッドは 写真からのビネット除去 で最も実用的に役立ちます。次の例では、背景除去の手段として使います。
正規化された色の値が使われ、これは通常 0.0 (黒) から 1.0 (白) の範囲なので、除算は実際には、'割る' 画像の中に現れる '黒' の量だけ、分子の画像を明るくします。さて、2 つの画像を割って、(演算子で指定されていないほうの) '分子' 画像が明るくなるというのは、奇妙に聞こえるかもしれません。しかし、それは非常に便利な操作です。これは、レンズのビネット、不良スキャン、あるいは経年による変色によって生じた、画像の暗い部分を効果的に除去できることを意味します。たとえば、手書きのテキストを非常に粗くスキャンした (フラッシュなしでデジタルカメラを使い、それからデジタルノイズを除去するためにサイズを縮小した) 画像があります。紙は縁が褪せていて、フラッシュが使われなかったので背景は非常に暗く、紙が完全に平らでなかったためにシェーディング効果があります。
画像のコントラストを強調するために画像を単に正規化するだけでは、縁の着色や他のシェーディング効果の除去には役立ちません。
magick text_scan.png -normalize text_scan_norm.png
しかし、画像をぼかして線を除去し、それから元の画像をそれで割ることで、画像から大まかなシェーディング効果をすべて効果的に除去できます。
magick text_scan.png \( +clone -blur 0x20 \) \
-compose Divide_Src -composite text_scan_divide.png
除算の結果、背景色が白になる一方で、テキストの細い線は鮮明なまま (ただしわずかに '細く') 残ります。ご覧のとおり、単に正規化するよりもはるかに鮮明ですが、アンチエイリアスの一部も除去されてしまいました。除数画像にいくつか追加の調整を加えることもできましたが、これは期待されるものに非常に近いです。小さいぼかしを使うと、アウトライン画像への着色 で示されているような、アーティスティックなアウトライン画像を生成する別の手段にもなります。この演算子は、Sparse Color グラデーション のような背景グラデーション生成器と組み合わせれば、単に画像全体をぼかすよりも良い背景の '除数' 画像を生成できます。
divide 演算子は、実は '[Color_Dodge](#colordodge)' 合成メソッドに似ていますが、除数画像が反転され、演算子の source 画像として使われる点が異なります。これは Photoshop で典型的に使われる合成ですが、画像を Swap して Negate する必要があるかもしれません。等価なものについては '[Color_Dodge](#colordodge)' を参照してください。 | IM v6.6.8-5 より前は、元の '[Divide](#divide)' メソッドだけが提供されていました (新しい '[Divide_Dst](#dividedst)' と等価)。
---|---
![[IM Output]](../static/img/compose/gradient_op_plus.png)
Plus ( ) (色を足し合わせてブレンドを作る)
overlay の色を background に加算します。本質的に、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 が SVG 標準に準拠しているため、'green' は (X11 の色名のような) 真の緑色ではなく、暗い、あるいは半分の明るさの緑です。真の RGB の緑は、上記の例で行ったように 'lime' の色で指定できます。
---|---
これは、別々のグラデーション画像を足し合わせる数学的演算子としても使われます。たとえば 'manhattan' 差分画像 の計算や、グラデーション数学 においてです。'[Plus](#plus)' は、画像に白いテキストを追加するためにときどき使われます。これは正しい用法では なく、いくつかのアンチエイリアスの不整合を生じることがあります。より良い方法は '[Screen](#screen)' 合成メソッドを使うことです。これは明るさを増す加算的な方法ではなく、乗算を使います。Linear Dodge 合成メソッド は '[Plus](#plus)' と等価ですが、より通常の '[Over](#over)' アルファブレンドを使います。
Plus と Plus ブレンド
'[Plus](#plus)' をより重要にしているのは、これが '[Over](#over)' ブレンドとは異なるブレンド関数を実装する、ほぼ唯一の数学的演算子だということです。これは色を '加算' するだけでなく、アルファチャンネルの値も '加算' し、これを既定で行うほぼ唯一の演算子です。これは重要です。なぜなら、補完的なマスク画像の正しい結合を可能にするからです。たとえば、Dst In と Out の画像のマージを参照してください。また、透明度を使って 2 つの画像の重み付き平均すなわち Blend を生成することも可能にします。'[Plus](#plus)' のこの特別なブレンド方法がなければ、これらの特別な透明度の扱いの手法は通常は不可能でしょう。
IM v6.6.1-6 以降、"[-channel](https://imagemagick.org/command-line-options/#channel)" 設定から既定の 'Sync' フラグを取り除くだけで (適用したい特定のチャンネルを指定するだけで)、すべての 数学的な合成メソッド でアルファチャンネルに数学的演算子を使う能力が追加されました。下記の 画像合成を用いた画像チャンネル演算 を参照してください。これは、'[Plus](#plus)' 演算子が、この機能の影響を受けない唯一の 数学的な合成メソッド 演算子であることを意味します。すでに既定で適用されているからです。
![[IM Output]](../static/img/compose/gradient_op_minus.png)
Minus, Minus_Dst, Minus_Src ( )
結果は一方の画像をもう一方から減算したものです。どちらの画像がもう一方から減算されるかは、'Minus_Src' と 'Minus_Dst' のどちらが適用されるかによります。具体的には 'Minus_Dst' は、'destination を減算する' ことを意味し、"magick composite" コマンドで適用された場合は... 'Minus_Dst' の式は _Src_ - _Dest_ で、'Minus_Src' の式は _Dest_ - _Src_ です。画像合成と "magick composite" コマンドで通常定義される画像の順序のため、元のメソッド 'Minus' は次を意味していました...
**{_Source_} Minus {_background_}**
****
つまり、元のメソッド名 'Minus' は "Minus_Dst" の同義語であり、"destination を引く" ことを意味します。これは、表示されているグラデーションチャートを定義するのに使われている演算子でもあります。たとえば、上記の前回の '[Plus](#plus)' 操作の最終結果から円を減算します。 |
magick composite compose_plus_RGB.png -compose minus_dst compose_R.png \
compose_minus.png
![[IM Output]](../static/img/compose/compose_minus.png)
アルファチャンネルの扱われ方に注目してください。これは '[Plus](#plus)' を除く他のすべての数学的演算子と同じです。数学的合成とアルファブレンド を参照してください。この扱いは、特別な 'Sync' チャンネルフラグの使用によって変更できます。詳細は下記の 画像チャンネル演算 を参照してください。'[Linear Burn](#linearburn)' 合成メソッドも色の減算に使えますが、減算する画像をユーザーが反転させることで動作します。詳細は Linear Burn 合成メソッド を参照してください。 | IM v6.6.8-5 より前は、元の '[Minus](#minus)' メソッドだけが提供されていました (新しい '[Minus_Dst](#minusdst)' と等価)。
---|---
![[IM Output]](../static/img/compose/gradient_op_modulusadd.png)
ModulusAdd
'[ModulusAdd](#modulus_add)' は '[Plus](#plus)' によく似ていますが、結果が白を超えた場合に黒へ折り返される (剰余をとる) 点が異なります。たとえば、2 つのグレースケールのグラデーションを加算すると、最も明るい色が折り返されて 2 つ目のグラデーションを形成します。 |
magick -size 60x60 gradient: gradient.png
magick composite gradient.png gradient.png -compose ModulusAdd compose_add.png
![[IM Output]](../static/img/compose/compose_add.png)
この剰余タイプの合成は、次のような非常に興味深いグラデーションを生み出すために使えます。 |
magick composite gradient.png \( gradient.png -rotate -90 \) \
-compose ModulusAdd gradient_diagonal.png
![[IM Output]](../static/img/compose/gradient_diagonal.png)
そして、複数回の剰余加算は、ベネチアンブラインドのような繰り返しのグラデーションを作れます。 |
magick gradient.png \( +clone +clone +clone +clone \) \
-background gray50 -compose ModulusAdd -flatten gradient_venetian.png
![[IM Output]](../static/img/compose/gradient_venetian.png)
これは 5 回繰り返されたグラデーションを生み出します。グラデーションを剰余の半周期分だけ前方に効果的に '転がす' ために、'gray50' の背景をどう使っているかに注目してください。 ![[IM Output]](../static/img/compose/gradient_op_modulussubtract.png)
ModulusSubtract
'[ModulusSubtract](#modulus_subtract)' 演算子は '[Minus](#minus)' と同じですが、剰余減算である点が異なります。'gray' から 'white' を引くと、値が折り返されるため、黒ではなく元の 'gray' になります。剰余減算の副作用として、一見すると制御できない形で、一部が黒ではなく白になることがあります。 |
magick composite -compose subtract compose_plus_RGB.png compose_R.png \
compose_subtract.png
![[IM Output]](../static/img/compose/compose_subtract.png)
反転した画像 で '[ModulusAdd](#modulus_add)' を行うと、同じ結果が得られます。 ![[IM Output]](../static/img/compose/gradient_op_difference.png)
Difference (画像比較と選択的な反転)
結果として得られる画像は、色の値の絶対差です。その式は: abs(_Src_ - _Dest_) です。'black' と 'white' の差は最大の結果である白を生み出し、同じ色どうしは黒を生み出します。基本的に、画像比較の単純な形です。この合成メソッドのより一般的な用途は、同じサイズの 2 つの画像を比較してそれらがどう異なるかを見たり、その差のパーセンテージを算出したりすることです。この演算子は典型的に 比較差分画像 を生成するために使われます。この演算子は画像を選択的に反転するためにも使えます。黒を重ねても background には影響しませんが、白を重ねるとその位置の画像の色が反転されます。言い換えると、この演算子 (および次の演算子) は、画像でマッピングされた 反転 演算子を提供します。 たとえば、rose 画像の半分を反転してみましょう。 |
magick -size 2x1 pattern:gray50 -scale 70x50\! black_n_white.gif
magick composite black_n_white.gif rose: \
-gravity center -compose difference compose_negate.gif
Exclusion (グレーを除いた画像差分)
その式は: _Src_ + _Dest_ - 2*_Src_ *_Dest_ です。これはいわば平均化された差分です。白に白では黒 (差なし) になり、黒に黒でも同じです。ただし、グレーにグレーではグレーの結果になります。白と黒はもちろん依然として白 (最大の差) を生み出します。別の見方をすれば、明るい画像領域がそれぞれ他方のレイヤーへの反転を引き起こします。非常に暗い領域は何も変えません。この点で Exclusion メソッドは '[Difference](#difference)' (前述を参照) と同じです。この演算子の 1 つの用途は、Displacement Maps で使われるような 'バイアスのかかったグラデーション' を乗算することです。これらは、50% グレーの値が 'ゼロ' と見なされ、より暗い色が '負' の値を、より明るい色が '正' の値を表し、値が -1 から +1 の範囲をとるグラデーションです。詳細は バイアスのかかったグラデーションの乗算 を参照してください。Joe Fry によって提供されたこの合成メソッドのもう 1 つの用途は、複数の差分画像をマージする方法です。最終的な画像は、2 つの画像の間だけでなく、すべての画像の変化を示します。つまり、画像 A、B、C が与えられたとき、まず A, B と B, C の差分画像を生成し、それからその結果に exclusion を使うことで、3 つの画像すべてがどう変化したかを示す 1 枚の画像が得られます。このメソッドは、Xor 合成のブレンド演算子がアルファ透明度の値を扱う方法とも密接に関連しています。
![[IM Output]](../static/img/compose/gradient_op_lighten.png)
Lighten と Darken (最大値/最小値を選ぶ)
| source と destination の画像の色の値を比較し、それぞれより明るい、あるいはより暗い値をとります。 Lighten の式は: | _Src_ > _Dest_ の場合 |
なら _Src_ |
|---|---|---|
そうでなければ _Dest_ |
||
| darker の場合は、比較を逆にするだけです。 |
'[Lighten](#lighten)' の 1 つの用途は、元の画像のぼかし版を合成し、元の画像の 'ハイライト' に柔らかな輝きを加えることです。
magick flower_sm.jpg \( +clone -blur 0x3 \) \
-compose Lighten -composite flower_softglow.jpg
似たような結果を達成するためのより良い方法 ('ブレンドされたぼかし手法' を使う) については Soft Blur を参照してください。
これらの演算子は個々の 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
赤のグラデーション画像では青チャンネルがゼロで、その逆もまた然りであり、'[Lighten](#lighten)' 合成は色の値で動作するため、結果は赤と青の画像の単純なマージとなり、赤青のグラデーション画像を生み出します。つまり、上記は単純な チャンネルコピー合成 と等価でした。色の歪みを防ぐ 1 つの方法は、HSL 色空間 を使って演算子を画像の 'Lightness' チャンネルの調整だけに制限することです。ただし、それが常に良い結果を生むとは限りません。 | _"Gimp"、"Photoshop"、"PhotoLine"、"Paint Shop Pro" はすべて、IM とまったく同じようにチャンネルを直接比較することに注意してください。
"Photo-Paint" は色の強度で画像を比較し、それを使ってどの画像から色を選ぶかを決めるため、色の整合性を保ちます。下記の Lighten-Intensity メソッド を参照してください。
一方、"Picture Publisher" と "PhotoImpact" は、比較に (HSL 色空間で定義される) 色の明度を使います。
さまざまな色空間からのグレースケールの差の比較については、例 色空間を使ったグレースケール化 を参照してください。
Lighten-Intensity と Darken-Intensity (強度で色を選ぶ)
IM v6.6.9-5 において、'Lighten_Intensity' と 'Darken_Intensity' のバリアントが追加されました。これは 2 つの画像のピクセルの強度を比較し、その結果に基づいてピクセルの値を選びます。つまり、画像に新しい色は追加されませんが、新しい画像は両方の画像の色の混合になります。また、サイズとメタデータが destination 画像から来ることを除けば、画像の順序は問題になりません。たとえば、ここでは赤と青のグラデーションを含む画像のうち、より明るいほうをとります。
magick red_gradient.png blue_gradient.png \
-compose Lighten_Intensity -composite lighten_intensity.png
| ご覧のとおり、選ばれた画像からピクセル全体が選択されました。色チャンネルの混合は起こりません。ただし、青の強度は赤よりも暗いと見なされるため、最も暗い赤だけが、より暗い青のグラデーション画像から置き換えられます。 | この合成メソッドは、これまで見てきたすべての合成メソッドが使っている SVG 合成ガイド (2009) では定義されていません。そのため、アルファチャンネルがピクセルの比較にどう影響すべきかについての本当の定義はありません。 |
|---|---|
アルファに関して、このメソッドには 2 つの動作モードがあります。"[-channel](https://imagemagick.org/command-line-options/#channel)" 設定の特別な 'Sync' フラグが有効 (既定) の場合、比較はアルファ (透明度) チャンネルで重み付けされた色の強度に基づいて行われます。つまり、'半透明の白' は、'不透明の中間グレー' の色とほぼ同じ重み付き強度を持つことになります。
これは、他の条件が同じであれば、'[Lighten_Intensity](#lighten_intensity)' は形状を持つ画像の '和集合' を作り、一方 '[Darken_Intensity](#darken_intensity)' は (少なくとも非黒の) 形状を持つ画像の '積集合' を作ることを意味します。これは理想的ではなく、変更されるかもしれませんが、アルファ入力が全くないよりはましです。
2 つ目の動作モードは、'Sync' チャンネルフラグをオフにした場合 (下記の Sync フラグの使用 を参照) に使われます。たとえば "-channel All" を使う場合です。ピクセルの選択は、アルファによる重み付けの影響なしに、純粋に色の強度に基づいて行われます。ただし、アルファチャンネルの値は、実際に選択されたピクセルデータとともにコピーされます。透明度を持たない画像では、モードに関係なく結果は同じになります。この 2 つ目のモードでは、選択された場合に source から destination 画像へコピーされうるチャンネルを定義する、より制限された "[-channel](https://imagemagick.org/command-line-options/#channel)" を使うこともできます。ただし、選択は依然として、重み付けされていない純粋な色の強度だけに基づいて行われます。これは、2 つの画像の色の強度に基づいて、選択の '形状マスク' をより簡単に作れることを意味します。画像を色の強度に基づいて比較しますが、結果ではアルファチャンネルの値だけを気にします。'マスク' を作るには、一方の画像を完全に透明 (ただし色は持ったまま) にし (Alpha Transparent を使用)、もう一方の画像を完全に不透明 (既定) にします。最後に Alpha Extract を使って、そのピクセル位置でどちらの画像がより明るい色を持っていたかのマスクを取得できます。 |
magick red_gradient.png -alpha transparent blue_gradient.png \
-compose Lighten_Intensity -composite \
-alpha extract lighten_intensity_mask.png
![[IM Output]](../static/img/compose/lighten_intensity_mask.png)
2 つの画像のアルファ値は、単に 'オン' と 'オフ' である必要はなく、何らかの '参照' 値に設定できることに注意してください。つまり、それぞれ異なるアルファチャンネルの値を持つ画像の連なり全体を持つことができます。それから、この合成メソッドを使ってすべての画像をまとめて比較し、画像内の各位置でどの画像が最も明るい (あるいは最も暗い) ピクセルを含んでいたかのマップを取得できます。言い換えると、強度合成メソッドは、長い画像のリストに対する一種の '選択' あるいは '比較' 演算子として使えます。 | IM v6.6.9-5 において追加されました。ただし、このメソッドの正式な定義は見つかっていません。そのため、現在の実装は高度に実験的と分類され、ユーザーの提案に基づいて変更されるかもしれません。ただし、本質的な考え方は健全です。
---|---
古いバージョンの IM 向けの Intensity の代替
'[Lighten_Intensity](#lighten_intensity)' メソッドがお使いの ImageMagick のバージョンで利用できない場合、2 つの画像のグレースケールコピーに '[Lighten](#lighten)' を使い、その結果をグレースケールコピーと比較して、元の画像に適用する選択マスクを作ることで、純粋な色だけのバージョンを再現できます。これは簡単ではなく、以下はそのような解決策の 1 つです... |
magick red_gradient.png blue_gradient.png \
\( -clone 0--1 -colorspace Gray \
\( -clone 0--1 -compose Lighten -composite \) \
-delete 1 -compose Difference -composite -threshold 0 \
\) -compose Src -composite intensity_lightened.png
![[IM Output]](../static/img/compose/intensity_lightened.png)
かなりひどい処理の断片ですが、ご覧のとおり、ちゃんと動きます。'[Darken_Intensity](#darken_intensity)' バージョンを得るには、"-delete 1" を "-delete 0" に置き換えるか、あるいは "-compose Lighten" を "-compose Darken" に置き換えます。どちらでも動きます。
集合論の等価操作
上記の数学的メソッドのいくつかは、形状を使った集合論やブール演算を行うためにも使われます。'[Lighten](#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
'[Darken](#darken)' 合成メソッドは、ピクセルの '積集合' (ブールの 'And') を生み出します。
magick circle_left.gif circle_right.gif \
-compose Darken -composite circle_intersection.gif
'[Difference](#difference)' 合成メソッドは、2 つの集合の '排他的論理和' (ブールの 'XOR') を生み出します。
magick circle_left.gif circle_right.gif \
-compose Difference -composite circle_disjunction.gif
'[Exclusion](#exclusion)' メソッドもこの目的に使えますが、グレースケール (非ブール) の値を異なる方法で扱います。ただし、これは '[XOR](#xor)' の Duff-Porter アルファブレンドに使われるメソッドです。そして最後に、'[Minus](#minus)' は 2 つのピクセル集合の '相対補集合' を生成するために使えます。
magick circle_left.gif circle_right.gif \
-compose Minus_Src -composite circle_complement.gif
上記の '集合' あるいは 'ブール' 合成メソッドのいずれかを適用するとき、範囲外の値の生成を防ぐために、HDRI 版の ImageMagick では "[-clamp](https://imagemagick.org/command-line-options/#clamp)" が必要になることがあることに注意してください。
数学的合成とアルファブレンド
上記の数学的合成メソッドを使って、画像に対する数学的演算を実行できます。しかし、これには 1 つの大きな注意点があります。透明度を含む画像では、おそらく望むようには動作しないでしょう。既定では、上記の数学的合成のほとんどすべてが、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
![[IM Output]](../static/img/compose/alpha_src.png)
Source | | ![[IM Output]](../static/img/compose/alpha_dst.png)
Dest | | ![[IM Output]](../static/img/compose/alpha_result.png)
Result
---|---|---|---|---
画像の重なっていない部分は、加工されることなくそのまま結果の画像に含められただけであることに注意してください。つまり、画像は 'ブレンドされた' のです。さらに悪いことに、画像が部分的な透明度を含む場合、色の値はアルファチャンネルによって '重み付け' されます。これは Plus 合成 にとっては有用で、'重み付けされた色の加算' すなわち ブレンド操作 を提供しますが、画像における '色の重み付けされた乗算' の用途は、私はまだ見つけられていません。誰か? 画像数学を行っているとき、この挙動は一般に望ましくありません。とはいえ、そのような数学を行うときは、たいていアルファチャンネルも持たないので、'アルファブレンド' や '重み付けされた色' の問題はめったに生じません。 | _Plus 合成 は、'over アルファブレンド' を行わない唯一の 数学的な合成メソッド です。代わりに SVG 仕様 に従って、各チャンネルを別々に加算します。ただし、色チャンネルは加算される前に依然としてアルファ値で重み付けされ、(ブレンドという) アルファ値の扱いだけが異なります。
これは、DstOut 合成 で実証されているような、マスクされた形状の正しい '加算' を提供するために重要です。_
---|---
画像合成を用いた画像チャンネル演算
数学的な合成メソッド を使う対象の画像が、単に完全に不透明なグレースケール画像であるなら、上記のメソッドを問題なく直接それらに使えます。ただし既定では、合成メソッドは、上で見たようにアルファブレンドを伴って、すべての色チャンネルに適用されます。これにより、それらをアルファチャンネルのような特定のチャンネルだけに適用するのが難しくなります。たとえば、ここでは透明なグラデーションを含む 2 つの黒い画像を '[Multiply](#multiply)' します。既定の "[-channel](https://imagemagick.org/command-line-options/#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
![[IM Output]](../static/img/compose/alpha_grad_src.png)
Source | | ![[IM Output]](../static/img/compose/alpha_grad_dst.png)
Dest | | ![[IM Output]](../static/img/compose/alpha_grad_result.png)
Result
---|---|---|---|---
'Black' と 'Black' を掛けると 'Black' になるので、この例では色は変わらないことに注意してください。変更されるのは結果の透明度だけです。ただし、その結果は明らかに画像のアルファチャンネルの値の乗算ではありません。SVG 定義 により、半透明が 'over' メソッドを使ってブレンドされるからです。これは数学的には、アルファチャンネルの '[Screen](#screen)' 合成に等価であり、乗算ではありません。
Sync チャンネルフラグと数学的合成
IM v6.6.1-6 以降、数学的な合成メソッド は、"[-channel](https://imagemagick.org/command-line-options/#channel)" 設定の 'Sync' フラグに従うように変更されました。このフラグは事実上、"色とアルファチャンネルの操作を同期させる" ことを意味します。既定の "[-channel](https://imagemagick.org/command-line-options/#channel)" 設定は 'RGBK,Sync' です。そのため既定では、色とアルファのチャンネルは SVN 仕様に従って、'同期して' 適切に扱われます。ただし 'Sync' フラグを取り除くと、数学的な合成メソッド は、数学的関数を各チャンネルに別々に適用する 'チャンネル演算子' になります。 |
magick alpha_grad_dst.png alpha_grad_src.png \
-channel RGBA -compose Multiply -composite alpha_grad_nosync.png
![[IM Output]](../static/img/compose/alpha_grad_nosync.png)
そして、これがアルファチャンネルの正しい乗算です。
これはすべて、数学的な合成メソッド (上で詳述) と、特別な '[Mathematics](#mathematics)' 合成メソッド (下記を参照) にのみ適用されます。ライティング合成メソッド (次を参照) のような他の合成メソッドには適用されません。少なくとも今のところは。'Sync' フラグは、強度による Lighten/Darken 合成メソッド (SVG で定義された合成メソッドではない) がアルファチャンネルを扱う方法 (上記) にも影響します。画像数学の使用についての詳細は、グラデーションの数学 を参照してください。より具体的には、それらの例は、バイアスのかかったグラデーション画像 を生成するために数学的合成を使うことを見ており、これは少し込み入っています。
ライティング合成メソッド -- Light, Dodge, Burn
これらのメソッドは、非常に複雑な方法で画像の色を加工し、典型的には画像の陰影や強度を調整して、ある領域を明るく、別の領域を暗くするために使われます。
- ライティング合成メソッドは、関連する演算子の 3 つのサブカテゴリに分かれます。
- 'Burn'。一般に画像を暗くします。
- 'Dodge'。一般に画像を明るくします。
- 'Light'。一方の画像の暗さと明るさに基づいて、画像を暗くも明るくもします。
'[Multiply](#multiply)' (色を暗くする) は一般に純粋な 'Burn' 合成操作と見なされ、一方 '[Screen](#screen)' (明るくする) は 'Dodge' 合成演算子です。一般に、一方の画像は色のパターンか写真のいずれかで構成され、もう一方は画像を適切に明るくしたり暗くしたりするために使われるグレースケール画像です。どちらの画像を色にして、どちらをグレースケールにすべきかは議論の余地があり、そのメソッドがどう実装されたかによります。この点に関して標準はないので、注意と実験をおすすめします。これらの演算子に標準がないことの結果として、多くのユーザーがこれらの演算子を理解しない、あるいは誤用しています。これらの合成メソッドの正しい使い方についてのガイドも、私はまだ見つけられておらず、実質的に存在しないので、以下の例で精一杯のことをするしかありませんでした。 ![[IM Output]](../static/img/compose/gradient_op_overlay.png)
Overlay (グレースケールのオブジェクトに色を加える)
この合成メソッドは、画像を同時に '[Multiply](#multiply)' (暗くする) と '[Screen](#screen)' (明るくする) するように設計されている点で、非常に変わっています。特定のピクセルにどちらのメソッドが適用されるかは、destination 画像の値によって選択され、これは 'ライティングマスク' と見なせます。このため、destination は一般にグレースケール画像であり、それに色が加えられます。 その式は: |
_Dest_ <= 0.5 の場合 |
なら | 2*_Src_ *_Dest_ |
|---|---|---|---|
| そうでなければ | 1-2*(1-_Src_)*(1-_Dest_) |
||
| 結果は、destination 画像に存在する純粋な白と黒 (ハイライト) を保持しながら、その画像の中間調のグレーを overlay 画像に見られる色で着色する、特別な合成メソッドです。つまり、destination としてグレースケール画像が与えられると、この演算子は destination に存在するあらゆる影とハイライトの効果を保持しながら、source 画像を使ってその背景を着色します。 |
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
![[IM Output]](../static/img/compose/gradient_grey.jpg)
Dest | | ![[IM Output]](../static/img/compose/gradient_yell-blue.jpg)
Overlay | | ![[IM Output]](../static/img/compose/compose_overlay_gradients.jpg)
Result
---|---|---|---|---
ご覧のとおり、グラデーション画像の中間調のグレーが、提供された画像の色で着色されました。そしてこれが、グレースケールのライティングマスクに色を加えるという、この合成メソッドの通常の使い方です。このメソッドは、'[Multiply](#multiply)' や '[Screen](#screen)' とは異なり、結合的ではありません。
magick gradient_yell-blue.jpg gradient_grey.jpg \
-compose Overlay -composite compose_overlay_gradients2.jpg
![[IM Output]](../static/img/compose/gradient_yell-blue.jpg)
Dest | | ![[IM Output]](../static/img/compose/gradient_grey.jpg)
Overlay | | ![[IM Output]](../static/img/compose/compose_overlay_gradients2.jpg)
Result
---|---|---|---|---
グレーのハイライトの画像に色を 'overlay する' この性質は、このメソッドを "[-shade](https://imagemagick.org/command-line-options/#shade)" 演算子の出力に色を加えるのに最適にします。ただし、ハイライトのない領域で正しい着色を得るには、その演算子から完全な中間調のグレーを生成するように、非常に注意する必要があります。詳細は 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
![[IM Output]](../static/img/compose/circle_shaded.jpg)
Dest | | ![[IM Output]](../static/img/compose/circle_blue.jpg)
Overlay | | ![[IM Output]](../static/img/compose/circle_shaded_tinted.jpg)
Result
---|---|---|---|---
'[Overlay](#overlay)' メソッドを使うより実用的な例については、背景生成器の例 のページの "levels_3d" 画像を参照してください。この合成メソッドの最大の問題は、どちらの画像の透明度も保持されないことです。つまり、どちらかの画像で見えているものが、結果でも見えることになります。典型的にこの演算子は透明度を含まない画像に使われ、通常は destination あるいは background 画像の透明度を復元するために追加の手順が必要になることを意味します。透明度を保持する 1 つの簡単な方法は、destination 画像の アルファチャンネルをオフにする だけにして、アクセス不能にすることです。合成が完了したら、再びオンにする だけです。この例は シェードされた形状の画像 で与えられています。もう 1 つの方法は、'マスク' あるいは元の画像のコピーを保存し、それからそのマスクあるいは画像を使って透明度を復元することです。これを行う例は オーバーレイによる色付け で提供されています。あるいは、より複雑な例 より良い 3-D ロゴの生成 を参照してください。 |
IM バージョン 6.1.6 までは、'Overlay' 合成メソッドは壊れており、純粋な黒か白の結果しか生成しませんでした (おそらく純粋な黒の結果しか得られなかったでしょう)。その結果、ほとんどの IM ユーザーはこの演算子を理解する機会がほとんどありませんでした。これが修正された今、ユーザーはこのメソッドをうまく活用できるようになります。 |
|---|---|
![]() |
Hard_Light (画像にテクスチャやハイライト/影を加える)
これは '[Overlay](#overlay)' と同じですが、source と destination の画像が入れ替わっている点が異なります。これら 2 つの演算子のグラデーション画像を比較すると、グラデーションが対角線方向に転置されており、source と destination の入力の入れ替わりを示しているのがわかります。 その式は: |
_Src_ <= 0.5 の場合 |
なら | 2*_Src_ *_Dest_ |
|---|---|---|---|
| そうでなければ | 1-2*(1-_Src_)*(1-_Dest_) |
||
つまり、'[Overlay](#overlay)' がグレースケールのシェードされたオブジェクトに色を加えられるのに対し、'[Hard_Light](#hardlight)' は画像にグレースケールのライティング効果を加えます。どちらのメソッドを使うかは、画像のライティング効果を加えることをどう考えているかによります。重要な違いは、画像のメタデータを保持するため、あるいは操作中にそれを保持するために アルファチャンネルを一時的に無効にする ために、どちらの画像が 'destination' 画像であるかです。たとえば、ここでは元の画像と同じサイズの純粋なグレー画像のぼかした "[-raise](https://imagemagick.org/command-line-options/#raise)" 操作を使って 'ライティング効果' を生成します。それから、これを '[Hard_Light](#hardlight)' を使って合成し、それらのライティング効果を画像に加えます。 |
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
![[IM Output]](../static/img/images/rose.png)
Dest | | ![[IM Output]](../static/img/compose/lighting_effect.png)
Overlay | | ![[IM Output]](../static/img/compose/compose_hardlight.png)
Result
---|---|---|---|---
このメソッドは、(反射光のような) ハイライトや暗い影の効果の両方を、1 つの操作で既存の画像に簡単に加えられます。ここでは、画像に直接ライティングの 'テクスチャ' を加える例を示します。 |
magick rose: \( granite: -blur 0x.5 -normalize \) \
-compose hardlight -composite compose_texture.png
![[IM Output]](../static/img/compose/compose_texture.png)
結果のテキストがいかに強く、明暗の領域で元の画像をほとんど飲み込んでしまっているかに注目してください。これが '[Hard_Light](#hardlight)' を使うことの欠点です。これに対抗するには、重ねるテクスチャのコントラストを抑えるとよいでしょう。 |
magick rose: \
\( granite: -blur 0x.5 -normalize +level 30,70% \) \
-compose hardlight -composite compose_texture_muted.png
![[IM Output]](../static/img/compose/compose_texture_muted.png)
'[Soft_Light](#softlight)' のような他のライティング合成メソッドも、より直接的に良い結果を生み出すことがあります。より良い例については、フォトクックブック の テクスチャの重ね合わせ を参照してください。'[Hard_Light](#hardlight)' シェーディングを使う実生活での例は、平らな source 画像から 3D の DVD カバーを生成することについての IM 討論フォーラム で提供されています。'[Overlay](#overlay)' と '[Hard_Light](#hardlight)' のシェーディングは、本質的に同じ合成メソッドであることを覚えておいてください。唯一の違いは画像の順序です。 ![[IM Output]](../static/img/compose/gradient_op_softlight.png)
Soft_Light (画像のより柔らかなハイライト)
'Soft_Light' 合成メソッドも、既存のカラー画像にハイライトと影を加えます。ただし、destination 画像の色は、より柔らかなコントラストと、ライティング効果のより滑らかなグラデーションを生み出すように加工されます。'グレースケールマップ画像' (右を参照) を注意深く見ると、鋭い不連続が見当たりませんが、実際には 2 つあります。(次の '[Pegtop_Light](#pegtoplight)' も参照)。これは '[Hard_Light](#hardlight)' よりも '[Overlay](#overlay)' 合成に密接に関連しているので、destination は典型的にグレースケールのライティングマスクです。これが意図的かどうかは不明ですが、それが '[Hard_Light](#hardlight)' と異なる点であり、メイン画像をシェーディング画像の上に合成するほうが、その逆よりも良いことを意味します。:-( | _警告: このライティング効果は、'[Hardlight](#hardlight)' よりも '[Overlay](#overlay)' に近い形で定義されています。ただし、どちらがグレースケールのライティング画像を含むべきかは不明です。source を使うと完全な黒と白の結果を生み出せますが、destination を使うとこれらの極端な値は生成できません。
誰か決定的な参考文献をお持ちなら、教えてください。_
---|---
たとえば、ここでは 'Soft_Light' のテクスチャマッピングです。 |
magick rose: \( granite: -blur 0x.5 -normalize \) \
-compose softlight -composite compose_softlight.jpg
![[IM Output]](../static/img/compose/compose_softlight.jpg)
ご覧のとおり、正規化された "granite:" 画像でも、色の変化は '[Hard_Light](#hardlight)' や '[Overlay](#overlay)' よりも柔らかく、強度が抑えられています。ただし、純粋な黒の影や純粋な白のハイライトが結果の画像に加えられることも決してありません。基本的に '[Soft_Light](#softlight)' は、source 画像の元の色を保持する、より柔らかなテクスチャ効果を持ちます。 ここでは、純粋な黒、白、そして完全なグレーの色を重ねた結果として達成される色の変化を示します。 |
magick -size 1x3 gradient: -sample 70x46\! grayscale_3.gif
magick composite grayscale_3.gif rose: -compose softlight compose_softlight_2.gif
![[IM Output]](../static/img/compose/grayscale_3.gif)
![[IM Output]](../static/img/compose/compose_softlight_2.gif)
これを '[Hard_Light](#hardlight)' で行っていたら、画像の両端は 50% の暗化や明化ではなく、純粋な黒と白になっていたでしょう。 | _IM v6.5.4-3 より前は、'[Soft_Light](#softlight)' は期待どおりに動作せず、グレー以外の濃淡の画像を重ねるとすべて明化を生じていました。実のところ、それは公式の 2004 SVG 仕様 に従って正しく実装されていたことを私は確認しました。
残念ながら、間違っていたのは実装ではなく仕様のほうでした。それは 2009 年 3 月の SVG 仕様 で修正されました。そのため、IM v6.5.4-3 以降では、この演算子はライトシェーディング演算子に期待されるとおりに動作するようになりました。_
---|---
![[IM Output]](../static/img/compose/gradient_op_pegtoplight.png)
Pegtop_Light (soft light のより滑らかなバリエーション)
'[Soft_Light](#softlight)' は '[Hard_Light](#softlight)' や '[Overlay](#overlay)' のいずれよりもはるかに滑らかですが、実際には 2 つの別々の関数をつなぎ合わせたものに基づいています。'Pegtop_Light' メソッドは '[Soft_Light](#softlight)' とほぼ同一の結果を生み出しますが、いかなる不連続もない、'[Soft_Light](#softlight)' が使う 2 つの軽微な不連続さえもない、単一の滑らかな関数を使います。このため、実際にはるかに単純で高速です。その式は: 2*_Src_ *_Dest_ + _Src_ 2*(1 - 2*_Dest_) です。詳細は Pegtop SoftLight Alternative のページを参照してください。 |
警告: このライティング効果は、'[Hard Light](#hardlight)' よりも '[Overlay](#overlay)' に近い形で定義されています。 |
|---|---|
'[Pegtop_Light](#pegtoplight)' 合成メソッドは IM バージョン 6.5.4-3 で追加されました。 |
|
| --- | --- |
![]() |
Linear_Light (非常に単純だが強力なシェーディング方式)
Vivid_Light (Linear Light のバリアント)
Pin_Light
Linear_Dodge (Photoshop の 'Add' 合成)
'Linear Dodge' のグラデーション画像 (右) を '[Plus](#plus)' のものと比較すると、2 つの不透明な画像については、それらがまったく同じ効果を持つことがわかります。その式はもちろん: Src + Dest です。つまり、透明度のない画像については、画像 'A' と 'B' を使ったこれら 2 つのコマンドは、同じ結果の画像 'R' を生み出します...
magick A B -compose Plus -composite R
magick A B -compose LinearDodge -composite R
| このメソッドは、同じ名前の Photoshop の合成モードと等価です。2 つのメソッドの唯一の本当の違いは、半透明の色を含む画像をどう扱うかにあります。本質的に Linear_Dodge 合成 は 'Over' アルファブレンドを使うのに対し、Plus 合成 は 'Plus' アルファブレンドを使います。詳細は Plus ブレンド を参照してください。 | '[Linear_Dodge](#lineardodge)' 合成メソッドは IM バージョン 6.5.4-3 で追加されました。 |
|---|---|
![]() |
Linear_Burn (Photoshop の 'Subtract' メソッド)
'Linear Burn' 合成メソッドは 'Add Minus One' 合成であり、'[Linear Dodge](#lineardodger)' あるいは '[Plus](#plus)' 合成メソッドのすべての入力画像と出力画像を反転した場合と同じ結果を生み出します。その式は: _Src_ + _Dest_ - 1 です。Photoshop では、これは 'Linear Burn' として知られるだけでなく、'Subtract' としても知られています。なぜなら、入力画像の 1 つ (たとえば source 画像) を Negate すると、その画像がもう一方の画像から減算されるからです。たとえば、source 画像を反転したときの結果の数学は次のようになります...
(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](#linearburn)' がもう一方から減算する画像になります。その画像が source 画像であろうと destination 画像であろうと関係ありません。ある意味で、これがこの合成メソッドをより多用途にしています。たとえば、ここでは (反転した) 右側の円の画像を、左側のものから減算します。
magick circle_left.gif \( circle_right.gif -negate \) \
-compose LinearBurn -composite circle_subtract.gif
この合成メソッドは、単一の開始画像から複数の画像を減算するための Subtract Evaluate Sequence メソッド の代替としても便利です。ただし、'[Linear Burn](#linearburn)' は画像のアルファチャンネルに直接適用できないのに対し、より 数学的な合成メソッド である Minus は適用できることに注意してください。 |
'[Linear_Burn](#lineardodge)' 合成メソッドは IM バージョン 6.5.4-3 で追加されました。 |
|---|---|
![]() |
Color_Dodge (Photoshop の除算)
この合成メソッドは、source オーバーレイ画像を、長期間にわたる "光への露出" から background 画像を保護するようなマスクとして使います。より明るいマスクに露出された部分はより明るく (すなわち dodge され) なり、一方黒い領域は変化を生じません。これは、写真の上に非常に長い間オブジェクトを置き、光に露出された部分が経年でゆっくりと白くなる一方、覆われていた部分はそのまま残る、と考えることができます。純粋な黒のオーバーレイは画像を変えませんが、純粋な白のオーバーレイは、純粋な黒だった部分を除いて、すべての背景色を白にします。ただし、'[Screen](#screen)' (反転乗算) や '[Linear_Dodge](#lineardodge)' (加算) の dodge 合成メソッドのいずれとも異なり、純粋な黒あるいは全面が白の destination 画像は、ライティングマスクの影響を受けないまま残ります。言い換えると、グレーや純粋でない色を含む領域だけが影響を受けます。その式は: _Dest_ / (1-_Src_) です。 ここに例と実用的な用途が必要 実のところ、'[ColorDodge](#colordodge)' と 2 つの '[Divide](#divide)' 演算子は、同じ結果を生み出せます。ただし、'[ColorDodge](#colordodge)' は、'除数' として使われる画像を反転して、演算子の 'source' 画像として使う必要があります。たとえば、画像 '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](#divide)' を参照してください。 ![[IM Output]](../static/img/compose/gradient_op_colorburn.png)
Color_Burn
これは '[Color_Dodge](#colordodge)' の逆で、すべての入力画像と出力画像を反転することと等価です。結果として、background 画像は暗いマスキング画像によって暗くされ、一方白は暗化を生じません。ただし、'[Multiply](#multiply)' や '[Linear_Burn](#linearburn)' の burn 合成メソッドのいずれとも異なり、純粋な黒あるいは全面が白の destination 画像は、ライティングマスクの影響を受けないまま残ります。言い換えると、グレーや純粋でない色を含む領域だけが影響を受けます。その式は: 1 - ( (1-_Dest_) / _Src_) です。 ここに例と実用的な用途が必要 このコマンドは、画像の除算を実装するための前述の式の集合と等価です。コマンド内の最後の反転に注意してください。
magick N -negate D -compose ColorBurn -composite -negate R
'[Color_Burn](#colorburn)' の 1 つの用途は、暗いグラデーションの背景を純粋な黒に整えることです。'[Color_Dodge](#colorburn)' が背景を白に分割できるのとよく似ています。 |
IM v6.5.4-3 より前は、'[Color_Burn](#colorburn)' は誤って実装されていたことが判明しています。 |
|---|---|
チャンネルコピーメソッド
これらの画像合成メソッドは、ある画像から別の画像へ画像チャンネルの情報を転送するように設計されています。ただし、'チャンネル' がコピーされる元の画像について、いくつかの仮定をします。これらを使う前に、IM がメモリ内で画像の色チャンネルをどう表現するかを理解するために、画像の色空間 と 色チャンネル演算子 のセクションを読むことをおすすめします。最も便利なチャンネルコピー合成メソッドは 'Copy_Opacity' (下記を参照) です。これは、別個のグレースケールマスク画像を使って、既存の画像のアルファチャンネルだけを完全に置き換える (あるいは追加する) 最も単純な方法です。
Copy_Opacity (グレースケールマスクから透明度を設定する)
'[Copy_Opacity](#copyopacity)' 演算子の本来の目的は、source 画像の透明度チャンネルを destination 画像にコピーして、その画像の透明な部分を設定することでした。これは、アルファ透明度を持つ画像の合成のために特別に設計された Duff-Porter 演算子を使って行われるほうが一般的です。たとえば、destination が完全に不透明 (この演算子の使用では典型的) の場合、'[Dst_In](#dstin)' あるいは 'Dst_ATop' 演算子でさえも同じ結果を達成します。では、代替手段があるのに、なぜ '[Copy_Opacity](#copyopacity)' 演算子はそれほど重要なのでしょうか? 答えは、この演算子が特殊なケースをどう扱うかにあります。overlay (source) 画像がアルファチャンネルを持たない場合、この演算子はそれを単純なグレースケール画像マスクとして扱います。つまり、画像の既存のアルファチャンネルを、与えられたグレースケール画像で置き換えます。要約すると、グレースケール画像で黒のものは完全に透明と見なされ、白は完全に不透明と見なされます。これはあまりに重要で、あまりに一般的に使われるので、経験則にしておきます...
この演算子を使う画像は、いかなるアルファチャンネルも 含むべきではありません。
'[Copy_Opacity](#copyopacity)' compose 設定を使って合成する前に、両方の入力画像で アルファチャンネルをオフにする ことで、画像がいかなるアルファチャンネルも持たないことを保証できます。 たとえば、グレースケールの moon 画像 (描くのは簡単) を作り、それを青い plasma グラデーション のマスクとして使って、まだら模様の素敵な青い月を生み出します。 |
magick -size 70x70 xc:black -fill white -draw 'circle 35,35 35,5' \
-fill black -draw 'circle 28,30 35,5' \
moon_mask.gif
magick -size 70x70 plasma:white-dodgerblue moon_mask.gif \
-alpha Off -compose CopyOpacity -composite moon_gradient.png
![[IM Output]](../static/img/compose/moon_mask.gif)
![[IM Output]](../static/img/compose/moon_gradient.png)
保持する必要のある透明な成分が画像にある場合、これはあなたが必要とするアルファ合成演算子ではありません。おそらく、destination から source オーバーレイの透明な領域を減算するために、代わりに '[Dst_In](#dstin)' を使いたいでしょう (その場合、両方の画像はアルファチャンネルを有効にして使う必要があります)。この演算子は、フォントでのマスク画像の使用 と 画像マスクの編集 でさらに詳しく説明されています。これらのページ全体を通して、他の多くの例でも使われています。
Copy_Red, Copy_Green, Copy_Blue
source 画像の指定された色チャンネルを destination 画像にコピーします。グレースケールの RGB 画像は 3 つの色チャンネルすべてに同じデータを持つため、これらのメソッドは、グレースケールチャンネル画像をコピーして destination 内の指定されたチャンネルを置き換えるものと考えることができます。'Copy_Opacity' (上記を参照) が画像の 'アルファチャンネル' をグレースケール画像で置き換えられるのとよく似ています。これらのチャンネルコピーメソッドは、グレースケールチャンネル画像を介して色チャンネルを分離・再結合するさまざまな 色チャンネル演算子 の使用のおかげで、今日ではめったに使われません。さまざまなグレースケールのグラデーションパターンをマージするとき、これらの演算子を使って非常に興味深いカラー画像を生成できることに注意してください。いくつかの例については、生の合成演算子の一覧表 の色グラデーションの組み合わせを見てください。
Copy_Cyan, Copy_Magenta, Copy_Yellow
これらは前のセクションの同じメソッドの同義語です。基本的に、RGB 画像の 'Red' チャンネルが CYMK 画像の 'Cyan' チャンネルとしても使われるからです。'Green' と 'Magenta' チャンネル、そして 'Blue' と 'Yellow' チャンネルについても同様です。このため、'Cyan' チャンネルのコピーは 'Red' チャンネルのコピーと同じです。画像データがどの種類のチャンネルを表現しているかは、メモリ内の画像の現在の 色空間 によります。
Copy_Black
これも、'Black' チャンネルが存在すれば、それを source から destination へコピーするだけです。ただし、そのチャンネルは CMYK 画像にのみ存在します。'Black' チャンネルが存在しない場合、これは何もしませんが、これはおそらくバグです。おそらく本来すべきことは、グレースケールの 'Black' チャンネル画像を、destination 画像の (それが存在すると仮定して) black チャンネルにコピーすることでしょう。
Hue (RGB 画像の色相を destination にコピーする)
この演算子は、source 画像の色相 H をコピーして destination 画像の色相を置き換え、背景の彩度 S と輝度 L (あるいは輝度 Y か?) を変更しないまま残します。これは両方の画像が RGB 色空間の画像であることを前提としています。非 RGB 色空間の画像でこれをテストしたことはありません。
Saturate (RGB 画像の彩度を destination にコピーする)
(画像が RGB 色空間の画像であると仮定して) 彩度 S を source から destination へコピーし、色相 H と輝度 L (あるいは輝度 Y か?) を変更しないまま残します。これは両方の画像が RGB 色空間の画像であることを前提としています。非 RGB 色空間の画像でこれをテストしたことはありません。
Luminize (RGB 画像の輝度を destination にコピーする)
輝度 L (あるいは輝度 Y か?) を source から destination へコピーし、色相 H と彩度 S を変更しないまま残します。これは両方の画像が RGB 色空間を使って格納されていることを前提としています。非 RGB 色空間の画像でこれをテストしたことはありません。
Colorize (色相と彩度を destination にコピーする)
色相 H と彩度 S を source から destination へコピーし、色の輝度 L (あるいは輝度 Y か?) を変更しないまま残します。これは両方の画像が RGB 色空間を使って格納されていることを前提としています。非 RGB 色空間の画像でこれをテストしたことはありません。
ある画像を別の画像の上に溶け込ませる
"[-dissolve](https://imagemagick.org/command-line-options/#dissolve)" 演算子が行うのは、制御された '[Over](#over)' 合成メソッドを提供することです。これは、overlay 画像が background の上に重ねられる前に、与えられたパーセンテージに従ってその透明度を調整します。
**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
**
(IM v6 で新しく追加された) 2 つの引数を与えると、画像が重ねられる前に overlay と background の両方の画像をどれだけ溶け込ませるかを正確に定義できます。単一のパーセンテージ引数だけが与えられた場合、overlay だけが溶け込まされてその量だけ残り (0 パーセントは完全に透明、source 100 は変更なし)、それから ('[Over](#over)' 合成メソッドを使って) background の上に重ねられます。さらに、(これも IM v6 で新しく追加された) 100% を超えて続けると、今度は background 画像を溶かし去り始めます。言い換えると、0 から 100 パーセントの範囲では、background 画像はまったく溶け込まされず (dst_percent が 100%)、一方 100 から 200 の範囲では、overlay はそのまま残され (src_percent が 100% に設定)、background が溶け込まされ、引数が 200% の値に達すると完全になくなります。以下は、さまざまな dissolve 引数での結果の表です... |
magick composite -dissolve {_argument_} -gravity South \
star.gif dragon_sm.gif -alpha Set {_result_}
ご覧のとおり、"[-dissolve](https://imagemagick.org/command-line-options/#dissolve)" はまず新しい画像を background の上にゆっくりと溶け込ませ、それから元の background 画像をゆっくりと溶かし去ります。これは透明な領域を含む画像に非常に適しています。background の溶解も制御できるので、一方の画像が上に溶け込む間に、その下で background を溶かし去るように手配できます。これは非常に良いのですが、画像間の適切なスライドショースタイルの溶解にはあまり適していません。一方の画像が重ねられるとき、画像は均等にマージされず、画像引数 (と対応する dissolve 引数) を入れ替えると異なる結果が生じます。 |
100% から 200% の範囲、あるいは 2 つ目のパーセンテージ引数が機能するためには、background 画像がアルファチャンネルを含んでいなければなりません。これは特に、既定では透明度を一切含まない JPEG 画像にとって重要です。 そのため、'dissolve' 合成メソッドを適用する前に、"[-alpha](https://imagemagick.org/command-line-options/#alpha) Set" 演算子を使ってすべての画像にアルファチャンネルを与えるよう IM に指示するのが、おそらく良い考えです。 |
|---|---|
| 両方の画像で dissolve を使うことの最大の注意点は、透明度が平均に影響することです。つまり、2 つの画像を 50% で溶け込ませると、両方の入力画像が完全に不透明であっても、色は常に半透明になります。たとえば: |
magick dragon_sm.gif star.gif -alpha on \
-compose dissolve -define compose:args='50,50' \
-gravity South -composite dissolve_50_50.png
magick composite -compose Dst_Over -tile pattern:checkerboard \
dissolve_50_50.png dissolve_50_50_bg.png
![[IM Output]](../static/img/compose/dissolve_50_50_bg.png)
画像をチェッカーボードパターンの上に重ねたあと、画像のすべての部分が少なくとも半透明であることがわかります。ただし、実際に重ねられた部分は、source 画像の一方が透明である部分よりも透明度が低くなっています。'Dissolve' 合成から完全に不透明な画像が得られる唯一のときは、画像の一方 (通常は 'background') が溶け込まされず (100 パーセントの値)、不透明なまま残るときです。これが、既定で 'background' に 100 の値を使う理由です。少なくとも最初は。以下は、特定の "[-dissolve](https://imagemagick.org/command-line-options/#dissolve)" 引数に対する特殊なケースです... 0x0 | | 両方の画像が完全な透明に溶け込まされます。
'[Clear](#clear)' 合成メソッドと等価です。
---|---|---
0 | background 画像だけが変更されません (source は透明にされます)。
'[Dst](#dst)' 合成メソッドと等価です。
100 | overlay 画像を background に通常どおり重ねます。
'[Over](#clear)' 合成メソッドと等価です。
200 | 空白のキャンバスの上に overlay 画像 (background は透明にされます)。
'[Src](#src)' 合成メソッドと等価です。
"[-dissolve](https://imagemagick.org/command-line-options/#dissolve)" 合成メソッドは、特に色付きの透かしで、画像による透かし入れ の代替方法として一般的に使われます。
2 つの画像をブレンドする
"[-blend](https://imagemagick.org/command-line-options/#blend)" 合成メソッドは、"[-dissolve](https://imagemagick.org/command-line-options/#dissolve)" 合成メソッドが、より基本的な他の操作に乗っ取られる前に、本来提供しようとしていたものを提供します。"[-dissolve](https://imagemagick.org/command-line-options/#dissolve)" メソッドが画像を互いの上に重ねるのに対し、"[-blend](https://imagemagick.org/command-line-options/#blend)" は、与えられたパーセンテージ引数に従って、両方の画像が平等に扱われる (単に足し合わされる) ように画像をマージします。そのため、(最終的な画像のサイズを除いて) パーセンテージと画像引数を入れ替えることで、同じ結果を達成できます。これは "[-dissolve](https://imagemagick.org/command-line-options/#dissolve)" メソッドには当てはまりません。言い換えると、"[-blend](https://imagemagick.org/command-line-options/#blend)" は結合的 (引数を入れ替え可能) であり、一方 "[-dissolve](https://imagemagick.org/command-line-options/#dissolve)" はそうではありません。
**magick composite -blend {_percent_} overlay bgnd result
magick composite -blend {_src_percent_}x{_dst_percent_} overlay bgnd result
magick bgnd overlay -compose blend \
-define compose:args={_src_percent_},{_dst_percent_} \
-composite result
**
単一のパーセンテージ値だけが与えられた場合、それは overlay の溶解パーセンテージとして使われ、一方 background 画像はちょうど反対の量だけ溶解されます。つまり、"-blend 30" は、2 つの画像が足し合わされる前に、overlay を 30%、background を 70% 溶解します。したがって、これは "-blend 30x70" と等価です。この結果として、(重ねられた領域での) 2 つの画像の不透明度は、依然として合計 100% になります。
2 つのパーセンテージを与えることで、2 つの画像をどれだけマージするかを正確に制御できます。以下は、さまざまな dissolve 引数での結果の表です... |
magick composite -blend {_argument_} -gravity South \
compose_R.png compose_plus_GB.png -alpha Set {_result_}
結果から、"[-blend](https://imagemagick.org/command-line-options/#blend)" が、オーバーレイすることなく一方の画像を別の画像で均等にゆっくりと置き換えられることがわかります。ブレンドの結果を、たとえばディスプレイのサイズの黒いキャンバスの上に重ねると、一方の画像が別の画像にゆっくりと溶け込む、まずまずのスライドショープログラムを簡単に作れます。また、画像が足し合わされる (内部的には '[Plus](#plus)' 合成演算子を使う) ため、色チャンネルの最大値を簡単にオーバーロードしてしまい、いくつかのアーティファクトを生じることもわかります。特に 100% の白い色は、すべての色チャンネルがすでに最大なので、もう一方の画像のものが何も見えなくなることを保証します。ほとんどの状況では、blend の単一引数版だけを使えば十分であることをおすすめします。 |
"-dissolve" と同様、"-blend" が正しく機能して background 画像を溶解するためには、background 画像がアルファチャンネルを含んでいなければなりません。 そのため、'[Blend](#blend)' 合成を適用する前に、すべての画像で アルファチャンネルを設定する よう IM に指示するのが、おそらく良い考えです。 |
|---|---|
以下は、特定の "[-blend](https://imagemagick.org/command-line-options/#blend)" 引数に対する特殊なケースです... 0x0 |
|
'[Clear](#clear)' 合成メソッドと等価です。 |
|
| --- | --- |
0 |
background 画像だけが変更されません。 |
'[Dst](#dst)' 合成メソッドと等価です。 |
|
100 |
空白のキャンバスの上に overlay 画像。 |
'[Src](#src)' 合成メソッドと等価です。 |
|
100x100 |
2 つの画像を単に足し合わせたもの。 |
'[Plus](#plus)' 合成メソッドと等価です。 |
|
50 |
両方の画像の平均。これは "[-evaluate-sequence mean](https://imagemagick.org/command-line-options/#average)" 画像シーケンス演算子と等価ですが、2 つの画像でのものです。(参照: 画像の平均化) |
ブレンド対ディゾルブ
Dissolve と Blend のどちらも画像を半透明にしますが、"[-dissolve](https://imagemagick.org/command-line-options/#dissolve)" は '[Over](#over)' を使って画像を合成し、一方 "[-blend](https://imagemagick.org/command-line-options/#blend)" は '[Plus](#plus)' を使って画像をマージします。これは大したことではないように見えるかもしれませんが、非常に重要です。なぜなら、2 つの合成メソッドが、重ねられていない画像の部分、あるいは overlay が透明な領域をどう扱うかを定義するからです。たとえば。
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
ブレンド された画像で、'dragon' の background の重なっていない部分が半透明であっても、star の領域は両方で完全に不透明であり、同じ色の結果を含んでいることに注意してください! つまり、両方の画像が完全に不透明な領域で、適切な 2 つ目の '{_dst_percent_}' 引数を IM に計算させた場合、結果も完全に不透明になり、同じ結果になります。たとえば、ここでは 'dragon' 画像を組み込みの 'rose' 画像とマージします。両方の完全に不透明な画像が互いを完全に覆えるように、両方の画像を同じサイズにクロップします。
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 つの画像を比較すると、まったく同じであることがわかります。要約すると、Dissolve (overlay 画像だけにある程度の透明度を与えた over) は、Blend (両方の画像を適切なパーセンテージで重み付けして加算したもの) と同じであり、完全に不透明な画像については同じ結果を生み出します。2 つのメソッドが異なるのは、一方あるいは両方の画像が透明度を含むときだけです。
単一画像の加工に Blend を使う
| Blend は基本的に '補間関数' すなわち '重み付き平均' であり、2 つの完全に不透明な画像を制御された線形の方法で組み合わせられます。つまり、source の 30% に background の 70% を足して、新しい 100% 不透明な画像を生み出します。ただし、単に 2 つの画像を組み合わせる以上のこともできます。特定の画像を明るくしたり、コントラスト、彩度を設定したり、着色したり、さらにはシャープにしたりするためにも使えます。この blend の使い方は、BugBear bugbear@papermule.co.uk によって WWW 上で見つけられたドキュメント Image Processing by Interpolation and Extrapolation でさらに議論されています。これは Grafica Obscura にあるもの (外部ソースから直接リンクできない) のコピーです。このドキュメントは、この関数を使うことについてのさらなる読み物としておすすめです。 | 外挿の能力は IM v6.3.5-10 で "[-blend](https://imagemagick.org/command-line-options/#blend)" 演算子に追加されました。 |
|---|---|
| たとえば、ここでは rose 画像を、同じサイズの純粋な黒の画像とブレンドすることで、明るくしたり暗くしたりできます。 |
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
![[IM Output]](../static/img/compose/blend_dark_0.jpg)
0% | ![[IM Output]](../static/img/compose/blend_dark_50.jpg)
50% | ![[IM Output]](../static/img/compose/blend_dark_100.jpg)
100% | ![[IM Output]](../static/img/compose/blend_dark_150.jpg)
150% | ![[IM Output]](../static/img/compose/blend_dark_200.jpg)
200%
---|---|---|---|---
Blend 合成メソッド のいかなる使用でもそうであるように、0% は 'destination' 画像を結果とし、一方 100% では結果は元の 'source' 画像が変更されないものになります。ここでより興味深いのは、ブレンドされた画像と外挿された画像です。同様に、純粋なグレーの画像とブレンドすると、任意の画像のコントラストを調整できます。
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
![[IM Output]](../static/img/compose/blend_gray_0.jpg)
0% | ![[IM Output]](../static/img/compose/blend_gray_50.jpg)
50% | ![[IM Output]](../static/img/compose/blend_gray_80.jpg)
80% | ![[IM Output]](../static/img/compose/blend_gray_100.jpg)
100% | ![[IM Output]](../static/img/compose/blend_gray_120.jpg)
120% | ![[IM Output]](../static/img/compose/blend_gray_150.jpg)
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
![[IM Output]](../static/img/compose/blend_color_0.jpg)
0% | ![[IM Output]](../static/img/compose/blend_color_50.jpg)
50% | ![[IM Output]](../static/img/compose/blend_color_100.jpg)
100% | ![[IM Output]](../static/img/compose/blend_color_150.jpg)
150% | ![[IM Output]](../static/img/compose/blend_color_200.jpg)
200%
---|---|---|---|---
ここでは、rose 画像をそのぼかし版に対してブレンドし、補間するときには 柔らかなぼかし を、ぼかした形から外挿するときには アンシャープ を生み出します。
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
![[IM Output]](../static/img/compose/blend_blur_0.jpg)
0% | ![[IM Output]](../static/img/compose/blend_blur_50.jpg)
50% | ![[IM Output]](../static/img/compose/blend_blur_100.jpg)
100% | ![[IM Output]](../static/img/compose/blend_blur_150.jpg)
150% | ![[IM Output]](../static/img/compose/blend_blur_200.jpg)
200%
---|---|---|---|---
Watermark オプション - Compose 'Modulate'
"[-watermark](https://imagemagick.org/command-line-options/#watermark)" composite オプション、すなわち "modulate" 合成メソッドは、著作権の目的で HSB 空間において画像を 脱色 することを意図しています。
**magick composite -watermark {_brightness_}[x{_saturation_}] overlay bgnd result \
magick bgnd overlay -compose modulate \
-define compose:args={_brigthness_}[,{_saturation_}] \
-composite result
**
'overlay' 画像はアルファマスクされた白黒の画像であり、与えられた 'brightness' パーセンテージだけ destination 画像を明るく/暗くするために使われます。'brightness' が '0' なら画像の明るさは変化しませんが、'100' の値は明るさを overlay 画像の強度で置き換えます。つまり、overlay が黒なら destination は黒にされ、白なら destination 画像の色は完全に彩度が上がります。'saturation' は既定で '100' であり、最大の色の彩度を生み出します。'0' に設定すると、マスクされた領域は白黒に脱色されます。以下は、さまざまな引数での結果の表です... |
magick composite -watermark {_argument_} -gravity South \
sphinx.gif cyclops.gif {_result_}
画像に軽く透かしを入れるのに良い値は、約 15 から 30 パーセントの brightness です。以下は、特定の "[-watermark](https://imagemagick.org/command-line-options/#watermark)" 引数に対する特殊なケースです... 0 |
destination 画像にまったく変化が加えられません。 | |
|---|---|---|
100 |
overlay が黒の場所では destination が黒にされ、overlay が白の場所では完全に彩度の上がった色相にされます | |
0x0 |
マスクされた overlay の領域がグレースケールに脱色されます | |
100x0 |
グレースケールの overlay が destination の '[ATop](#atop)' に単に重ねられます。 |
|
| 他の透かし入れ手法については、画像による透かし入れ を参照してください。 |
合成マスクを使って合成領域を制限する
"magick composite" コマンドと "[-composite](https://imagemagick.org/command-line-options/#composite)" 演算子は、"[-compose](https://imagemagick.org/command-line-options/#compose)" メソッドの影響を受ける領域を制限する 3 つ目のマスキング画像もとります。たとえば、2 つの画像と 1 つの mask 画像が与えられると、そのマスクで定義されたとおりに、source 画像の一部を background 画像の上に重ねられます。ただし、background 画像が依然として結果の画像の最終的なサイズを定義することに注意してください。
magick composite tile_water.jpg tile_aqua.jpg moon_mask.gif mask_over.jpg
mask 画像は destination 画像の一部と見なされ、destination のどの部分がアルファ合成の結果によって加工されうるかを定義します。つまり、白い部分は加工でき、一方黒い部分 (とマスク画像の外側の部分) はそのまま残されます。残念ながら、"[-gravity](https://imagemagick.org/command-line-options/#gravity)" と "[-geometry](https://imagemagick.org/command-line-options/#geometry)" の設定では source 画像を再配置できますが、mask 画像は再配置 されず、destination 画像と整列されたまま残ります。なので、この点をはっきりさせておきましょう...
マスクは元の background 画像に整列されます。
いかなるグラビティ/ジオメトリ設定も適用されません。
つまり、マスクを再配置したい場合は、適切な量の黒い行と列でマスク画像を拡大する必要があります。Splice、ピクセルの行と列の追加 を参照してください。たとえば、ここでは (source 画像と background 画像の引数が入れ替わった) "magick" 版で、マスク画像を background 画像に対して相対的に移動するように調整しています。 |
magick tile_aqua.jpg tile_water.jpg \
\( -background black -splice 10x25+0+0 moon_mask.gif \) \
-composite mask_offset.jpg
![[IM Output]](../static/img/compose/mask_offset.jpg)
"magick" コマンドの "[-composite](https://imagemagick.org/command-line-options/#composite)" 演算子は、destination あるいは background 画像を最初に指定することを覚えておいてください。結果は、マスクに '+10+25' のオフセットを与えたようなものですが、source 画像も background 画像も動きません。マスクを source 画像と整列させたい場合は、source 画像を別々に ('[Copy_Opacity](#copyopacity)' や他の手法を使って) マスクするほうが良いでしょう。そうすれば、整列の問題なしにその結果を background の上に配置できます。 ここでは似たような例ですが、今回は 2 つの画像をブレンドして '浅瀬' 効果を生み出すために、background 画像と同じサイズのグラデーションマスクを使います。 |
magick tile_aqua.jpg tile_water.jpg -size 94x94 gradient: \
-composite water_shallows.jpg
![[IM Output]](../static/img/compose/water_shallows.jpg)
これは 2 つの画像を重ね合わせる簡単な方法を提供します。写真の重ね合わせ を参照してください。
合成マスクと透明度
上記から、3 つの画像による合成マスクを使うことは、'[Copy_Opacity](../static/img/compose/copyopacity)' を使って overlay 画像の透明度を設定し、それを background の上に合成するのとよく似ていると思うかもしれません。そして、(上記のような) 透明度のない画像については、そのとおりです。しかし、それは話のすべてではありません。第 1 に、マスクは source 画像ではなく destination 画像に結び付けられているので、オフセットされたりグラビティの影響を受けたりしません。また、'[Copy_Opacity](../static/img/compose/copyopacity)' とは異なり、マスク画像は純粋にグレースケール画像として扱われます。IM はマスクが持つあらゆるアルファ透明度を無視します。そのため、マスク画像で アルファチャンネルをオフにする ことを心配する必要は ありません。そして最後に、マスクは加工される領域を制限することで動作し、これは単に source 画像をマスクするのとは非常に異なります。単純な '[Over](../static/img/compose/over)' 合成については、これはマスクが source 画像のあらゆる透明度と乗算されて、重ねられるものを制限するのと同じです。そのため、完全に不透明な source 画像については、それを source 画像の透明度と考えることができます。たとえば、2 つの円を通常どおり重ね、それから destination 画像が変更される領域を制限するマスクでそれらを重ねます。
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
結果は、赤い円の画像が与えられたグレースケールマスクによって 'マスク' され、それが destination 画像の上に重ねられたのと等価です。ただし、他のいかなる種類のアルファ合成メソッドでも、マスクを source 画像の透明度マスクとしてではなく、影響領域を制限するものと考えるほうが良いでしょう。ここでは '[Src](../static/img/compose/src)' メソッドを使って、destination のマスクされた領域を source 画像の内容で置き換えます。 |
magick composite m_src.png m_bgnd.png m_mask.png -compose Src m_src_masked.png
![[IM Output]](../static/img/compose/m_src_masked.png)
ご覧のとおり、定義されたマスクのある領域だけが、実際にアルファ合成の結果で置き換えられます。マスクが source 画像の透明度を加工するためだけに使われていたなら、上記は source 画像だけを示し、background 画像のものは何も示さないでしょう。
FUTURE: マスクされた合成を使って、背景の前で、ただし手前のオブジェクトの
後ろに、あるオブジェクトを重ねる。また、destination 内の手前のオブジェクトに
よって何かが覆い隠されるアニメーションの例を作る。
| _上記は、透明度を持つ source あるいは overlay 画像を関与させたとき、あるいは '[Over](#over)' 合成メソッド以外のアルファ合成を使おうとしたときに、合成マスキングに関わる大きな長期的バグでした。詳細は 合成マスクのバグ を参照してください。
_
---|---
画像タイルを使った合成
"magick composite" の "[-tile](https://imagemagick.org/command-line-options/#tile)" 設定は、"magick" や "magick montage" の同じ設定とは非常に異なります。これが与えられると、source 画像を background 画像の上にタイル状に敷き詰めることを意味します。たとえば、ここでは 'color star' を netscape のカラーマップ画像の上にタイル状に敷き詰めます... |
magick composite -tile star.gif netscape: tile.gif
![[IM Output]](../static/img/compose/tile.gif)
composite タイリングの一般的な用途の 1 つは、ネットで公開する前に画像の上に半透明の著作権表示やその他の表示をタイル状に敷き詰めることです。これの例については、テキストによる透かし入れ の最後の例を参照してください。この設定は本質的に (少なくとも現時点では) 引数を持たないことに注意してください。これは最終的な "magick composite" 操作への、単なるブール値のオン/オフフラグです。そのため、これを使って background 画像をタイル状に敷き詰めることはできません。それは、IM が background 画像を使って結果の最終的なサイズを設定できなくなることを意味するからです。ただし、代わりに '[Dst_Over](#dstover)' を使って、ある画像の下に画像をタイル状に敷き詰めることはできます。 |
magick -background none -pointsize 36 label:'Tile Under' png:- |\
magick composite -tile bg.gif - -compose Dst_Over tile_under.gif
![[IM Output]](../static/img/compose/tile_under.gif)
また、多くの数学的演算子は結合的であり、(最終的な画像のサイズを除いて) 結果に影響を与えることなく source と destination を入れ替えられます。現在のところ、"magick" コマンドでタイル状のアルファ合成を行う簡単なメソッドはありません。これは残念なことです。なぜなら、すでにメモリ内にある画像でのタイリング が、現在よりもはるかに簡単になるからです。"magick" を使った合成タイリングの基本的な手法は、元の画像を Clone し、タイル化されたキャンバス で与えられたメソッドの 1 つを使ってそれをタイル状に敷き詰めることです。たとえば... |
magick -gravity center -pointsize 32 -font Corsiva \
label:'Tile White\nBackgrounds' -bordercolor white -border 5 \
\( -clone 0 -tile tile_aqua.jpg -draw "color 0,0 reset" \) \
-compose Multiply -composite tile_convert.gif
![[IM Output]](../static/img/compose/tile_convert.gif)
上記は、数学的な合成 メソッド "[Multiply](#multiply)" を使って、ラベルの '白い背景' を置き換えます。画像マスク、数学的合成の使用 も参照してください。
特殊な合成メソッド
何らかの理由で追加された、いくつかの特殊な目的の合成メソッドもあります。
Mathematics (ユーザー定義の数学的合成メソッド)
この合成メソッドは 4 つの数値をとり、ユーザーが多くの異なる 数学的な合成メソッド を定義できるようにします。4 つの引数 "A"、"B"、"C"、"D" は、次の式を定義します...
A*Sc*Dc + B*Sc + C*Dc + D
ここで "Sc" は source あるいは overlay 画像、"Dc" は background あるいは destination 画像です。4 つの値すべてを提供しなければなりません。たとえば、値 "1,0,0,0" を使って '[Multiply](#multiply)' 合成メソッドと等価なものを生成できます。
magick gradient_dst.png gradient_src.png \
-compose Mathematics -define compose:args='1,0,0,0' -composite \
mathematics_multiply.png
![[IM Output]](../static/img/compose/gradient_src.png)
Source | | ![[IM Output]](../static/img/compose/gradient_dst.png)
Dest | | ![[IM Output]](../static/img/compose/mathematics_multiply.png)
Result
---|---|---|---|---
同様に、必要な式を調べたり解いたりすることで、他の合成メソッドを生成できます。たとえば... [Screen](#screen): 1-(1-Sc)*(1-Dc) => -Sc*Dc + Sc + Dc => -1,1,1,0 |
magick gradient_dst.png gradient_src.png \
-compose Mathematics -define compose:args='-1,1,1,0' -composite \
mathematics_screen.png
![[IM Output]](../static/img/compose/mathematics_screen.png)
あるいは、引数 "0,2,1,-1" を使って直接定義される '[LinearLight](#linearlight)'... |
magick gradient_dst.png gradient_src.png \
-compose Mathematics -define compose:args='0,2,1,-1' -composite \
mathematics_linearlight.png
![[IM Output]](../static/img/compose/mathematics_linearlight.png)
同様に、次のような他の合成メソッドを生成できます... Compose メソッド | Mathematics 引数
---|---
[Multiply](#multiply) | 1,0,0,0
[Screen](#screen) | -1,1,1,0
[Exclusion](#exclusion) | 0,1,1,-1
[Linear_Dodge](#lineardodge) | 0,1,1,0
[Linear_Burn](#linearburn) | 0,1,1,-1
[Linear_Light](#linearlight) | 0,2,1,-1
他の合成メソッドは、2 乗、平方根、除算、あるいは複数の特殊な区分関数や条件分岐の使用を必要とし、このメソッドが提供する単純で滑らかな多項式関数を使って定義することを妨げます。新しい合成メソッドを作ることもできます。たとえば、LinearLight の拡張された代替版... |
magick gradient_dst.png gradient_src.png \
-compose Mathematics -define compose:args='0,1,1,-0.5' \
-composite mathematics_linearlight_2.png
![[IM Output]](../static/img/compose/mathematics_linearlight_2.png)
この特定の DIY 合成は、正弦波のような バイアスのかかったグラデーションの加算 の手段として重要です。あるいは、'ライティング効果' に使えるもう 1 つのバリアント... |
magick gradient_dst.png gradient_src.png \
-compose Mathematics -define compose:args='0,1,.5,-.25' \
-composite mathematics_linearlight_3.png
![[IM Output]](../static/img/compose/mathematics_linearlight_3.png)
この数学的合成メソッドは、個々の複数の手順を使うのでは非常に複雑になるような、特殊なタイプの グラデーションの数学 を行えるようにするため、特に重要です。 | '[Mathematics](#mathematics)' 合成メソッドは IM バージョン 6.5.4-3 で追加されました。そして現在は "-compose" 演算子を使ってのみ利用できます。引数を必要とするため、"magick composite" コマンドからは利用できません。
---|---
Change_Mask (類似したピクセルを透明にする)
これは、destination 画像内の特定のピクセルだけを完全に透明にする、珍しいメソッドです。つまり、現在の Fuzz Factor 設定に従って、与えられた source 画像に一致する destination 画像内のピクセルです。これは、たとえば、複雑な (ただし非常に異なる) 背景の上に重ねられた画像に透明度を再付与するために使えます。たとえば、これはまさに Jesper Eije によって提示された問題でした...
magick overlay_figure.gif overlay_bgnd.gif \
-compose ChangeMask -composite overlay_removed.png
簡単です。JPEG 画像の色は、ファイル形式の非可逆な性質のため、しばしばわずかな色の変化を持つことに注意してください。非常に似た色を一致させるには、小さな Fuzz Factor 設定が必要になります。また、画像の変化した部分がたまたま背景色やパターンに一致した場合、結果の画像やマスクに '穴' ができるので、非常に似た画像でこれを使うときは常に注意が必要です。 2 つの画像を入れ替えて、background 画像を destination 画像として与えることで、重ねられた画像によって置き換えられた、あるいは加工された background の部分を抽出できます。 |
magick overlay_bgnd.gif overlay_figure.gif \
-compose ChangeMask -composite overlay_changed.png
![[IM Output]](../static/img/compose/overlay_changed.png)
結果は、類似したピクセルが単に透明にクリアされた、元の background 画像の透明な形状マスクにすぎないことに注意してください。部分的な透明度を生成したり、色を変更したりは一切試みないので、元の overlay と背景色がマージされた画像の周りに、わずかに異なる背景色の '光輪' を残すことがあります。 この合成メソッドはピクセルを完全な透明に 'クリア' するだけなので、結果の画像には常にアルファチャンネルが追加されます。ただし、destination 画像の色は、他のほとんどのアルファ合成メソッドのようにはクリアされません。そのため、アルファチャンネルを反転して、変更されていない色を取得できます。 |
magick overlay_figure.gif overlay_bgnd.gif -compose ChangeMask -composite \
-channel A -negate overlay_unchanged.png
![[IM Output]](../static/img/compose/overlay_unchanged.png)
この場合、大きな Fuzz Factor が設定されていない限り、入力画像の順序は問題になりません。色は destination 画像から来ること、そして画像間の差が結果の形状マスクを定義することを覚えておいてください。これらの問題についての詳細は 背景除去 を参照してください。結果は、その直接的な有用性において限られていることがよくあります。ただし、画像間の変化のビットマップマスクを生成するために使えます (それがこの名前の由来です)。 | _'[ChangeMask](#changemask)' 合成メソッドは、GIF アニメーションの 透明度の最適化 のためのメソッドを提供するために、IM v6.3.4 で追加されました。3 つ以上の合成メソッドを組み合わせずに、必要な要件を提供する既存の合成メソッドは他にありませんでした。具体的には、透明度の最適化に必要なブール (あるいは fuzz factor の閾値処理) の要件です。
ただし、その結果はそれ自体で非常に便利なので、ユーザーが直接使えるようにされ、それでこのかなり複雑な合成メソッドの名前が定義されました。_
---|---
画像マッピング効果メソッド
厳密には合成メソッドではない、いくつかの特殊なメソッドもあります。2 つの画像をピクセル単位で直接組み合わせるのではなく、source あるいは overlap 画像は、より大きな効果のための特殊な制御マップになります。これらが表すメソッド自体は比較的単純ですが、その使い方が非常に複雑なので、独自の例セクションを持っています。画像マッピング効果。これらの特殊なメソッドには次のものが含まれます... 'Blur' メソッドは、画像をピクセル単位でさまざまな方法でぼかすメソッドを提供します。幅広い DIY の画像ぼかし効果を生成できます。詳細は 可変 Blur マッピング を参照してください。 一方、'Displace' メソッドは、絶対的および相対的なピクセル参照の変位手法を提供し、特定の画像歪みメソッドだけでなく、ガラス、レンズ、波紋の効果も生成します。詳細は 歪みと変位マッピング を参照してください。
![[IM Output]](../static/img/compose/convert_over.gif)
![[IM Output]](../static/img/compose/compose_under_tiled.jpg)
![[IM Output]](../static/img/images/hand_point.gif)
![[IM Output]](../static/img/compose/compose_expand.gif)
![[IM Output]](../static/img/compose/compose_clear_limited.gif)
![[IM Output]](../static/img/images/text_scan.png)
![[IM Output]](../static/img/compose/text_scan_norm.png)
![[IM Output]](../static/img/compose/text_scan_divide.png)
![[IM Output]](../static/img/compose/compose_R.png)
![[IM Output]](../static/img/compose/compose_G.png)
![[IM Output]](../static/img/compose/compose_B.png)
![[IM Output]](../static/img/compose/compose_plus_RG.png)
![[IM Output]](../static/img/compose/compose_plus_RB.png)
![[IM Output]](../static/img/compose/compose_plus_GB.png)
![[IM Output]](../static/img/compose/compose_plus_RGB.png)
![[IM Output]](../static/img/compose/black_n_white.gif)
![[IM Output]](../static/img/compose/compose_negate.gif)
![[IM Output]](../static/img/compose/gradient_op_exclusion.png)
![[IM Output]](../static/img/img_photos/flower_sm.jpg)
![[IM Output]](../static/img/compose/flower_softglow.jpg)
![[IM Output]](../static/img/compose/red_gradient.png)
![[IM Output]](../static/img/compose/blue_gradient.png)
![[IM Output]](../static/img/compose/lighten_by_value.png)
![[IM Output]](../static/img/compose/lighten_intensity.png)
![[IM Output]](../static/img/compose/circle_left.gif)
![[IM Output]](../static/img/compose/circle_right.gif)
![[IM Output]](../static/img/compose/circle_union.gif)
![[IM Output]](../static/img/compose/circle_intersection.gif)
![[IM Output]](../static/img/compose/circle_disjunction.gif)
![[IM Output]](../static/img/compose/circle_complement.gif)
![[IM Output]](../static/img/compose/gradient_op_hardlight.png)
![[IM Output]](../static/img/compose/gradient_op_linearlight.png)
![[IM Output]](../static/img/compose/gradient_op_vividlight.png)
![[IM Output]](../static/img/compose/gradient_op_pinlight.png)
![[IM Output]](../static/img/compose/gradient_op_lineardodge.png)
![[IM Output]](../static/img/compose/gradient_op_linearburn.png)
![[IM Output]](../static/img/compose/circle_subtract.gif)
![[IM Output]](../static/img/compose/gradient_op_colordodge.png)
![[IM Output]](../static/img/images/star.gif)
![[IM Output]](../static/img/images/dragon_sm.gif)
![[IM Output]](../static/img/compose/dissolve_montage.jpg)
![[IM Output]](../static/img/compose/blend_montage.jpg)
![[IM Output]](../static/img/compose/dissolve_50.png)
![[IM Output]](../static/img/compose/blend_50.png)
![[IM Output]](../static/img/compose/dissolve_50_opaque.png)
![[IM Output]](../static/img/compose/blend_50_opaque.png)
![[IM Output]](../static/img/images/sphinx.gif)
![[IM Output]](../static/img/images/cyclops.gif)
![[IM Output]](../static/img/compose/wmark_montage.jpg)
![[IM Output]](../static/img/images/tile_water.jpg)
![[IM Output]](../static/img/images/tile_aqua.jpg)
![[IM Output]](../static/img/compose/mask_over.jpg)
![[IM Output]](../static/img/compose/m_src.png)
![[IM Output]](../static/img/compose/m_bgnd.png)
![[IM Output]](../static/img/compose/m_over.png)
![[IM Output]](../static/img/compose/m_mask.png)
![[IM Output]](../static/img/compose/m_over_masked.png)
![[IM Output]](../static/img/images/overlay_figure.gif)
![[IM Output]](../static/img/images/overlay_bgnd.gif)
![[IM Output]](../static/img/compose/overlay_removed.png)