8

一般に、「通常の」ブレンド モードの方程式は次のようになります。

D = Sa * S + D * (1.0 - Sa)

ここで、D はデスティネーション カラー、Sa はソース アルファ、S はソース カラーです。

現在、これは完全に不透明な宛先で問題なく機能しますが、半透明および完全に透明な宛先でそれをどのように処理するかを知りたいです。

ソースを完全に透明なデスティネーションにブレンドする場合、ソース ピクセル (ピクセルは色とアルファ) は変更されず、前の式のようにブレンドされません。また、デスティネーションの背景が完全に不透明な場合は、上記の式を適用する必要がありますが、宛先アルファが 0 と 1 の間にある状況を処理する適切な方法が見つかりません。

たとえば、白いピクセルを透明な背景に 50% のアルファでブレンドする場合、色はその透明な色の値 (多かれ少なかれ未定義の状態) にならないようにする必要があります。 50% (アルファ乗算後)、これは上記の式を適用した後に得られるものです (D を S と同じ色にする場合、これは私が考えたものです)。

4

3 に答える 3

10

この方程式は、一般的な混合方程式を簡略化したものです。目的の色が不透明であると想定しているため、目的の色のアルファ項を削除します。

D = C1 * C1a + C2 * C2a * (1 - C1a)

ここで、D は結果の色、C1 は最初の要素の色、C1a は最初の要素のアルファ、C2 は 2 番目の要素の色、C2a は 2 番目の要素のアルファです。宛先アルファは次のように計算されます。

Da = C1a + C2a * (1 - C1a)

結果の色はアルファで事前に乗算されます。色を乗算されていない値に戻すには、結果のアルファである Da で割るだけです。

于 2009-11-12T20:28:07.940 に答える
1

この回答が役立つことがわかりました。同じ式をアルファ チャネルに適用すると、期待どおりに機能するようです。

拡張バージョンを表示するためにここを変更:

int blend(unsigned char result[4], unsigned char fg[4], unsigned char bg[4] {
    unsigned int alpha = fg[3] + 1;
    unsigned int inv_alpha = 256 - fg[3];
    result[0] = (unsigned char)((alpha * fg[0] + inv_alpha * bg[0]) >> 8);
    result[1] = (unsigned char)((alpha * fg[1] + inv_alpha * bg[1]) >> 8);
    result[2] = (unsigned char)((alpha * fg[2] + inv_alpha * bg[2]) >> 8);
    result[3] = (unsigned char)((alpha * fg[3] + inv_alpha * bg[3]) >> 8);
    // result[3] = 0xff;
}

これは、迅速で汚いコードにはうまく機能しますが、上記の回答でコメントされているように、より高速なアプローチもありますが、ここここでも取り上げられています。

于 2016-12-10T11:32:34.677 に答える
0

ほとんどのブレンド式は、目的の色のアルファが保存されていない静止画像で使用されます。アルファが利用可能な場合、最終的なアルファは単純にソース アルファと宛先アルファの算術平均になります。

平均アルファを計算し、それを式の「Sa」の代わりに使用するだけです。

これが何のためにあるのか教えていただけませんか?

于 2009-11-12T20:38:08.483 に答える