【问题标题】:Alpha Blending 2 RGBA colors in C [duplicate]C中的Alpha混合2 RGBA颜色[重复]
【发布时间】:2012-08-17 18:14:56
【问题描述】:

可能重复:
How to do alpha blend fast?

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

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

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

【问题讨论】:

  • 你能帮助我们理解你的问题和那个问题之间的区别吗?看来我们中的一些人很困惑。
  • 不是重复的。这询问了普通旧 C 中的 alpha 混合。这个重复的假设问题提出了一个类似的问题,但是关于C++。两种相似但截然不同的语言。

标签: c colors alpha alphablending rgba


【解决方案1】:
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 位整数,您确实可以非常快地完成此操作。然后,您可以使用单个表达式并行计算所有三种结果颜色。

【讨论】:

  • 工作简直完美,而且确实很快。
  • 很高兴听到它 - 对于未经测试的代码来说还不错,而在凌晨 2 点被浪费了? =]
  • +1 我一直在绞尽脑汁思考如何让 alpha 混合在今天的大部分时间里发挥作用。你的算法是我测试过的第一个实际上......嗯,有效。
  • 有没有办法使用这种算法混合两种半透明颜色并从中获得不透明的颜色?
  • @Sniggerfardimungus 那么图像编辑器是如何让你做到这一点的呢?叠加 RGBA+RGBA = RGBA?
猜你喜欢
  • 1970-01-01
  • 2014-12-06
  • 1970-01-01
  • 2018-12-12
  • 2013-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多