Alpha混合C中的2种RGBA颜色

Per*_*abs 9 c alpha alphablending colors rgba

可能重复:
如何快速进行alpha混合?

alpha混合2种RGBA(整数)颜色的最快方法是什么?

作为注释,目标颜色混合的位置始终是不透明的,只有第二种颜色可以具有不同的透明度.

我试图在C中找到最快的方法,考虑到混合的最终结果颜色必须最终没有透明度,完全不透明(alpha = 0xff)

Sni*_*gus 16

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;
}
Run Code Online (Sandbox Code Playgroud)

我不知道它有多快,但它都是整数.它的工作原理是将alpha(和inv_alpha)转换为8.8定点表示.不要担心alpha的min值是1.在这种情况下,fg [3]为0,意味着前景是透明的.混合将是1*fg + 256*bg,这意味着fg的所有位都将移出结果.

如果你用64位整数打包你的RGBAs,你可以非常快地完成它.然后,您可以使用单个表达式并行计算所有三种结果颜色.

  • @Sniggerfardimungus 那么图像编辑器如何让你做到这一点?叠加 RGBA+RGBA = RGB**A**? (3认同)
  • 很高兴听到它 - 对于未经测试的代码而言并不坏,而凌晨2点浪费了?=] (2认同)