【问题标题】:convert RGBA values to ABGR hexadecimal [duplicate]将 RGBA 值转换为 ABGR 十六进制 [重复]
【发布时间】:2013-05-04 18:45:45
【问题描述】:

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

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

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

为了让我的问题更清楚,

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

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

【问题讨论】:

    标签: c++ colors hex mask bits


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢,这太完美了。
    【解决方案2】:
    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))));
    }
    

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

    【讨论】:

      猜你喜欢
      • 2019-08-12
      • 2014-03-05
      • 1970-01-01
      • 2017-06-02
      • 2013-06-16
      • 2012-05-14
      • 2019-01-20
      • 1970-01-01
      • 2017-12-30
      相关资源
      最近更新 更多