iosuicolorhsb

Is there function to convert UIColor to Hue Saturation Brightness?


i can set uicolor with RGB values:

[UIColor colorWithRed:0.53 green:0.37 blue:0.11 alpha:1.00];

i can set uicolor with hsb values:

[UIColor colorWithHue:0.10 saturation:0.16 brightness:0.13 alpha:1.00];

i also could convert it back to RGB:

CGFloat* colors = CGColorGetComponents(Color1.CGColor);

But how i can get HSB from uicolor?


Solution

  • Use the UIColor method: getHue:saturation:brightness:alpha:

    From the Apple docs:
    "Returns the components that make up the color in the HSB color space."

    - (BOOL)getHue:(CGFloat *)hue saturation:(CGFloat *)saturation brightness:(CGFloat *)brightness alpha:(CGFloat *)alpha
    

    Example:

    UIColor *testColor = [UIColor colorWithRed:0.53 green:0.37 blue:0.11 alpha:1.00];
    
    CGFloat hue;
    CGFloat saturation;
    CGFloat brightness;
    CGFloat alpha;
    BOOL success = [testColor getHue:&hue saturation:&saturation brightness:&brightness alpha:&alpha];
    NSLog(@"success: %i hue: %0.2f, saturation: %0.2f, brightness: %0.2f, alpha: %0.2f", success, hue, saturation, brightness, alpha);
    

    NSLog output:

    success: 1 hue: 0.10, saturation: 0.79, brightness: 0.53, alpha: 1.00

    Here is a corrected version of the method provided by @WhiteTiger:

    // Test values
    CGFloat red = 0.53;
    CGFloat green = 0.37;
    CGFloat blue = 0.11;
    
    CGFloat hue = 0;
    CGFloat saturation = 0;
    CGFloat brightness = 0;
    
    CGFloat minRGB = MIN(red, MIN(green,blue));
    CGFloat maxRGB = MAX(red, MAX(green,blue));
    
    if (minRGB==maxRGB) {
        hue = 0;
        saturation = 0;
        brightness = minRGB;
    } else {
        CGFloat d = (red==minRGB) ? green-blue : ((blue==minRGB) ? red-green : blue-red);
        CGFloat h = (red==minRGB) ? 3 : ((blue==minRGB) ? 1 : 5);
        hue = (h - d/(maxRGB - minRGB)) / 6.0;
        saturation = (maxRGB - minRGB)/maxRGB;
        brightness = maxRGB;
    }
    NSLog(@"hue: %0.2f, saturation: %0.2f, value: %0.2f", hue, saturation, brightness);
    

    NSLog output:

    hue: 0.10, saturation: 0.79, value: 0.53