2013-05-10 66 views
-1

我一直在使用需要我在0xAABBGGRR格式輸入顏色有些功能[UINT32]轉換RGBA值ABGR十六進制

這將是一個更加友好的用戶界面,如果這可能是與RGBA浮點值來實現如通常情況下從0到1。

有沒有簡單的方法來實現這個目標?

爲了使我的問題更加清晰,

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

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

回答

0

因爲,我相信,你有興趣在學習中,我我不會發佈一個答案,您可以將其粘貼到您的代碼中,而是說明您需要的組件:

  1. 您需要將0..1範圍內的浮點值轉換爲整數值0..255。您可以通過將float值乘以255並將其存儲在整數中來完成此操作。
  2. 你需要在一個整數內「洗牌」數值。這是通過<<運營商完成的,因此x << yx的值向左移動y位。
  3. 您需要將多個組件組合爲一個整數值。您可以使用|運算符執行此操作。在這種情況下,0xFF | 0xFF0000將變爲0xFF00FF

其餘的只是把我上面描述的樂高片放在一起放在正確的地方。

+0

謝謝,這是完美的。 – object 2013-05-10 21:45:14

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)))); 
} 

這可能是解決您的問題的方法。如果保證參數始終位於有效範圍內,可以刪除範圍檢查部分以獲得更高的性能。