2010-06-10 57 views
5

Tôi khá mới với mục tiêu c nhưng đã lập trình được một thời gian. Tôi bắt đầu tạo ra một chức năng mà sẽ chuyển đổi từ RGB sang HSL và ngược lại nhưng tôi cảm thấy nó quá dài và đi sai hướng. Có ai biết một cách đơn giản để thực hiện chuyển đổi này?Chuyển đổi từ RGB sang HSL với Mục tiêu C

Trả lời

4

Bạn có thể sử dụng NSColor, tôi nghĩ vậy.

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]; 

Ngày nghĩ thứ hai, tôi không biết nếu NSColor có sẵn trong các khuôn khổ iPhone hay không - không phải là có một UIColor? Dù sao tôi sẽ để lại câu trả lời này trong trường hợp ai đó tìm kiếm một giải pháp OS X kết thúc ở đây.

+0

+1, mặc dù HSL không hoàn toàn giống HSB/HSV. Tuy nhiên, H và S cũng sẽ giống nhau. – Wevah

+0

@Wevah, wikipedia nói rằng nó không được tiêu chuẩn hóa lắm, và rằng bất kỳ tên nào có thể đi với bất kỳ mô hình nào. Tôi không đủ của một chuyên gia để biết sự tinh tế mặc dù. –

+0

Vâng, chúng là * loại * tiêu chuẩn. Hầu hết. Chủ yếu là nó chỉ là không may rằng các công cụ được xây dựng trong không xử lý HSL (ightness). :/Và nếu anh ấy thực sự muốn HSV/HSB, thì câu trả lời của bạn là hoàn hảo! – Wevah

1

Bạn có thể thêm danh mục UIColor-HSVAdditions.h/.m vào ứng dụng của mình để thêm một bộ hoạt động vào UIColor để làm việc với màu sắc, độ bão hòa và giá trị. Xem http://bravobug.com/news/?p=448 và bài viết này ArsTechnica.

1

Đây là những gì tôi đang sử dụng:

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

Và đây là làm thế nào để gọi nó là:

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

Cảm ơn! Chạy nhanh hơn nhiều so với sử dụng 'NSColor'. – VinceFior

+0

Cập nhật: Hàm này thực sự trả về các giá trị màu khác nhau hơn tôi nghĩ. Khi tôi sử dụng nó để chọn các dải màu khác nhau từ một bánh xe màu, nó nhảy xung quanh. Ngược lại, giải pháp sau quay quanh bánh xe màu như tôi mong đợi: http://stackoverflow.com/a/6930407/1976584 – VinceFior

Các vấn đề liên quan