Is there function to convert UIColor to Hue Saturation Brightness? Is there function to convert UIColor to Hue Saturation Brightness? ios ios

Is there function to convert UIColor to Hue Saturation Brightness?


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 valuesCGFloat 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


Here is a nice way of using Swift features (extensions, computed properties and tuples) to do the same thing in just a few lines of code.

extension UIColor {  var hsba: (h: CGFloat, s: CGFloat, b: CGFloat, a: CGFloat) {    var hsba: (h: CGFloat, s: CGFloat, b: CGFloat, a: CGFloat) = (0, 0, 0, 0)    self.getHue(&(hsba.h), saturation: &(hsba.s), brightness: &(hsba.b), alpha: &(hsba.a))    return hsba  }}

Swift 3.2 / 4 minor update

Swift 3.2 / 4 enforced a new warning triggered with the previous code because you were modifying the hsba variable several times within the same call to getHue

Simultaneous accesses to parameter 'hsba', but modification requires exclusive access; consider copying to a local variable.

extension UIColor {    var hsba: (h: CGFloat, s: CGFloat, b: CGFloat, a: CGFloat) {        var h: CGFloat = 0, s: CGFloat = 0, b: CGFloat = 0, a: CGFloat = 0        self.getHue(&h, saturation: &s, brightness: &b, alpha: &a)        return (h: h, s: s, b: b, a: a)    }}


Beware that it is a draft, but you can try this code, if you're lower to version 5.0

...CGFloat computedH = 0;CGFloat computedS = 0;CGFloat computedV = 0;CGFloat minRGB = MIN(r, MIN(g,b));CGFloat maxRGB = MAX(r, MAX(g,b));if (minRGB==maxRGB) {   computedH = 0;   computedS = 0;   computedV = minRGB;} else {   double d = (r==minRGB) ? g-b : ((b==minRGB) ? r-g : b-r);   double h = (r==minRGB) ? 3 : ((b==minRGB) ? 1 : 5);   computedH = (60*(h - d/(maxRGB - minRGB))) / 360.;   computedS = ((maxRGB - minRGB)/maxRGB);   computedV = maxRGB;}...