如何从UIColor获取RGB值?

106

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

curView.backgroundColor = [[UIColor alloc] initWithHue:229 saturation:40 brightness:75 alpha:1];

我该如何从创建的颜色对象中获取RGB值?


可能是从UIColor中提取RGB的重复问题。 - Roddy
5
请注意,传递到方法 -initWithHue:saturation:brightness:alpha: 中的参数应该在 0.0 到 1.0 之间。 - geekinit
https://dev59.com/R2445IYBdhLWcg3wydFk#24203324 - Waseem Shah
16个回答

121

在iOS 5中,您可以使用:

CGFloat red = 0.0, green = 0.0, blue = 0.0, alpha =0.0;
[multipliedColor getRed:&red green:&green blue:&blue alpha:&alpha];

此功能仅支持 iOS 5.0 或更高版本。 - Jon Trauntvein
3
请注意,只有在“兼容的颜色空间”中才能成功使用此方法,而这取决于设备/操作系统。例如,我刚刚发现在运行iOS 7的iPad 2上调用[UIColor darkGrayColor]将失败。但是,在运行iOS 8的iPad Air上,相同的颜色可以正常工作。 - devios1
@devios1 这个问题可以通过先序列化颜色,然后使用 NSKeyedArchiver 进行反序列化来解决,就像这样:multipliedColor = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject: multipliedColor]]; - Albert Renshaw

88

回答应该是评论。哎呀。 - defmech
18
注意:这仅适用于 RGB 颜色空间中的颜色。例如,这不能用于 [UIColor whiteColor],因为它不在 RGB 中。 - Jason
2
我在这个问题中发布了一些示例代码,以便在非RGB上下文中使其工作:https://dev59.com/R2445IYBdhLWcg3wydFk - Jesse Rusak
4
如果有人想知道如何从“colors”中获取值,你可以这样写:“CGFloat red = colors[0];”。 - Hemang
error: <EXPR>:3:1: error: 'CGColorGetComponents' has been replaced by property 'CGColor.components' - pkamb

45

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

SWIFT 2

的翻译是:

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

这不是最有效的方法,因此我不会在需要频繁重绘视图的地方使用它。


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

8
您可以使用 CIColor 组件 (Swift 5)。
let ciColor = CIColor(color: backgroundColor)
let alpha = ciColor.alpha
let red = ciColor.red
let blue = ciColor.blue
let green = ciColor.green

这也适用于非RGB色彩空间。

7
我为此创建了一个类别。
NSLog(@"%f", [UIColor blueColor].blue); // 1.000000

类似于以下内容:
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

这是 eppz!kit 的一部分,提供了更多 UIColor 的好东西


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];

5
const float* colors = CGColorGetComponents( curView.backgroundColor.CGColor );

谢谢。我必须在行的开头添加const,因为它会产生警告。


它没有因为试图将CGFloat隐式转换为float而生成警告吗? :) - braden

2
自iOS 2.0以来,UIColor有一个名为styleString的私有实例方法,该方法返回颜色的RGB或RGBA字符串表示,即使是类似于白色这样的超出RGB空间的颜色。
Objective-C:
@interface UIColor (Private)

- (NSString *)styleString;

@end

// ...

[[UIColor whiteColor] styleString]; // rgb(255,255,255)
[[UIColor redColor] styleString]; // rgb(255,0,0)
[[UIColor lightTextColor] styleString]; // rgba(255,255,255,0.600000)

在Swift中,您可以使用桥接头文件来公开接口。对于纯Swift,您需要创建一个带有私有方法的@objc协议,并使用协议unsafeBitCastUIColor
@objc protocol  UIColorPrivate {
    func styleString() -> String
}

let white = UIColor.whiteColor()
let red = UIColor.redColor()
let lightTextColor = UIColor.lightTextColor()

let whitePrivate = unsafeBitCast(white, UIColorPrivate.self)
let redPrivate = unsafeBitCast(red, UIColorPrivate.self)
let lightTextColorPrivate = unsafeBitCast(lightTextColor, UIColorPrivate.self)

whitePrivate.styleString() // rgb(255,255,255)
redPrivate.styleString() // rgb(255,0,0)
lightTextColorPrivate.styleString() // rgba(255,255,255,0.600000)

1

最高投票的答案已经过时:

错误::3:1:错误:'CGColorGetComponents'已被属性'CGColor.components'替换

相反,使用

myUIColor.cgColor.components


1
让颜色 = myUIColor.cgColor.components 让 r = 颜色![0] 让 g = 颜色![1] 让 b = 颜色![2] - Gurjinder Singh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接