2011-03-12 95 views
2

我想從UIColor中獲取單個值。不確定如何做到這一點?如何從UIColor中獲得色調,飽和度和亮度?

+1

可能的[UIColor comparison]重複(http://stackoverflow.com/questions/3622217/uicolor-comparison) – 2011-03-12 18:17:58

+0

不確定問題是重複,但@Matt球是正確的 - 另一個Q有你的答案。你想要的代碼是http://bravobug.com/news/?p=448 – skue 2011-03-12 18:28:49

+0

上述文件不再可用:( – Santthosh 2011-06-18 06:12:03

回答

1

在蘋果公司的GLPaint示例代碼中有一個叫做HSL2RGB()的函數,它可以做你想做的事情。該函數上面的註釋指向Wikipedia以獲取代碼的解釋,這可能會幫助您瞭解正在發生的事情。

8
static void RGBtoHSV(float r, float g, float b, float *h, float *s, float *v) 
{ 
    float min, max, delta; 
    min = MIN(r, MIN(g, b)); 
    max = MAX(r, MAX(g, b)); 
    *v = max;    // v 
    delta = max - min; 
    if(max != 0) 
     *s = delta/max;  // s 
    else { 
     // r = g = b = 0  // s = 0, v is undefined 
     *s = 0; 
     *h = -1; 
     return; 
    } 
    if(r == max) 
     *h = (g - b)/delta;  // between yellow & magenta 
    else if(g == max) 
     *h = 2 + (b - r)/delta; // between cyan & yellow 
    else 
     *h = 4 + (r - g)/delta; // between magenta & cyan 
    *h *= 60;    // degrees 
    if(*h < 0) 
     *h += 360; 
} 

static void HSVtoRGB(float *r, float *g, float *b, float h, float s, float v) 
{ 
    int i; 
    float f, p, q, t; 
    if(s == 0) { 
     // achromatic (grey) 
     *r = *g = *b = v; 
     return; 
    } 
    h /= 60;   // sector 0 to 5 
    i = floor(h); 
    f = h - i;   // factorial part of h 
    p = v * (1 - s); 
    q = v * (1 - s * f); 
    t = v * (1 - s * (1 - f)); 
    switch(i) { 
     case 0: 
      *r = v; 
      *g = t; 
      *b = p; 
      break; 
     case 1: 
      *r = q; 
      *g = v; 
      *b = p; 
      break; 
     case 2: 
      *r = p; 
      *g = v; 
      *b = t; 
      break; 
     case 3: 
      *r = p; 
      *g = q; 
      *b = v; 
      break; 
     case 4: 
      *r = t; 
      *g = p; 
      *b = v; 
      break; 
     default:  // case 5: 
      *r = v; 
      *g = p; 
      *b = q; 
      break; 
    } 
} 

... 

CGFloat r, g, b, a, h, s, v; 

const CGFloat *comp = CGColorGetComponents([myUIColor CGColor]); 

r = comp[0]; 
g = comp[1]; 
b = comp[2]; 
a = comp[3]; 

RGBtoHSV(r, g, b, &h, &s, &v); 

上面的代碼假定UIColor設置在RGB空間(這是典型的)。如果顏色處於另一個顏色空間,它將會崩潰和/或具有未定義的行爲。

iOS 5.0有- (BOOL)getHue:(CGFloat *)hue saturation:(CGFloat *)saturation brightness:(CGFloat *)brightness alpha:(CGFloat *)alpha它可以爲您完成所有這些工作。但目前尚未提供。

+4

這個答案在技術上是正確的,但需要額外的一行才能使它與Apple的庫一起工作。在RGB2HSV的末尾添加一行:「* h/= 360.0;」 - 因爲Apple在0.0..1.0中指定H,而不是Photoshop中的方式爲0..360 – Adam 2012-01-15 22:06:24

+0

你應該分別用這種方式計算扇區:'if(h == 1.0)h = 0.0;否則h * = 6.0'(而不是分割如果你的H值在[0.0 ... 1.0]內,則在hsv2rgb()中爲60) – kervich 2012-12-07 13:41:00

1

在達斯汀的算法的底部,他提到所有的UIColor對象的iOS 5及更高版本現在有

getHue:saturation:brightness:alpha: 

這使得它很容易從一種顏色得到的值。這絕對是現在最簡單的解決方案,並且大多數人都在iOS 5上。

+0

但對於那些不在iOS 5中的人(是的,他們仍然存在),使用這種方法會導致非常及時的崩潰。 – 2013-02-18 23:50:58

+0

絕對 - 我的意思是對那些以現代iOS構建爲目標的人的評論。如果你可以放過iOS 4用戶,因爲在iOS 5中有很多事情發生了變化(更好),所以它絕對值得維護。 – 2013-02-19 03:38:56

相關問題