2011-03-12 85 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

相关问题