2010-06-10 10 views
5

के साथ आरजीबी से एचएसएल में कनवर्ट करना मैं उद्देश्य सी के लिए काफी नया हूं लेकिन थोड़ी देर के लिए प्रोग्रामिंग कर रहा हूं। मैंने एक ऐसा फ़ंक्शन बनाना शुरू किया जो आरजीबी से एचएसएल में परिवर्तित हो जाए और फिर वापस आ जाए लेकिन मुझे लगता है कि यह बहुत लंबा रास्ता है और गलत दिशा में आगे बढ़ रहा है। क्या कोई इस रूपांतरण को करने के लिए एक आसान तरीका जानता है?उद्देश्य सी

उत्तर

6

आईएससी एसडीके में एनएससीओलर गायब है। आप आरजीबी से एचएसएल अंतरिक्ष और वापस करने के लिए परिवर्तित करने के लिए इस सुविधा का उपयोग कर सकते हैं:

https://github.com/alessani/ColorConverter

4

, मुझे लगता है कि आप NSColor का उपयोग कर सकते हैं।

CGFloat r, g, b, a, h, s, b, a2; 
NSColor *c = [NSColor colorWithCalibratedRed:r green:g blue:b alpha:a]; 
[c getHue:&h saturation:&s brightness:&b alpha:&a2]; 

दूसरी सोचा पर, मैं अगर NSColor iPhone चौखटे में उपलब्ध है या नहीं पता नहीं है - वहाँ एक UIColor नहीं है? वैसे भी अगर मैं ओएस एक्स समाधान की खोज करता हूं तो यहां यह जवाब समाप्त हो जाएगा।

+0

+1, हालांकि एचएसएल एचएसबी/एचएसवी के समान नहीं है। हालांकि, एच और एस समान होना चाहिए। – Wevah

+0

@ वेवा, विकिपीडिया का कहना है कि यह बहुत मानकीकृत नहीं है, और कोई भी नाम किसी भी मॉडल के साथ जा सकता है। हालांकि मैं subtleties जानने के लिए एक विशेषज्ञ के पर्याप्त नहीं हूँ। –

+0

ठीक है, वे मानक के * क्रम * हैं। लगभग। ज्यादातर यह दुर्भाग्यपूर्ण है कि अंतर्निर्मित सामान एचएसएल (दृष्टि) को संभाल नहीं पाता है। :/और अगर वह वास्तव में एचएसवी/एचएसबी चाहता है, तो आपका जवाब सही है! – Wevah

1

आप अपने ऐप में UIColor-HSVAdditions.h/.m श्रेणी जोड़ सकते हैं ताकि UIColor में परिचालनों का एक सेट जोड़ने के लिए रंग, संतृप्ति और मूल्य के साथ काम किया जा सके। http://bravobug.com/news/?p=448 और देखें ArsTechnica आलेख भी।

1

यहाँ मैं क्या उपयोग कर रहा हूँ है:

static void RVNColorRGBtoHSL(CGFloat red, CGFloat green, CGFloat blue, CGFloat *hue, CGFloat *saturation, CGFloat *lightness) 
{ 
    CGFloat r = red/255.0f; 
    CGFloat g = green/255.0f; 
    CGFloat b = blue/255.0f; 

    CGFloat max = MAX(r, g); 
    max = MAX(max, b); 
    CGFloat min = MIN(r, g); 
    min = MIN(min, b); 

    CGFloat h; 
    CGFloat s; 
    CGFloat l = (max + min)/2.0f; 

    if (max == min) { 
     h = 0.0f; 
     s = 0.0f; 
    } 

    else { 
     CGFloat d = max - min; 
     s = l > 0.5f ? d/(2.0f - max - min) : d/(max + min); 

     if (max == r) { 
      h = (g - b)/d + (g < b ? 6.0f : 0.0f); 
     } 

     else if (max == g) { 
      h = (b - r)/d + 2.0f; 
     } 

     else if (max == b) { 
      h = (r - g)/d + 4.0f; 
     } 

     h /= 6.0f; 
    } 

    if (hue) { 
     *hue = roundf(h * 255.0f); 
    } 

    if (saturation) { 
     *saturation = roundf(s * 255.0f); 
    } 

    if (lightness) { 
     *lightness = roundf(l * 255.0f); 
    } 
} 

और यहाँ है कि यह कैसे कॉल करने के लिए है:

CGFloat h, s, l; 
RVNColorRGBtoHSL(r, g, b, 
       &h, &s, &l); 
+0

धन्यवाद से उपलब्ध है! 'NSColor' का उपयोग करने से कहीं अधिक तेज़ी से चलता है। – VinceFior

+0

अद्यतन: यह फ़ंक्शन वास्तव में अलग-अलग रंग मान देता है जो मुझे लगता है कि इसे करना चाहिए। जब मैं रंगीन पहिया से विभिन्न रंगों का चयन करने के लिए इसका उपयोग करता हूं, तो यह चारों ओर कूदता है। इसके विपरीत, निम्न समाधान रंगीन चक्र के चारों ओर घूमता है जैसा कि मैं अपेक्षा करता हूं: http://stackoverflow.com/a/6930407/1976584 – VinceFior