2015-06-17 8 views
5

MSDN states:Warum verwendet Windows GDI das RGBA-Format für `COLORREF` anstelle von BGRA?

Wenn eine explizite RGB Farbspezifizierungs der COLORREF Wert der folgenden hexadezimaler Form hat:

0x00bbggrr

Das niederwertige Byte einen Wert für die relative Intensität enthält von rot; das zweite Byte enthält einen Wert für grün; und das dritte Byte enthält einen Wert für Blau. Das höherwertige Byte muss Null sein. Der Maximalwert für ein einzelnes Byte ist 0xFF.

Von 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)) 

Als Fenster ist Little-Endian, COLORREF im RGBA-Format ist. Das sieht komisch aus, denn ist das Farbformat, das Windows intern verwendet, nicht BGR (A)?

RGBQUAD Die Struktur ist wie folgt definiert

typedef struct tagRGBQUAD { 
    BYTE rgbBlue; 
    BYTE rgbGreen; 
    BYTE rgbRed; 
    BYTE rgbReserved; 
} RGBQUAD; 

welche, im Gegensatz zu COLORREF, BGRA.

Da die bitblt-Funktion ein Array von COLORREF Werten erwartet, bedeutet dies, dass bei jedem Aufruf eine zusätzliche Konvertierung von RGBA zu BGRA stattfindet, wenn Windows BGRA als natives Format verwendet.

Ich erinnere mich nicht richtig, aber ich habe auch irgendwo gelesen, dass es eine seltsame Mischung im Pixel-Format in der Winapi verwendet.

Kann mir bitte jemand erklären?

+0

Ihre Behauptung ist unwahr; Die Makros ordnen COLORREF in der Reihenfolge 0x00bbggrr eindeutig zusammen. Schau sie dir nochmal an, oder schreibe Code mit ihnen und beobachte das Ergebnis. – Clifford

+4

Windows verwendet das OS/2-Format für BMP-Dateien, und das OS/2-Format unterscheidet sich in einigen Punkten von dem, was Windows sonst bevorzugen würde. Eines ist dir schon aufgefallen: R und B sind umgedreht. Ein anderer Grund ist, dass OS/2-Bitmaps nicht von oben nach unten, sondern von unten nach oben verlaufen. –

+0

@ RaymondChen Genau! Ich muss immer ein '-' angeben, wenn ich die Höhe der Bitmap festlege. Dann gibt es eine Möglichkeit zu blittieren, ohne die RGB-Formatkonvertierung in GDI zu durchlaufen. – xiver77

Antwort

0

COLORREFs gehen weit zurück, als es viel weniger Standardisierung in Pixelformaten gab. Viele Grafikkarten verwendeten immer noch Paletten anstelle der vollen 24- oder 32-Bit-Farbe. Selbst wenn Ihr Adapter eine erneute Byte-Reihenfolge erforderte, mussten Sie nicht viele davon verwenden. Einige Grafikadapter speicherten sogar Bilder in separaten Farbebenen anstelle einer einzelnen Ebene von Mehrkanalfarben. Damals gab es keine "richtige" Antwort.

RGBQUADs kamen aus dem BMP-Format, das, wie Raymond Chen in den Kommentaren erwähnt hat, aus dem OS/2-Bitmap-Format stammt.