सी

2010-09-16 2 views
8

में एचएक्स रंग से आरजीबी संरचना में कनवर्ट करें रंग एचएक्स कोड से आरजीबी में सी सी लाइब्रेरी का उपयोग करके केवल सी पुस्तकालय (सी ++, टेम्पलेट्स आदि के बिना) में कनवर्ट करें आरजीबी स्ट्रक्चर इस तरह हो सकता है -> टाइपपीफ स्ट्रक्चर आरजीबी {डबल आर; डबल जी; डबल बी; } आरजीबी 1; फ़ंक्शन को आरजीबी 1सी

+1

मुझे यकीन नहीं है कि मैं सवाल समझता हूं। मेरा मानना ​​है कि रणनीतिक स्थानों में प्रश्न में कोड और/या न्यूलाइन डालने के रूप में चीजों को ध्वजांकित करना लोगों को पढ़ने के लिए प्रश्न को आसान बनाने में सहायक हो सकता है (और इसलिए उत्तर दें)। – cubic1271

उत्तर

8

एक आरजीबी मान को 0xRRGGBB के माध्यम से पूर्णांक में संग्रहीत किया जाना चाहिए। उदाहरण:

  • लाल: 0xff0000
  • ग्रीन: 0x00ff00
  • ब्लू: 0x0000ff

00, दशमलव 0 के लिए हेक्स है, जबकि एफएफ 255 0 0.0 और 255 1.0 से मेल खाती है है। (असल में आपने यह निर्दिष्ट नहीं किया कि सीमा क्या है। मैं 0.0 से 1.0 मान रहा हूं।)

तो उपर्युक्त मान्यताओं के साथ, आपको प्रत्येक घटक निकालने और 255 तक विभाजित करने की आवश्यकता है। चूंकि यह होमवर्क की तरह बहुत कुछ लगता है प्रश्न, मैं आपको दिखाऊंगा कि आप लाल घटक कैसे कर सकते हैं।

int hex = 0x123456; 
c.r = ((hex >> 16) & 0xff)/255.0; 

प्रत्येक हेक्स अंक 4 बिट्स लेता है। तो 0xRRGGBB0xRR बनने के लिए 16 बिट्स (दाईं ओर 4 अंकों को दाएं स्थानांतरित करने के लिए) पर दाईं ओर स्थानांतरित करें। अब आपके पास लाल घटक है। (अगर पूर्णांक में कुछ डेटा अधिक होता है, तो आप & 0xff के माध्यम से डेटा को मास्क करके इसे से छुटकारा पा सकते हैं।)

यदि आप "#FFFFFF" स्ट्रिंग से निपट रहे हैं, तो आपको पहले इसे परिवर्तित करना होगा उपर्युक्त काम करने के लिए एक पूर्णांक के लिए।

14

यह मानते हुए कि आपके हेक्स मान एक 32-बिट 'int' प्रकार है, और है कि हम आरजीबी struct ऊपर वर्णित का उपयोग करें, तो शायद कुछ ऐसा कार्य करें:

struct RGB colorConverter(int hexValue) 
{ 
    struct RGB rgbColor; 
    rgbColor.r = ((hexValue >> 16) & 0xFF)/255.0; // Extract the RR byte 
    rgbColor.g = ((hexValue >> 8) & 0xFF)/255.0; // Extract the GG byte 
    rgbColor.b = ((hexValue) & 0xFF)/255.0;  // Extract the BB byte 

    return rgbColor; 
} 
+0

उत्तर @ konforce के जवाब को दूर करने की तरह हम नहीं हैं? – ubiquibacon

+0

नहीं। वहां स्ट्रिंग प्रोसेसिंग के लिए कोड भी था, लेकिन इसके बारे में बताए गए बिंदु कॉनफोर्स शायद होमवर्क प्रश्न होने के नाते एक अच्छा था। इस प्रकार, मैंने इस उत्तर को ऊपर पोस्ट किए गए एक कोन की तरह संपादित करने के लिए संपादित किया। – cubic1271

+0

क्या हेक्स वैल्यू को बिना हस्ताक्षर किए गए int टाइप किया जाना चाहिए? मुझे लगता है कि 0xFF अंकगणितीय शिफ्ट को रद्द कर देता है, लेकिन 0xFFFFFF जैसे मान को पारित होने पर ओवरफ़्लो का कारण नहीं होगा? –

1

मुझे लगता है कि आरजीबी 0xRRGGBB के रूप में जमा किया जा सकता है कुछ प्रणालियों पर, लेकिन विंडोज़ में इसे वास्तव में 0xBBGGRR के रूप में संग्रहीत किया जाता है (http://msdn.microsoft.com/en-us/library/windows/desktop/dd183449 देखें)। जैसा कि लेख का उल्लेख है, मैक्रोज़ GetRValue, GetGValue, और GetBValue पहले से ही उपलब्ध हैं।

6

हेक्स कोड एक स्ट्रिंग है, तो आप इसे इस

char *str = "0000FF"; 
int r, g, b; 
sscanf(str, "%02x%02x%02x", &r, &g, &b); 

ints, नहीं डबल्स करने के लिए है कि जैसे पार्स कर सकते हैं। यह भी जांचें कि sscanf रिटर्न 3, आइटम पढ़ने की संख्या।

+0

महान उत्तर, सरल और काम कर रहा है! –