如何从UIColor获取RGB值?

def*_*ech 94 rgb uicolor ios

我正在使用以下代码创建一个颜色对象.

curView.backgroundColor = [[UIColor alloc] initWithHue:229 saturation:40 brightness:75 alpha:1];
Run Code Online (Sandbox Code Playgroud)

如何从创建的颜色对象中检索RGB值?

Tee*_*tum 118

在iOS 5中,您可以使用:

CGFloat red = 0.0, green = 0.0, blue = 0.0, alpha =0.0;
[multipliedColor getRed:&red green:&green blue:&blue alpha:&alpha];
Run Code Online (Sandbox Code Playgroud)

  • 请注意,只有当起始颜色位于"兼容色彩空间"时,此方法才会成功,该色彩空间可能因设备/操作系统而异.例如,我刚刚发现,在运行iOS 7的iPad 2上,在[UIColor darkGrayColor]上调用它会失败.但是在运行iOS 8的iPad Air上,相同的颜色可以正常工作. (2认同)

cod*_*gic 82

const CGFloat *colors = CGColorGetComponents( curView.backgroundColor.CGColor );
Run Code Online (Sandbox Code Playgroud)

这些链接提供了更多细节:

  • 注意:这仅适用于RGB空间中的颜色.例如,这不适用于[UIColor whiteColor],因为它不是RGB. (15认同)
  • 如果有人发现如何从`colors`获取值的问题,你可以写一些像`CGFloat red = colors [0]; (4认同)
  • 我在这个问题中发布了一些示例代码,以使其在非RGB上下文中工作:http://stackoverflow.com/questions/4700168/get-rgb-value-from-uicolor-presets (2认同)

Dav*_*ees 39

SWIFT 3和4

我发现cgColor.components并不总是返回4个颜色值,所以我改变了这个,所以它从CIColor包装器中获取它们

extension UIColor {
    var redValue: CGFloat{ return CIColor(color: self).red }
    var greenValue: CGFloat{ return CIColor(color: self).green }
    var blueValue: CGFloat{ return CIColor(color: self).blue }
    var alphaValue: CGFloat{ return CIColor(color: self).alpha }
}
Run Code Online (Sandbox Code Playgroud)

SWIFT 2

extension UIColor {
    var red: CGFloat{ return CGColorGetComponents(self.CGColor)[0] }
    var green: CGFloat{ return CGColorGetComponents(self.CGColor)[1] }
    var blue: CGFloat{ return CGColorGetComponents(self.CGColor)[2] }
    var alpha: CGFloat{ return CGColorGetComponents(self.CGColor)[3] }
}
Run Code Online (Sandbox Code Playgroud)

这不是最有效的方式,所以我不会在不断重新绘制视图的情况下使用它.


小智 11

希望这会有所帮助

CGFloat red, green, blue, alpha;

//Create a sample color

UIColor *redColor = [UIColor redColor];

//Call 

[redColor getRed: &red 
  green: &green
  blue: &blue 
  alpha: &alpha];
NSLog(@"red = %f. Green = %f. Blue = %f. Alpha = %f",
  red,
  green,
  blue,
  alpha);
Run Code Online (Sandbox Code Playgroud)


Ger*_*eri 7

刚刚为此做了一个类别.

NSLog(@"%f", [UIColor blueColor].blue); // 1.000000
Run Code Online (Sandbox Code Playgroud)

是这样的:

typedef enum { R, G, B, A } UIColorComponentIndices;

@implementation UIColor (EPPZKit)

-(CGFloat)red
{ return CGColorGetComponents(self.CGColor)[R]; }

-(CGFloat)green
{ return CGColorGetComponents(self.CGColor)[G]; }

-(CGFloat)blue
{ return CGColorGetComponents(self.CGColor)[B]; }

-(CGFloat)alpha
{ return CGColorGetComponents(self.CGColor)[A]; }

@end
Run Code Online (Sandbox Code Playgroud)

部分eppz!kit与更多UIColor好吃的东西.


小智 6

您可以使用 CIColor 组件(swift 5)

let ciColor = CIColor(color: backgroundColor)
let alpha = ciColor.alpha
let red = ciColor.red
let blue = ciColor.blue
let green = ciColor.green
Run Code Online (Sandbox Code Playgroud)

这也适用于非 RGB 色彩空间


def*_*ech 5

const float* colors = CGColorGetComponents( curView.backgroundColor.CGColor );
Run Code Online (Sandbox Code Playgroud)

谢谢.我不得不const在行的开头添加它,因为它正在生成警告.


Lin*_*yen 5

 UIColor *color = [[UIColor greenColor] retain]; //line 1

//OR(You will have color variable either like line 1 or line 2)

color = curView.backgroundColor;//line 2
CGColorRef colorRef = [color CGColor];

int _countComponents = CGColorGetNumberOfComponents(colorRef);

if (_countComponents == 4) {
    const CGFloat *_components = CGColorGetComponents(colorRef);
    CGFloat red     = _components[0];
    CGFloat green = _components[1];
    CGFloat blue   = _components[2];
    CGFloat alpha = _components[3];

    NSLog(@"%f,%f,%f,%f",red,green,blue,alpha);
}

[color release];
Run Code Online (Sandbox Code Playgroud)