天天看點

關于COLORREF與RGBQUAD的顔色轉換問題

觀察以下代碼:

COLORREF rgb = pDC->GetBkColor();

BYTE r,g,b;

r = GetRValue(rgb);

g = GetGValue(rgb); 

b = GetBValue(rgb);

COLORREF的存儲為 0x00BBGGRR,即R在低位。

在小端存儲模式中,低位址存放低位資料,高位址存放高位資料,windows使用小端存儲。

十六位數字0x11223344在小段模式存儲為 "低位址..44 33 22 11..高位址"

我們稱讀作:0x11223344,存作:44332211,(注意是十六進制資料)

假設一個顔色值 RR GG BB,使用COLORREF表示,則讀作:0x00BBGGRR,存作:RRGGBB00

而RGBQUAD是一個結構體,定義如下:

typedef struct tagRGBQUAD {

        BYTE    rgbBlue;

        BYTE    rgbGreen;

        BYTE    rgbRed;

        BYTE    rgbReserved;

} RGBQUAD;

結構體變量存儲的時候,跟字元串存儲方式一樣,是從開始到結束順序存儲,

如果把RGBQUAD當做一個字元串,則讀為:"AARRGGBB",

如果把RGBQUAD當做一個int型數字,則讀為:0xAARRGGBB,AA為alpha通道。

我們将數字0x11223344的最高位、次高位、次低位、最低位認作11、22、33、44。

這樣,在COLORREF中,紅色R被讀成最低位,藍色B被讀成次高位,最高位是0。

而在RGBQUAD中,紅色R被讀成次高位,藍色B被讀成最低位,最高位是alpha通道AA。

二者順序正好是相反的。

為了驗證上述說法,建立一個MFC項目,在cview類添加一個菜單響應函數,函數内代碼如下

COLORREF rgb;
	//rgb = pDC->GetBkColor();		//COLORREF的存儲為 0x00BBGGRR,即R在低位。
	rgb = 0x00332211;				//3是藍色B,1是紅色R
	BYTE r,g,b;						
	r = GetRValue(rgb);				
	g = GetGValue(rgb); 
	b = GetBValue(rgb); 
	RGBQUAD rgbquad;
	rgbquad.rgbBlue = b;
	rgbquad.rgbGreen = g;
	rgbquad.rgbRed = r;
	CString strrgb,strrgbquad;
	strrgb.Format("rgb=%x",rgb);
	strrgbquad.Format("rgbquad=%x",rgbquad);
	MessageBox(strrgb);
	MessageBox(strrgbquad);
           

通過單擊菜單項,先後彈出兩個消息框,第一個消息框如下:

關于COLORREF與RGBQUAD的顔色轉換問題

第二個消息框如下:

關于COLORREF與RGBQUAD的顔色轉換問題

繼續閱讀