2012-08-17 71 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