使用按位运算混合alpha颜色

时间:2011-01-21 22:56:05

标签: optimization bit-manipulation alphablending

我有下面的代码来混合ARGB格式的alpha颜色:

a,b,o是整数,但应该总是落在[0x00ffffff,0xffffffff]

o =(((a>> 24)*(b>> 24))>>><<< 24;

有没有优化它?

谢谢!

2 个答案:

答案 0 :(得分:1)

那不执行alpha混合。这只是组合了两个像素的alpha分量。它也可能与你没有直接进行组装时的效率一样高效。如果你可以使用指针,你可能会更快一点:

byte* pa = (byte*)&a;
byte* pb = (byte*)&b;
byte* po = (byte*)&o;

po[3] = pa[3] * pb[3] >> 8;

这可以节省大部分转移。请注意,这假设是一个小端机器。如果你在大端处理器上运行,它会变得更好:

*po = *pa * *pb >> 8;

在任何一种情况下,您都可以通过内联所有指针转换将其转换为单行,但它有点难以阅读。

((byte*)&o)[3] = ((byte*)&a)[3] * ((byte*)&b)[3] >> 8;

*((byte*)&o) = *((byte*)&a) * *((byte*)&b) >> 8;

答案 1 :(得分:0)

unsigned int blend(unsigned int a, unsigned int b)
{
  return (((a >> 24) * (b >> 24)) << 16) & 0xFF000000;
}

这是你想要做的吗?我认为这不会更快,但根据你所说的更准确。

如果您不需要使用按位运算符,也可以使用指针,如其他解决方案所示。