Аномальные результаты получения цветовых компонентов некоторых UIColors - PullRequest
11 голосов
/ 20 мая 2009

Я пытаюсь извлечь компоненты rgb из UIColor, чтобы вручную построить пиксели в 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 г = 1,000000 b = 0,000000 а = 1,000000, как и ожидалось.

[UIColor redColor] т r = 1,000000 г = 0,000000 b = 0,000000 а = 1,000000, снова, как и ожидалось. Аналогично для blueColor и greenColor.

Однако , результаты для [UIColor blackColor] и [UIColor whiteColor] кажутся совершенно аномальными, и я не знаю, что я делаю неправильно (если это действительно так).

Для остроумия [UIColor blackColor] дает r = 0,000000 г = 1,000000 b = 0,000000 а = 0,000000, который является прозрачным зеленым,

и [UIColor whiteColor] т r = 1,000000 г = 1,000000 b = 0,000000 а = 0,000000, который является прозрачным желтым.

Буду признателен, если кто-нибудь сможет:

(1) объясните, что я делаю не так
(2) повторить мои аномальные результаты и скажите мне, что это не я или
(3) ударил меня по голове большим молотком, чтобы он так сильно не болел.

Говард

Ответы [ 2 ]

10 голосов
/ 20 мая 2009

Вы предполагаете, что цветовое пространство всегда RGBA, что не так.

Попробуйте этот код:

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

А модель даст kCGColorSpaceModelMonochrome.

2 голосов
/ 20 мая 2009

Я думаю, что вам не хватает того, что цвета могут быть определены в разных цветовых пространствах: вы предполагаете, что все они RGBA.

Например, документы утверждают, что blackColor "Возвращает цветовой объект, значение серой шкалы которого равно 0,0, а значение альфа-канала равно 1,0". Поэтому я думаю, что только два компонента действительны для черного, а не четыре.

...