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