在iPhone上从RGB更改为HSB?

时间:2011-04-08 02:35:03

标签: iphone objective-c colors uicolor

我已经google了很长时间,无法找到办法做到这一点。有人有个主意吗?有一种NSColor方式可以用于mac,但我无法看到iPhone。我的应用程序中的想法是用户键入HEX代码(我已设法进入RGB)并将其更改为HSB。

想法?

2 个答案:

答案 0 :(得分:5)

只需要一点点数学。以下代码只是我为转换创建的自定义类的重要部分。 “HSBColor”类只存储色调,饱和度和亮度,如果我需要在系统中实际使用它,我会提供获取它的组件或UIColor的函数。

注意:除非您使用色调,亮度和饱和度属性定义HSBColor类,否则此代码将无法正常工作。

+(void)max:(int*)max andMin:(int*)min ofArray:(float[])array
{
    *min=0;
    *max=0;
    for(int i=1; i<3; i++)
    {
        if(array[i] > array[*max])
            *max=i;
        if(array[i] < array[*min])
            *min=i;
    }
}

+(HSBColor*)colorWithRed:(float)red Green:(float)green Blue:(float)blue
{
    HSBColor* toReturn = [[[HSBColor alloc] init] autorelease];

    float colorArray[3];
    colorArray[0] = red; 
    colorArray[1] = green; 
    colorArray[2] = blue;
    //NSLog(@"RGB: %f %f %f",colorArray[0],colorArray[1],colorArray[2]);
    int max;
    int min;
    [self max:&max andMin:&min ofArray:colorArray];

    if(max==min)
    {
        toReturn.hue=0;
        toReturn.saturation=0;
        toReturn.brightness=colorArray[0];
    }
    else
    {
        toReturn.brightness=colorArray[max];

        toReturn.saturation=(colorArray[max]-colorArray[min])/(colorArray[max]);

        if(max==0) // Red
            toReturn.hue = (colorArray[1]-colorArray[2])/(colorArray[max]-colorArray[min])*60/360;
        else if(max==1) // Green
            toReturn.hue = (2.0 + (colorArray[2]-colorArray[0])/(colorArray[max]-colorArray[min]))*60/360;
        else // Blue
            toReturn.hue = (4.0 + (colorArray[0]-colorArray[1])/(colorArray[max]-colorArray[min]))*60/360;
    }
    return toReturn;
}

+(HSBColor*)colorWithSystemColor:(UIColor*)color
{

    const CGFloat* components = CGColorGetComponents(color.CGColor);

    return [self colorWithRed:components[0] Green:components[1] Blue:components[2]];
}

答案 1 :(得分:2)

如果您需要它:

将HSV转换为RGB (来自GLPaint示例应用程序AppController.m)

//FUNCTIONS:
/*
   HSL2RGB Converts hue, saturation, luminance values to the equivalent red, green and blue values.
   For details on this conversion, see Fundamentals of Interactive Computer Graphics by Foley and van Dam (1982, Addison and Wesley)
   You can also find HSL to RGB conversion algorithms by searching the Internet.
   See also http://en.wikipedia.org/wiki/HSV_color_space for a theoretical explanation
 */
static void HSL2RGB(float h, float s, float l, float* outR, float* outG, float* outB)
{
    float           temp1,
                    temp2;
    float           temp[3];
    int             i;

    // Check for saturation. If there isn't any just return the luminance value for each, which results in gray.
    if(s == 0.0) {
        if(outR)
            *outR = l;
        if(outG)
            *outG = l;
        if(outB)
            *outB = l;
        return;
    }

    // Test for luminance and compute temporary values based on luminance and saturation 
    if(l < 0.5)
        temp2 = l * (1.0 + s);
    else
        temp2 = l + s - l * s;
        temp1 = 2.0 * l - temp2;

    // Compute intermediate values based on hue
    temp[0] = h + 1.0 / 3.0;
    temp[1] = h;
    temp[2] = h - 1.0 / 3.0;

    for(i = 0; i < 3; ++i) {

        // Adjust the range
        if(temp[i] < 0.0)
            temp[i] += 1.0;
        if(temp[i] > 1.0)
            temp[i] -= 1.0;


        if(6.0 * temp[i] < 1.0)
            temp[i] = temp1 + (temp2 - temp1) * 6.0 * temp[i];
        else {
            if(2.0 * temp[i] < 1.0)
                temp[i] = temp2;
            else {
                if(3.0 * temp[i] < 2.0)
                    temp[i] = temp1 + (temp2 - temp1) * ((2.0 / 3.0) - temp[i]) * 6.0;
                else
                    temp[i] = temp1;
            }
        }
    }

    // Assign temporary values to R, G, B
    if(outR)
        *outR = temp[0];
    if(outG)
        *outG = temp[1];
    if(outB)
        *outB = temp[2];
}