2009-05-20 50 views
12

我试图提取UIColor的rgb组件,以手动构建CGBitmapContext中的像素。以下示例代码适用于大多数UIColor常量,但不是全部都可以。即:上述获取某些UIColors的颜色组件的异常结果

CGColorRef color = [[UIColor yellowColor] CGColor]; 
const float* rgba = CGColorGetComponents(color); 

float r = rgba[0]; 
float g = rgba[1]; 
float b = rgba[2]; 
float a = rgba[3]; 

NSLog(@"r=%f g=%f b=%f a=%f", r, g, b, a); 

[UIColor yellowColor]的结果是
R =1.000000克= 1.000000 B = 0.000000 A = 1.000000, 如预期。

[UIColor redColor]给出 r = 1.000000 g = 0.000000 b = 0.000000 a = 1.000000, 也如预期的那样。同样对于blueColorgreenColor

然而,为[UIColor blackColor][UIColor whiteColor]结果似乎完全正常的,我不知道我做错了什么(如果确实是我)。

要机智,[UIColor blackColor]给出 R =0.000000克= 1.000000 B = 0.000000 A = 0.000000, 其是tranparent绿色,

[UIColor whiteColor]给出 R =1.000000克= 1.000000 B = 0.000000 A = 0.000000 , 这是一个透明的黄色。

我会很感激,如果有人既可以:

(1)解释我在做什么错
(2)复制我的反常结果,并告诉我,这不是我,或者
(3)用一把大锤撞击我的头部,所以它不会那么伤害。

霍华德

回答

11

假设色彩空间始终是RGBA,但情况并非如此。

试试这个代码:

CGColorRef color = [[UIColor blackColor] CGColor]; 
const CGFloat* rgba = CGColorGetComponents(color); 
CGColorSpaceRef space = CGColorGetColorSpace(color); 
CGColorSpaceModel model = CGColorSpaceGetModel(space); 
NSLog(@"%d", model); 

和型号将产生kCGColorSpaceModelMonochrome

+0

太棒了!谢谢。在调用`CGColorGetComponents(color)`之前,我经常被CGColorGetNumberOfComponents(color)`引用困惑。现在我明白了为什么。顺便说一下,是不是有办法打印上面模型的*名称,而不仅仅是它的价值? – hkatz 2009-05-20 12:51:29

2

我想你失踪的事情是,颜色可以在不同的色彩空间定义:你假设他们都是RGBA。

例如,the docs指出blackColor“返回其灰度值为0.0且其alpha值为1.0的颜色对象”。所以我认为只有两个组件对黑色有效,而不是四个。