2012-05-26 51 views
0

看起來不像RGB1那樣簡單* A1 + RGB2 * A2 ...數值如何剪切?加權?等等alpha混合如何在數學上逐像素地工作?

這是一個上下文相關的問題?是否有不同的算法,產生不同的結果?還是一個標準的實現?

我對OpenGL特定的答案特別感興趣,但來自其他環境的上下文也很有用。

+1

http://en.wikipedia.org/wiki/Alpha_blending#Alpha_blending –

回答

3

我不知道OpenGL的,但不透明度的一個像素通常被畫在另一像素像這樣:

result.r = background.r * (1 - A) + foreground.r * A 
result.g = background.g * (1 - A) + foreground.g * A 
result.b = background.b * (1 - A) + foreground.b * A 

重複此操作多個像素。

1

如果圖像不是預乘alpha,上面的答案有效。但是,如果您使用預乘alpha圖像的混合類型,則會出現黑色邊框。

預乘alpha:

當創建圖像,顏色值由alpha通道相乘。看看這一個像素例如:

Pixel: r = 1, g = 0, b = 0, a = 0.5 

當它的保存,將RGB瓦萊斯將由alpha值給予相乘:

Pixel: r = 0.5, g = 0, b = 0, a = 0.5 

融入這種形象你需要使用下面的公式:

result.r = background.r * (1 - A) + foreground.r 
result.g = background.g * (1 - A) + foreground.g 
result.b = background.b * (1 - A) + foreground.b 

非預乘阿爾法

在此示例中,alpha通道與顏色通道完全分離。

Pixel: r = 1, g = 0, b = 0, a = 0.5 

當它保存:

Pixel: r = 1, g = 0, b = 0, a = 0.5 

這是相同的。在這種情況下,minitech提供的答案是正確的。

更多細節可以在這裏找到:Premultiplied alpha