获取某些UIColor颜色组件的异常结果

11

我试图提取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, 与预期一样,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) 用大锤敲打我的脑袋,让我不再感到疼痛。
谢谢!
霍华德
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


太棒了!谢谢。之前我一直被频繁引用 CGColorGetNumberOfComponents(color) 调用 CGColorGetComponents(color) 弄得很困惑。现在我明白了为什么要这样做。顺便问一下,有没有办法打印出上面模型的 名称,而不仅仅是它的值? - hkatz
调试器将向您显示名称,但我不确定您是否可以打印它,因为它是数字的常量定义。 - pgb

2
我认为你忽略了一件事,那就是颜色可以在不同的颜色空间中定义:你假设它们都是RGBA。
例如,文档 指出 blackColor “返回一个灰度值为0.0且 alpha 值为1.0的颜色对象”。因此,我认为黑色只有两个有效分量,而不是四个。

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