103

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

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

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

4

16 回答 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];
于 2011-10-21T16:15:09.737 回答
85
const CGFloat *colors = CGColorGetComponents( curView.backgroundColor.CGColor );

这些链接提供了更多详细信息:

于 2009-01-12T22:08:21.887 回答
43

斯威夫特 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 }
}

斯威夫特 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] }
}

这不是最有效的方法,所以我不会使用它来不断重新绘制视图。

于 2016-01-20T01:45:42.180 回答
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);
于 2014-07-11T11:02:50.130 回答
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 好东西的一部分。

于 2014-01-23T00:12:10.777 回答
7

您可以使用 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 颜色空间

于 2019-11-18T16:34:10.147 回答
5
const float* colors = CGColorGetComponents( curView.backgroundColor.CGColor );

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

于 2009-01-12T22:35:32.800 回答
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];
于 2013-06-15T02:40:06.263 回答
1

UIColor从 iOS 2.0 开始,调用了一个私有实例方法,styleString它返回颜色的 RGB 或 RGBA 字符串表示形式,即使对于 RGB 空间之外的 whiteColor 等颜色也是如此。

目标-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使用私有方法和协议创建一个unsafeBitCast UIColor协议:

@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)
于 2016-05-02T13:26:13.513 回答
1

Swift 3 版本的 David Rees 回答:

extension UIColor {

    var redValue: CGFloat{
        return cgColor.components! [0]
    }

    var greenValue: CGFloat{
        return cgColor.components! [1]
    }

    var blueValue: CGFloat{
        return cgColor.components! [2]
    }

    var alphaValue: CGFloat{
        return cgColor.components! [3]
    }
}
于 2016-11-08T14:32:45.127 回答
1

投票最多的答案已过时:

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

相反,使用

myUIColor.cgColor.components

于 2018-12-07T01:45:48.840 回答
0

我想获得UITableViewStyle“UITableViewStyleGrouped”的背景颜色,所以在viewDidAppear:方法中我添加了代码:

NSLog(@"%@", self.tableView.backgroundView.backgroundColor);

它完成了我的预期并返回了日志:

UIDeviceRGBColorSpace 0.937255 0.937255 0.956863 1

所以简而言之,只需输入NSLog(@"%@", [UIColor whateverColor]);

于 2015-08-05T02:24:34.167 回答
0

我为此和其他颜色控件制作的一些有用的宏:

在您的情况下,您只需使用

getRGBA(myColor, red, green, blue, alpha);

NSLog(@"Red Value: %f", red);
NSLog(@"Blue Value: %f", green);
NSLog(@"Green Value: %f", blue);

宏:

#define rgba(r,g,b,a) [UIColor colorWithRed:((float)(r))/255.0f green:((float)(g))/255.0f blue:((float)(b))/255.0f alpha:a]
#define rgb(r,g,b) rgba(r, g, b, 1.0f)

#define rgbaf(r,g,b,a) [UIColor colorWithRed:(r) green:(g) blue:(b) alpha:a]
#define rgbf(r,g,b) rgbaf(r, g, b, 1.0f)

#define rgba_fromColor(__color, __r, __g, __b, __a) \
CGFloat __r, __g, __b, __a;\
UIColor *__unpackedColor = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:__color]];/*Bring system colors into compatible color-space (e.g. DarkGrayColor)*/\
[__unpackedColor getRed:&__r green:&__g blue:&__b alpha:&__a];
#define getRGBA(__color, __r, __g, __b, __a) hsba_fromColor(__color, __r, __g, __b, __a)

#define getRed(__color)  (\
(^float (void){\
rgba_fromColor(__color, r, g, b, a);\
return r;\
})()\
)

#define getGreen(__color)  (\
(^float (void){\
rgba_fromColor(__color, r, g, b, a);\
return g;\
})()\
)

#define getBlue(__color)  (\
(^float (void){\
rgba_fromColor(__color, r, g, b, a);\
return b;\
})()\
)

#define getAlpha(__color)  (\
(^float (void){\
rgba_fromColor(__color, r, g, b, a);\
return a;\
})()\
)










#define hsba(h,s,b,a) [UIColor colorWithHue:((float)(h))/360.0f saturation:((float)(s))/100.0f brightness:((float)(b))/100.0f alpha:a]
#define hsb(h,s,b) hsba(h, s, b, 1.0f)

#define hsbaf(h,s,b,a) [UIColor colorWithHue:(h) saturation:(s) brightness:(b) alpha:a]
#define hsbf(h,s,b) rgbaf(h, s, b, 1.0f)

#define hsba_fromColor(__color, __h, __s, __b, __a) \
CGFloat __h, __s, __b, __a;\
UIColor *__unpackedColor = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:__color]];/*Bring system colors into compatible color-space (e.g. DarkGrayColor)*/\
[__unpackedColor getHue:&__h saturation:&__s brightness:&__b alpha:&__a];
#define getHSBA(__color, __h, __s, __b, __a) rgba_fromColor(__color, __h, __s, __b, __a)

#define getHue(__color)  (\
(^float (void){\
hsba_fromColor(__color, h, s, b, a);\
return h;\
})()\
)

#define getSaturation(__color)  (\
(^float (void){\
hsba_fromColor(__color, h, s, b, a);\
return s;\
})()\
)

#define getBrightness(__color)  (\
(^float (void){\
hsba_fromColor(__color, h, s, b, a);\
return b;\
})()\
)

/*
///already defined in RGBA macros
#define getAlpha(__color)  (\
(^float (void){\
hsba_fromColor(__color, h, s, b, a);\
return a;\
})()\
)
*/
于 2018-07-27T06:44:01.090 回答
0

CGColor 的属性组件就是你所需要的。

下面的代码

UIColor.separator.cgColor.components

打印以下内容

Optional([0.23529411764705882, 0.23529411764705882, 0.2627450980392157, 0.29])

数组的第一个元素红色值第二个绿色值第三个蓝色值最后一个alpha 值。很简单!

于 2021-07-15T13:47:31.237 回答
-1

使用HandyUIKit让这变得非常简单

import HandyUIKit    

let color = UIColor(red: 0.1, green: 0.2, blue: 0.3, alpha: 0.4)

// get any of the rgba values
color.rgba.red    // => 0.1
color.rgba.green  // => 0.2
color.rgba.blue   // => 0.3
color.rgba.alpha  // => 0.4

还有一个类似的选项来获取hsba

let color = UIColor(hue: 0.1, saturation: 0.2, brightness: 0.3, alpha: 0.4)

// you can get any of the hsba values, too
color.hsba.hue         // => 0.1
color.hsba.saturation  // => 0.2
color.hsba.brightness  // => 0.3
color.hsba.alpha       // => 0.4

只需使用 Carthage 安装它就可以了。

我希望它有帮助!

于 2016-06-30T18:50:11.403 回答
-6

像这样设置你的 UIColor

UIColor.FromRGB(128, 179, 255)

这是针对 Xamarin ios 的...但肯定有这样的方法在 swift 中。

于 2017-08-03T11:52:59.793 回答