2009-04-27 15 views
7
CGFloat* colors = CGColorGetComponents(hsbaColor.CGColor); 

क्या यह एक फ्लोट या फ्लोट की एक सरणी लौटाता है? ऐसा लगता है कि एक सरणी बनाने के लिए तारांकन कम है। क्या वो सही है?CGColorGetComponents() वापस क्या करता है?

जब मैं इस समारोह को एचएसबी यूआईसीओलर ऑब्जेक्ट की CGColor प्रॉपर्टी पर कॉल करता हूं तो क्या यह मान आरजीबी में परिवर्तित करता है?

उत्तर

4

हां, यह CGFloats की एक सरणी देता है। विशेष रूप से, यह निर्दिष्ट रंग से जुड़े रंग घटकों (अल्फा समेत) के लिए तीव्रता मानों की एक सरणी देता है। "

रंग घटकों का मानना ​​है कि CGColorRef पास किए गए रंग स्थान पर निर्भर करता है।

अधिक जानकारी CGColor documentation में मिल सकती है।

+0

@htw धन्यवाद। क्या इसका मतलब यह हमेशा आरजीबीए है? मैंने एपीआई में कहीं भी एचएसबीए कलर स्पेस नहीं देखा है। –

+0

हमेशा नहीं- उदाहरण के लिए सीएमवाईके या सफेद रंग स्थान में CGColor बनाया जा सकता था। हालांकि, ऐप्पल के रंग प्रोग्रामिंग दस्तावेज के अनुसार (http://developer.apple.com/DOCUMENTATION/Cocoa/Conceptual/DrawColor/index।एचटीएमएल), एचएसबीए रंग अंतरिक्ष आरजीबीए रंग अंतरिक्ष के रूप में नामित किया गया है। तो, हाँ, इस मामले में, यह आरजीबीए घटकों को वापस कर देगा, क्योंकि रंग एचएसबीए घटकों के साथ बनाया गया था। – hbw

+0

@htw धन्यवाद! मैं दस्तावेज़ों को देख रहा हूं। यह निश्चित रूप से मुझे खोजने के लिए जरूरी है। बहुत उपयोगी! –

1

Apple से:

यह एक क्वार्ट्ज रंग के साथ जुड़े (अल्फा सहित) रंग घटकों के मूल्यों देता है। निर्दिष्ट रंग से जुड़े रंग घटकों (अल्फा समेत) के लिए तीव्रता मानों की एक सरणी। सरणी का आकार रंग के लिए रंग स्थान के घटकों की संख्या से अधिक है।

5
CGFloat* colors = CGColorGetComponents(hsbaColor.CGColor); 

इस एक नाव, या तैरता की एक सरणी वापसी करता है? ऐसा लगता है कि एक सरणी बनाने के लिए तारांकन कम है। क्या वो सही है?

क्रमबद्ध करें।

CGFloat *colors एक चरक को कम से कम एक CGFloat पर एक सूचक घोषित करता है। CGColorGetComponents कई सीजीफ्लैट्स के लिए एक पॉइंटर देता है, एक दूसरे के बाद एक सी सरणी। आप उस पॉइंटर को लेते हैं और इसे colors वैरिएबल (पॉइंटर में डाल दें) को असाइन करते हैं।

चर घोषित करने से सरणी बनाते हैं। वास्तव में, न तो CGColorGetComponents करता है। जो भी बनाया गया CGColor ऑब्जेक्ट ने सरणी बनाई और इसे ऑब्जेक्ट के अंदर संग्रहीत किया; CGColorGetComponents आपको उस भंडारण के सूचक होने देता है।

CGFloat *colors वैरिएबल घोषित करने से केवल एक स्थान-चर-बनाता है-एक सूचक को एक या अधिक CGFloats में स्टोर करने के लिए। चर में चीज सूचक है, और उस सूचक पर चीज सरणी है।

यदि यह अभी भी अस्पष्ट है, तो Everything you need to know about pointers in C देखें।

+0

भंडारण का जीवनकाल क्या है (स्मृति में चार फ्लोट)? इसका मालिक कौन है? इसे पुनः प्राप्त कब किया जाता है? –

+1

@ निकोलसमिआरी: या तो रंग ऑब्जेक्ट उस सरणी का मालिक है जो आपको देखने देता है, इस मामले में यह रंग ऑब्जेक्ट से अधिक नहीं टिकेगा, या रंग ऑब्जेक्ट उस सरणी की प्रतिलिपि बनाता है और ऑटोरेलेसेस करता है, इस स्थिति में वर्तमान ऑटोरेलीज पूल के रूप में लंबे समय तक। –

0

आरजीबी घटकों का उपयोग मैं पाने के लिए:

// Get UIColor's RGB normalized components (0..1) 
CGFloat red, green, blue, alpha; 
[color getRed:&red green:&green blue:&blue alpha:&alpha]; 

// Convert RGB components to 8-bit values (0..255) 
int r = (int)(red * 255.0); 
int g = (int)(green * 255.0); 
int b = (int)(blue * 255.0);
0

यहाँ कैसे आप सही तरीके से एक NSColor myNSColor करने के लिए एक CGColorRef myColorRef परिवर्तित कर सकते हैं का एक उदाहरण है:

NSColorSpace *cp = [[NSColorSpace alloc] initWithCGColorSpace:CGColorGetColorSpace(myColorRef)]; 
const CGFloat *components = CGColorGetComponents(myColorRef); 
size_t componentCount = CGColorGetNumberOfComponents(myColorRef); 
NSColor* myNSColor = [NSColor colorWithColorSpace:cp components:components count:componentCount]; 
संबंधित मुद्दे