11

我正在尝试提取 a 的 rgb 组件,UIColor以便手动构建 a 中的像素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。同样对于blueColorgreenColor

但是[UIColor blackColor],和的结果[UIColor whiteColor]似乎完全异常,而且我不知道我做错了什么(如果确实如此)。

也就是说,[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) 用大锤子敲打我的头,这样它就不会那么痛了。

霍华德

4

2 回答 2

10

您假设颜色空间始终为 RGBA,但事实并非如此。

试试这个代码:

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

并且模型将屈服kCGColorSpaceModelMonochrome

于 2009-05-20T12:30:04.907 回答
2

我认为您缺少的是可以在不同的颜色空间中定义颜色:您假设它们都是 RGBA。

例如,文档声明blackColor“返回灰度值为 0.0 且 alpha 值为 1.0 的颜色对象”。所以我认为只有两个分量对黑色有效,而不是四个。

于 2009-05-20T12:23:11.097 回答