【问题标题】:How do i get the hue, saturation and brightness from a UIColor?如何从 UIColor 中获取色调、饱和度和亮度?
【发布时间】:2011-03-12 18:11:45
【问题描述】:

我想从 UIColor 中获取单个值。不知道怎么做?

【问题讨论】:

标签: iphone objective-c uicolor


【解决方案1】:
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 为您完成所有这些工作。但目前还没有。

【讨论】:

  • 这个答案在技术上是正确的,但需要额外的一行才能使其与 Apple 的库一起使用。在 RGB2HSV 末尾添加以下行:“*h /= 360.0;” -- 因为 Apple 在 0.0..1.0 中指定 H,而不是 Photoshop 的方式,即 0..360
  • 如果您的 H 值在 [0.0 ... 1.0] 中,您应该分别以这种方式计算扇区:if (h == 1.0) h = 0.0; else h *= 6.0(而不是除以 60)在 hsv2rgb() 中
【解决方案2】:

Apple 的 GLPaint 示例代码中有一个名为 HSL2RGB() 的函数,它可以满足您的需求。函数上方的注释将您指向 Wikipedia 以获取代码解释,这可能有助于您了解发生了什么。

【讨论】:

    【解决方案3】:

    在 Dustin 算法的底部,他提到 iOS 5 及更高版本中的所有 UIColor 对象现在都有

    getHue:saturation:brightness:alpha:
    

    这使得从颜色中获取值变得非常容易。这绝对是现在最简单的解决方案,而且大多数人都在使用 iOS 5。

    【讨论】:

    • 但是对于那些没有使用iOS 5的人(是的,他们仍然存在),使用这种方法会导致非常及时的崩溃。
    • 绝对 - 我的评论是针对那些以现代 iOS 构建为目标的人。如果您可以放弃 iOS 4 用户,那么在维护方面的麻烦绝对是值得的,因为 iOS 5 中发生了很多变化(变得更好)。
    猜你喜欢
    • 2013-03-03
    • 2018-04-01
    • 2014-07-05
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 2021-01-14
    相关资源
    最近更新 更多