2012-07-28 48 views
3

我想使用this algorithm將HSB值轉換爲RGB值,但我沒有得到正確的值。我有固定S的29,一個固定的B的100,並且正在生成的H值之間0-360的隨機整數,並將它們饋入該函數以獲取RGB回:目標C中HSB顏色轉換爲RGB

enter image description here

float h = (arc4random() % 360); 
float s = 29; 
float b = 100; 
HSL2RGB(h, s, b, &red, &green, &blue); 
NSLog(@"r:%f g:%f b:%f", red, green, blue); 

輸出:

r:2971.000000 g:2971.000000 b:2971.000000 

我想這太:

float h = (arc4random() % 360)/1000.0; 
float s = 0.29; 
float b = 1.0; 
HSL2RGB(h, s, b, &red, &green, &blue); 
NSLog(@"r:%f g:%f b:%f", red, green, blue); 

輸出:

r:1.000000 g:1.000000 b:1.000000

我做得不對,或者是這個算法搞砸?

+5

['+ [UIColor colorWithHue:saturation:brightness:alpha:]']有什麼問題嗎?(http://developer.apple.com/library/ios/#documentation/uikit/reference/UIColor_Class/Reference/ #的reference.html // apple_ref/OCC/CLM /的UIColor/colorWithHue:飽和度:亮度:阿爾法:)? – rid 2012-07-28 21:30:20

+0

哇。我一直在尋找一個好算法的小時,並且我一直都在這裏: – Snowman 2012-07-28 21:33:38

+0

雖然我沒有得到他們想要色調是從0 - 1的值,當我以0 - 360的度數獲得時。 – Snowman 2012-07-28 21:36:01

回答

4

我不知道你的算法,但我,你應該使用這個algorigthm:

typedef struct 
{ 
    double r;  // percent [0 - 1] 
    double g;  // percent [0 - 1] 
    double b;  // percent [0 - 1] 
    double a;  // percent [0 - 1] 
} RGBA; 

typedef struct 
{ 
    double h;  // angle in degrees [0 - 360] 
    double s;  // percent [0 - 1] 
    double v;  // percent [0 - 1] 
} HSV; 

- (RGBA)RGBfromHSV:(HSV)value 
{ 
    double  hh, p, q, t, ff; 
    long  i; 
    RGBA  out; 
    out.a  = 1; 

    if (value.s <= 0.0) // < is bogus, just shuts up warnings 
    {  
     if (isnan(value.h)) // value.h == NAN 
     { 
      out.r = value.v; 
      out.g = value.v; 
      out.b = value.v; 
      return out; 
     } 

     // error - should never happen 
     out.r = 0.0; 
     out.g = 0.0; 
     out.b = 0.0; 
     return out; 
    } 

    hh = value.h; 
    if(hh >= 360.0) hh = 0.0; 
    hh /= 60.0; 
    i = (long)hh; 
    ff = hh - i; 
    p = value.v * (1.0 - value.s); 
    q = value.v * (1.0 - (value.s * ff)); 
    t = value.v * (1.0 - (value.s * (1.0 - ff))); 

    switch(i) 
    { 
     case 0: 
      out.r = value.v; 
      out.g = t; 
      out.b = p; 
      break; 
     case 1: 
      out.r = q; 
      out.g = value.v; 
      out.b = p; 
      break; 
     case 2: 
      out.r = p; 
      out.g = value.v; 
      out.b = t; 
      break; 

     case 3: 
      out.r = p; 
      out.g = q; 
      out.b = value.v; 
      break; 
     case 4: 
      out.r = t; 
      out.g = p; 
      out.b = value.v; 
      break; 
     case 5: 
     default: 
      out.r = value.v; 
      out.g = p; 
      out.b = q; 
      break; 
    } 
    return out;  
} 

我用它爲自己我的項目,我沒有任何問題的。 :)

+0

它使用的輸入值的範圍是什麼?0-360,0-1,0-1? – Snowman 2012-07-28 21:27:53

+0

謝謝,這工作很好:)不知道這些其他算法是什麼.. – Snowman 2012-07-28 21:34:05

+0

我編輯了這篇文章。百分比值的範圍在0-1和0-360之間。 – 2012-07-28 21:34:27

9

您可以直接使用UIKit輕鬆獲取使用HSB構建的顏色的RGB分量。

UIColor *color = [UIColor colorWithHue: hue saturation: saturation 
          brightness: brightness alpha: alpha]; 
if ([color getRed: &red green: &green blue: &blue alpha: &alpha]) { 
    // color converted 
} 

如果您只關心使用顏色,您可以跳過if並使用它。

每蘋果UIColor documentation

如果顏色是兼容的色彩空間,色彩轉換成RGB格式及其組件返回到您的應用程序。如果顏色不在兼容的顏色空間中,則參數不變。

這種情況下的兼容色彩空間是RGB或HSB。

+0

測試這種方法,它絕對有效。 – 2014-01-30 18:32:48