[英]Why does windows GDI use RGBA format for `COLORREF` instead of BGRA?
MSDN聲明 :
指定顯式RGB顏色時,COLORREF值具有以下十六進制形式:
0x00bbggrr
低位字節包含紅色相對強度的值; 第二個字節包含綠色值; 第三個字節包含藍色的值。 高位字節必須為零。 單個字節的最大值為0xFF。
來自wingdi.h
#define RGB(r,g,b) ((COLORREF)((BYTE)(r) | ((BYTE)(g) << 8) | ((BYTE)(b) << 16)))
#define GetRValue(rgb) ((BYTE) (rgb) )
#define GetGValue(rgb) ((BYTE) ((rgb) >> 8))
#define GetBValue(rgb) ((BYTE) ((rgb) >> 16))
由於windows是小端, COLORREF
采用RGBA格式。 這看起來很奇怪,因為它不是Windows內部使用的顏色格式,BGR(A)?
RGBQUAD
結構定義為
typedef struct tagRGBQUAD {
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
} RGBQUAD;
與COLORREF
不同,BGRA。
由於bitblt
函數需要一個COLORREF
值數組,這意味着如果Windows使用BGRA作為其本機格式,則在每次調用期間總會有一個從RGBA到BGRA的額外轉換。
我不記得了,但我也讀到某處,在winapi中使用的像素格式有一種奇怪的混合。
有人可以解釋一下嗎?
COLORREF可以追溯到像素格式標准化程度要低得多的時候。 許多圖形適配器仍然使用調色板而不是完整的24位或32位顏色,因此即使您的適配器需要重新排序字節,您也不需要執行很多調整。 某些圖形適配器甚至將圖像存儲在單獨的顏色平面中,而不是單個多通道顏色平面。 當時沒有“正確”的答案。
RGBQUADs來自BMP格式,正如Raymond Chen在評論中提到的那樣,來自OS / 2位圖格式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.