有没有function将UIColor转换成色相饱和度亮度?

我可以用RGB值设置为uicolor:

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

我可以用hsb值设置uicolor:

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

我也可以将其转换回RGB:

 CGFloat* colors = CGColorGetComponents(Color1.CGColor); 

但是我怎样才能从色彩中获得HSB?

使用UIColor方法: getHue:saturation:brightness:alpha:

从苹果文档:
“返回构成HSB颜色空间中颜色的组件。”

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

例:

 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输出:

成功:1色调:0.10,饱和度:0.79,亮度:0.53,alpha:1.00

以下是@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输出:

色调:0.10,饱和度:0.79,值:0.53

这里是使用Swift特性(扩展,计算属性和元组)在几行代码中完成同样的事情的一个很好的方法。

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

斯威夫特3.2 / 4小更新

Swift 3.2 / 4强制执行一个由前面的代码触发的警告,因为你在同一个调用中多次修改hsbavariablesgetHue

同时访问参数'hsba',但修改需要独占访问; 考虑复制到一个局部variables。

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

注意这是一个草稿,但是如果你的版本低于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) ? gb : ((b==minRGB) ? rg : br); double h = (r==minRGB) ? 3 : ((b==minRGB) ? 1 : 5); computedH = (60*(h - d/(maxRGB - minRGB))) / 360.; computedS = ((maxRGB - minRGB)/maxRGB); computedV = maxRGB; } ... 
Interesting Posts