簡體   English   中英

為什么Windows GDI使用RGBA格式代替`COLORREF`而不是BGRA?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM