2010-06-10 14 views
5

Nesne için oldukça yeni ama bir süredir programlama yapıyorum. RGB'den HSL'ye ve tekrar geri dönecek bir işlev oluşturmaya başladım, ancak çok uzun bir yol olduğunu ve yanlış yöne gittiğini hissediyorum. Bu dönüşümü gerçekleştirmenin basit bir yolu bilen var mı?Hedef C ile RGB'den HSL'ye Dönüştürme

cevap

4

NSColor'u kullanabilirsiniz, bence.

Düşündüm de
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]; 

, ben NSColor iPhone çerçeveler mevcut olup olmadığını bilmiyorum - bir UIColor yok? Her neyse, bir OS X çözümü arayan birinin burada biter olması durumunda bu cevabı bırakacağım.

+0

+1, HSL HSB/HSV ile aynı değildir. Yine de, H ve S aynı olmalıdır. – Wevah

+0

@Wevah, wikipedia çok standartlaştırılmadığını ve isimlerden herhangi birinin modellerin herhangi biriyle gidebileceğini söylüyor. Ancak incelikleri bilmek için bir uzman yeterli değilim. –

+0

Eh, onlar standart * sort *. Neredeyse. Çoğunlukla, yerleşik şeylerin HSL (ightness) ile baş etmemesi talihsiz bir durumdur. : Ve eğer gerçekten HSV/HSB'yi istiyorsa, cevabınız mükemmel! – Wevah

1

UIColor'a ton, doygunluk ve değer ile çalışmak için bir işlem kümesi eklemek için UIColor-HSVAdditions.h/.m kategorisini uygulamanıza ekleyebilirsiniz. Ayrıca, http://bravobug.com/news/?p=448 ve numaralı makalede de bu ArsTechnica makalesine bakın. IPhone SDK'da NSColor eksik

1

kullanıyorum ne::

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); 
    } 
} 

Ve burada diyoruz için:

CGFloat h, s, l; 
RVNColorRGBtoHSL(r, g, b, 
       &h, &s, &l); 
Sen HSL alanı ve arka RGB dönüştürmek için bu programı kullanabilirsiniz
+0

Teşekkürler! 'NSColor' kullanmadan çok daha hızlı çalışır. – VinceFior

+0

Güncelleştirme: Bu işlev, aslında gerektiğinden farklı ton değerleri döndürür. Bir renk tekerleğinden farklı ton aralıkları seçmek için kullandığımda, etrafında atlar. Tersine, aşağıdaki çözüm beklediğim gibi renk tekerleği etrafında döner: http://stackoverflow.com/a/6930407/1976584 – VinceFior

İlgili konular