将RGBA值转换为ABGR十六进制

时间:2013-05-10 06:11:46

标签: c++ colors hex mask bits

我一直在使用的一些功能要求我输入0xAABBGGRR格式的颜色[UINT32]

如果可以使用RGBA浮点值实现这个用户友好的界面,通常情况下它的范围是0到1。

有一种简单的方法可以实现这一目标吗?

让我的问题更清楚,

UINT32 ColorValue(float r, float g, float b, float a) {
   // ???
}

示例:ColorValue(1,0,0,1)== 0xFF0000FF

2 个答案:

答案 0 :(得分:0)

因为,我认为,你有兴趣学习,我不会发布你可以粘贴到代码中的答案,而是我会解释你需要的组件:

  1. 您需要将0..1范围内的浮点值转换为整数值0..255。您可以通过将float值乘以255并将其存储为整数来完成此操作。
  2. 您需要在整数内“混洗”值。这是通过<<运算符完成的,因此x << yx的值向左移动y位。
  3. 您需要将多个组件合并为一个整数值。您可以使用|运算符执行此操作。在这种情况下,0xFF | 0xFF0000将成为0xFF00FF
  4. 其余的只是拿着我上面描述的乐高乐器并将它们组合在一起。

答案 1 :(得分:0)

UINT32 ColorValue (float r, float g, float b, float a) throw(int)
{
    if      ((r<0) || (1<r)) throw(1);  // Argument range check if needed
    else if ((g<0) || (1<g)) throw(2);
    else if ((b<0) || (1<b)) throw(3);
    else if ((a<0) || (1<a)) throw(4);
    return  (static_cast<UINT32>(round(a * static_cast<float>(0xFF))) << 24) |
            (static_cast<UINT32>(round(b * static_cast<float>(0xFF))) << 16) |
            (static_cast<UINT32>(round(g * static_cast<float>(0xFF))) << 8)  |
            (static_cast<UINT32>(round(r * static_cast<float>(0xFF))));
}

这可能是您问题的解决方案。如果保证参数始终在有效范围内,则可以删除范围检查部分以获得更高的性能。