2012-01-07 78 views
-1
#define RGB2BGR(a_ulColor) (a_ulColor & 0xFF000000) | ((a_ulColor & 0xFF0000) >> 16) | (a_ulColor & 0x00FF00) | ((a_ulColor & 0x0000FF) << 16) 

請問您能向我解釋這個宏的含義嗎?RGB到BGR的解釋C++宏

+0

這個宏是相對平凡的。無論如何,你應該嘗試自己更好地理解它,或者更詳細地解釋你不瞭解的內容。 – jmkeyes 2012-01-08 00:01:04

回答

10

顏色通常由32位整數表示。 32位整數可以保存四個8位字節。其中三個用於保存紅色,綠色和藍色的顏色信息。剩餘的字節不用或者用於保存透明度信息。

哪個字節代表哪種顏色不標準化。一些API期望這樣的字節:

(MSB) ******** rrrrrrrr gggggggg bbbbbbbb (LSB) 

這是「RGB」佈局,也許是最常見的形式。在上面的圖解中,最顯着的8位是「不關心」位,即沒有使用的位。最不重要的8位存儲藍色的信息。

某些API期待的3個色字節相反,像這樣:

(MSB) ******** bbbbbbbb gggggggg rrrrrrrr (LSB) 

哪個是 「BGR」 佈局。

該宏可幫助使用按位運算符將兩個佈局進行相互轉換。讓我們來看看它的定義:

(a_ulColor & 0xFF000000) | ((a_ulColor & 0xFF0000) >> 16) | 
(a_ulColor & 0x00FF00) | ((a_ulColor & 0x0000FF) << 16) 

比方說,我們有一個顏色,Cornflower Blue,其中有0x93CCEA的值。在RGB佈局,它具有以下的位模式:

a_ulColor = 00000000 10010011 11001100 11101010 

以下表達式爲您提供以下模式:

1. a_ulColor & 0xFF000000 --> 00000000 00000000 00000000 00000000 
2. a_ulColor & 0xFF0000 --> 00000000 10010011 00000000 00000000 
3. a_ulColor & 0x00FF00 --> 00000000 00000000 11001100 00000000 
4. a_ulColor & 0x0000FF --> 00000000 00000000 00000000 11101010 

注意到我們只是提取單個字節。表達式#1提取最重要的8位,表達式#4提取最不重要的8位。我們通過the AND bitwise operation可以做到這一點。

現在,要將RGB轉換爲BGR,我們必須通過bitshifts向左或向右移動一些位。像這樣:

1. (a_ulColor & 0xFF000000)  --> 00000000 00000000 00000000 00000000 
2. (a_ulColor & 0xFF0000) >> 16 --> 00000000 00000000 00000000 10010011 
3. (a_ulColor & 0x00FF00)  --> 00000000 00000000 11001100 00000000 
4. (a_ulColor & 0x0000FF) << 16 --> 00000000 11101010 00000000 00000000 

表達a >> 16簡單地通過16個比特移位的位到右側。 a << 16將位向左移位16位。

然後,當你OR它們放在一起,你會得到這樣的:

00000000 11101010 11001100 10010011 

結果進行比較,以原來的位模式:

00000000 11101010 11001100 10010011 
00000000 10010011 11001100 11101010 

你可以看到,第二和第四個字節交換。這就是所有的宏。

0

它將字節大小的RGB元素的順序從RGB切換到BGR(反之亦然,公平地說)。

0

a_ulColor是32位RGB表示(例如像素或位圖)。該宏將其轉換爲BGR佈局。它通過交換紅色和藍色成分值有效地產生新的價值。

2

它需要一個四字節的整數值,AA BB CC DD,並返回值AA DD CC BB。您可以看到第一個和第三個字節保持不變,而第二個字節向下移動兩個字節(>> 16),第四個向上移動兩個(<< 16)。