關於COLORREF與RGBQUAD的顏色轉換問題

2021-06-07 08:25:50 字數 1449 閱讀 2781

觀察以下**:

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 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與RGB的相互轉化

rgb r,g,b 是乙個巨集 實際上它做得事是 colorref byte r word byte g 8 dword byte b 16 rgb r,g,b 乙個整型值 r g 256 b 255 256 colorref 是 一 個 32 bit 整 型 數 值,它 代 表 了 一 種 顏 色...

關於兄弟與朋友

最近很忙很忙,星期五晚上幾乎徹夜加班,沒有一段完整的時間讓自己靜下心來思考,說說心裡話。有些東西有必要記下,因為時間長了,會遺忘的,甚至連回憶也留不下。很多年都沒有坐下來認真動筆寫字了,包括前幾篇寫的,我是用鍵盤敲出來的。前幾天想寫 one fine day,考慮到坐在電腦前沒有那麼多時間,我選擇用...

關於工作與生活

普通人 我發現中國人的勵志和國外的勵志存在非常大的不同,中國的勵志比較鼓勵人立下大志願,臥薪嘗膽,有朝一日成富成貴。而國外的勵志比較鼓勵人勇敢面對現實生活,面對普通人的困境,雖然結果也是成富成貴,但起點不一樣,相對來說,我覺得後者在操作上更現實,而前者則需要用999個失敗者來堆砌乙個成功者的故事。我...