MSDN states:विंडोज जीडीआई बीजीआरए के बजाय `COLORREF` के लिए आरजीबीए प्रारूप का उपयोग क्यों करता है?
0x00bbggrr
कम आदेश बाइट के रिश्तेदार तीव्रता के लिए एक मूल्य में शामिल है: हेक्साडेसिमल प्रपत्र निम्नलिखित
जब एक स्पष्ट आरजीबी रंग निर्दिष्ट करते समय, COLORREF मूल्य है लाल; दूसरे बाइट में हरे रंग के लिए मान होता है; और तीसरे बाइट में नीले रंग के लिए एक मान होता है। उच्च-आदेश बाइट शून्य होना चाहिए। एक बाइट के लिए अधिकतम मान 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))
से खिड़कियों के रूप में, थोड़ा endian है COLORREF
RGBA प्रारूप में है। यह अजीब लगता है क्योंकि रंग प्रारूप नहीं है जो विंडोज आंतरिक रूप से उपयोग करता है, बीजीआर (ए)?
RGBQUAD
संरचना COLORREF
, BGRA के विपरीत,
typedef struct tagRGBQUAD {
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
} RGBQUAD;
है जो के रूप में परिभाषित किया गया है।
के बाद से bitblt
समारोह COLORREF
मूल्यों की एक सरणी की उम्मीद है, इसका मतलब है हमेशा हर कॉल के दौरान BGRA को RGBA से चल रहा एक अतिरिक्त रूपांतरण है कि वहाँ है, अगर विंडोज अपने मूल प्रारूप के रूप में BGRA का उपयोग करें।
मुझे सही याद नहीं है, लेकिन मैंने कहीं भी पढ़ा है कि Winapi में उपयोग किए गए पिक्सेल प्रारूप में एक अजीब मिश्रण है।
क्या कोई कृपया समझा सकता है?
आपका दावा असत्य है; मैक्रोज़ स्पष्ट रूप से 0x00bbggrr क्रम में COLORREF को इकट्ठा करते हैं। उन्हें फिर से देखें, या उनका उपयोग करके कुछ कोड लिखें और परिणाम देखें। – Clifford
विंडोज बीएमपी फाइलों के लिए ओएस/2 प्रारूप का उपयोग करता है, और ओएस/2 प्रारूप कुछ अन्य तरीकों से भिन्न होता है जो विंडोज अन्यथा पसंद करेंगे। एक ऐसा है जिसे आपने पहले ही देखा है: आर और बी फ़्लिप किए गए हैं। दूसरा यह है कि ओएस/2 बिटमैप्स टॉप-डाउन के बजाय नीचे-नीचे हैं। –
@ रेमंड चेन बिल्कुल! इसके कारण मुझे हमेशा बिट-अप की ऊंचाई निर्दिष्ट करते समय '-' रखना होगा .. फिर जीडीआई में आरजीबी प्रारूप रूपांतरण के बिना बिना किसी फिसलने का कोई तरीका है? – xiver77