1

P と呼ぶピクセルの RGB タプルがあります。

(255, 0, 0) は、アルファ チャネルが 1.0 の P の色です。

アルファ チャネルが 0.8 の場合、P の色は (255, 51, 51) になります。

P の色に影響を与えているピクセルの色を取得するにはどうすればよいですか?

4

2 に答える 2

6

最初から始めましょう。アルファを持つピクセルは、他の何かとブレンドされた場合にのみ意味があります。アルファ付きの上層 U と完全に不透明な下層 L がある場合、方程式は次のようになります。

P = (alpha * U) + ((1.0 - alpha) * L)

式を整理すると、次のようになります。

L = (P - (alpha * U)) / (1.0 - alpha)

アルファが 1.0 の場合、0 で除算することになるため、この式は明らかに意味がありません。

数値を差し込むと、ピクセル L の R=255、G=255、B=255 であることがわかります。

慣例により、画像の最下層がすべて白 (255,255,255) になることは、ほぼ普遍的です。

于 2011-01-30T04:01:27.453 に答える
3

あなたが提供した数字を見るだけで:

(1.0-0.8)*255 ~= 50.9 = 51

どこ:

  • 1.0 は最大アルファ強度です。
  • 0.8 は現在設定されているアルファ強度です。
  • 255 は、各 RGB チャネルの最大強度 (背景の色) です。

これは、例の B および G チャネルに適合します。

したがって、一般的なケースでは、チャネル値(RGBのいずれか)と背景色(あなたの場合は白 - 255)の間の単純な加重平均のようです。重みとしてアルファが使用されています。

ここにいくつかのPythonコードがあります:

MIN_ALPHA=0.0
MAX_ALPHA=1.0
MIN_CH=0
MAX_CH=255
BG_VAL=255

def apply_alpha(old, alpha, bg=255):
    assert alpha >= MIN_ALPHA
    assert alpha <= MAX_ALPHA
    assert old >= MIN_CH
    assert old <= MAX_CH

    new = old*alpha + (MAX_ALPHA - alpha)*bg
    return new

if __name__ == '__main__':
    import sys
    old, alpha = map(float, sys.argv[1:])
    print apply_alpha(old, alpha)

そしていくつかの出力:

misha@misha-K42Jr:~/Desktop/stackoverflow$ python alpha.py 255 0.8
255.0
misha@misha-K42Jr:~/Desktop/stackoverflow$ python alpha.py 0 0.8
51.0

他の例 (特に、白以外の背景) でこれを試してみてください。おそらく簡単です。そうでない場合は、新しい例で回答を編集してください。もう一度見てみましょう。

于 2011-01-30T03:00:08.833 に答える