我一直在使用的一些功能要求我以 0xAABBGGRR 格式 [UINT32] 输入颜色
如果可以使用 RGBA 浮点值(通常范围为 0 到 1)来完成,这将是一个更加用户友好的界面。
有没有一种简单的方法可以做到这一点?
为了让我的问题更清楚,
UINT32 ColorValue(float r, float g, float b, float a) {
// ???
}
示例:ColorValue(1,0,0,1) == 0xFF0000FF
因为,我想,你有兴趣学习,我不会发布一个你可以粘贴到你的代码中的答案,而是解释你需要的组件:
<<
运算符完成的,因此x << y
将 的值x
按y
位向左移动。|
操作。在这种情况下,0xFF | 0xFF0000
将变为0xFF00FF
。剩下的就是把我上面描述的乐高积木放在正确的地方。
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))));
}
这可能是您的问题的解决方案。如果保证参数始终在有效范围内,您可以删除范围检查部分以获得更高的性能。