2012-08-17 112 views
9

可能重複:
How to do alpha blend fast?Alpha混合2 RGBA顏色用C

什麼是阿爾法混合2 RGBA(整數)色的最快方法?

作爲說明,混合的目標顏色總是不透明的,只有第二種顏色可以具有不同的透明度級別。

我試圖找到在C最快的方​​式,考慮到從混合物中最終得到的顏色必須與沒有透明度,完全不透明的(alpha = 0xFF的)

+0

此鏈接不起作用 – PerracoLabs 2012-08-18 05:43:40

+0

你能幫助我們理解你的問題和那個問題之間的區別嗎?看來我們中的一些人感到困惑。 – sblom 2012-08-18 06:51:28

+2

不重複。這會在簡單的舊'C'中詢問alpha混合。這個重複的假設問題提出了一個類似的問題,但關於'C++'。兩種相似,但非常不同的語言。 – 2014-04-03 17:43:40

回答

13
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] = 0xff; 
} 

我不結束不知道它有多快,但它是整數。它通過將alpha(和inv_alpha)轉換爲8.8個定點表示來工作。不要擔心alpha的最小值爲1的情況。在這種情況下,fg [3]爲0,這意味着前景是透明的。混合將是1 * fg + 256 * bg,這意味着fg的所有位將被移出結果。

如果你用64位整數打包你的RGBA,你可以做得非常快。然後,您可以使用單個表達式並行計算所有三種結果顏色。

+1

工程簡單完美,確實相當快。 – PerracoLabs 2012-08-18 10:24:53

+2

很高興聽到它 - 對於未經測試的代碼不錯,而浪費在凌晨2點? =] – Sniggerfardimungus 2012-08-18 23:39:29

+1

+1我一直在琢磨如何讓alpha混合在今天更好的部分工作。你的算法是我測試過的第一個實際上......好的,可行的。 – 2014-04-03 17:18:32