我一直在使用需要我在0xAABBGGRR格式輸入顏色有些功能[UINT32]轉換RGBA值ABGR十六進制
這將是一個更加友好的用戶界面,如果這可能是與RGBA浮點值來實現如通常情況下從0到1。
有沒有簡單的方法來實現這個目標?
爲了使我的問題更加清晰,
UINT32 ColorValue(float r, float g, float b, float a) {
// ???
}
例子:ColorValue(1,0,0,1)== 0xFF0000FF
我一直在使用需要我在0xAABBGGRR格式輸入顏色有些功能[UINT32]轉換RGBA值ABGR十六進制
這將是一個更加友好的用戶界面,如果這可能是與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))));
}
這可能是解決您的問題的方法。如果保證參數始終位於有效範圍內,可以刪除範圍檢查部分以獲得更高的性能。
謝謝,這是完美的。 – object 2013-05-10 21:45:14