Is there function to convert UIColor to Hue Saturation Brightness?

孤人 提交于 2019-12-17 15:44:11

问题


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?


回答1:


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




回答2:


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)
    }
 }



回答3:


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;
}
...



回答4:


Just use the following segment of code and you are done for good with rgba, hsba conversion.

extension UIColor {

/**
 Decomposes UIColor to its RGBA components
 */
var rgbColor: RGBColor {
    get {
        var red: CGFloat = 0, green: CGFloat = 0, blue: CGFloat = 0, alpha: CGFloat = 0
        self.getRed(&red, green: &green, blue: &blue, alpha: &alpha)
        return RGBColor(red: red, green: green, blue: blue, alpha: alpha)
    }
}

/**
 Decomposes UIColor to its HSBA components
 */
var hsbColor: HSBColor {
    var h: CGFloat = 0, s: CGFloat = 0, b: CGFloat = 0, a: CGFloat = 0
    self.getHue(&h, saturation: &s, brightness: &b, alpha: &a)
    return HSBColor(hue: h, saturation: s, brightness: b, alpha: a)
}

/**
 Holds the CGFloat values of HSBA components of a color
 */
public struct HSBColor {
    var hue: CGFloat
    var saturation: CGFloat
    var brightness: CGFloat
    var alpha: CGFloat

    var uiColor: UIColor {
        get {
            return UIColor(hue: hue, saturation: saturation, brightness: brightness, alpha: alpha)
        }
    }
}

/**
 Holds the CGFloat values of RGBA components of a color
 */
public struct RGBColor {
    var red: CGFloat
    var green: CGFloat
    var blue: CGFloat
    var alpha: CGFloat

    var uiColor: UIColor {
        get {
            return UIColor(red: red, green: green, blue: blue, alpha: alpha)
        }
    }
}
}


来源:https://stackoverflow.com/questions/10071756/is-there-function-to-convert-uicolor-to-hue-saturation-brightness

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!