0

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

如果可以使用 RGBA 浮点值(通常范围为 0 到 1)来完成,这将是一个更加用户友好的界面。

有没有一种简单的方法可以做到这一点?

为了让我的问题更清楚,

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

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

4

2 回答 2

0

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

  1. 您需要将 0..1 范围内的浮点值转换为整数值 0..255。为此,您可以将浮点值乘以 255 并将其存储在一个整数中。
  2. 您需要在整数内“洗牌”值。这是通过<<运算符完成的,因此x << y将 的值xy位向左移动。
  3. 您需要将多个组件组合成一个整数值。您与操作员一起执行此|操作。在这种情况下,0xFF | 0xFF0000将变为0xFF00FF

剩下的就是把我上面描述的乐高积木放在正确的地方。

于 2013-05-10T08:54:11.790 回答
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))));
}

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

于 2013-05-10T09:02:51.977 回答