在iPhone上从RGB更改为HSB?

And*_*rew 2 iphone colors objective-c uicolor

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

想法?

dre*_*wag 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]];
}
Run Code Online (Sandbox Code Playgroud)