C 语言中的 Alpha 混合 2 RGBA 颜色[重复]

2024-05-21

可能的重复:
如何快速进行阿尔法混合? https://stackoverflow.com/questions/1102692/how-to-do-alpha-blend-fast

对 2 个 RGBA(整数)颜色进行 Alpha 混合的最快方法是什么?

请注意,混合的目标颜色始终是不透明的,只有第二种颜色可以具有不同级别的透明度。

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


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 的所有位都将从结果中移出。

事实上,如果您将 RGBA 打包为 64 位整数,那么您可以做得非常快。然后,您可以使用单个表达式并行计算所有三种结果颜色。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C 语言中的 Alpha 混合 2 RGBA 颜色[重复] 的相关文章

随机推荐