我正在尝试提取UIColor
的rgb组件,以便在CGBitmapContext
中手工构建像素。以下示例代码适用于大多数UIColor
常量,但令人困惑,并非全部。即:
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 g = 1.000000 b = 0.000000 a = 1.000000,
如预期的那样。
[UIColor redColor]
给出
r = 1.000000 g = 0.000000 b = 0.000000 a = 1.000000,
如预期的那样。同样适用于blueColor
和greenColor
。
然而,[UIColor blackColor]
和[UIColor whiteColor]
的结果似乎完全异常,我不知道我做错了什么(如果我确实是这样)。< / p>
即便如此,[UIColor blackColor]
给出了
r = 0.000000 g = 1.000000 b = 0.000000 a = 0.000000,
这是一种透明的绿色,
和[UIColor whiteColor]
给出
r = 1.000000 g = 1.000000 b = 0.000000 a = 0.000000,
这是一种透明的黄色。
如果有人可以,我会很感激:
(1)解释我做错了什么 (2)复制我的异常结果并告诉我这不是我,或者是 (3)用一把大锤击中头部,这样就不会再受伤了。
霍华德
答案 0 :(得分:10)
您假设颜色空间始终为RGBA,但实际情况并非如此。
试试这段代码:
CGColorRef color = [[UIColor blackColor] CGColor];
const CGFloat* rgba = CGColorGetComponents(color);
CGColorSpaceRef space = CGColorGetColorSpace(color);
CGColorSpaceModel model = CGColorSpaceGetModel(space);
NSLog(@"%d", model);
模型将产生kCGColorSpaceModelMonochrome
。
答案 1 :(得分:2)
我认为你缺少的是颜色可以在不同的颜色空间中定义:你假设它们都是RGBA。
例如,the docs表示blackColor
“返回一个颜色对象,其灰度值为0.0且其alpha值为1.0”。所以我认为只有两个组件对黑色有效,而不是四个。