#define RGB2BGR(a_ulColor) (a_ulColor & 0xFF000000) | ((a_ulColor & 0xFF0000) >> 16) | (a_ulColor & 0x00FF00) | ((a_ulColor & 0x0000FF) << 16)
請問您能向我解釋這個宏的含義嗎?RGB到BGR的解釋C++宏
#define RGB2BGR(a_ulColor) (a_ulColor & 0xFF000000) | ((a_ulColor & 0xFF0000) >> 16) | (a_ulColor & 0x00FF00) | ((a_ulColor & 0x0000FF) << 16)
請問您能向我解釋這個宏的含義嗎?RGB到BGR的解釋C++宏
顏色通常由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
你可以看到,第二和第四個字節交換。這就是所有的宏。
它將字節大小的RGB元素的順序從RGB切換到BGR(反之亦然,公平地說)。
a_ulColor
是32位RGB表示(例如像素或位圖)。該宏將其轉換爲BGR佈局。它通過交換紅色和藍色成分值有效地產生新的價值。
它需要一個四字節的整數值,AA BB CC DD
,並返回值AA DD CC BB
。您可以看到第一個和第三個字節保持不變,而第二個字節向下移動兩個字節(>> 16
),第四個向上移動兩個(<< 16
)。
這個宏是相對平凡的。無論如何,你應該嘗試自己更好地理解它,或者更詳細地解釋你不瞭解的內容。 – jmkeyes 2012-01-08 00:01:04