Аномальные результаты получения цветовых компонентов некоторых UIColors

Я пытаюсь извлечь компоненты 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 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] кажутся совершенно аномальными, и я не знаю, что я делаю неправильно (если это действительно так).

А именно, [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) ударить меня по голове большим молотком, чтобы не было так больно.

Говард


person hkatz    schedule 20.05.2009    source источник


Ответы (2)


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

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

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

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

person pgb    schedule 20.05.2009
comment
Великолепно! Спасибо. Раньше меня смущала частая ссылка на CGColorGetNumberOfComponents(color) перед вызовом CGColorGetComponents(color). Теперь я понимаю, почему. Кстати, нельзя ли распечатать название приведенной выше модели, а не только ее значение? - person hkatz; 20.05.2009
comment
Отладчик покажет вам имя, я не уверен, что вы сможете его напечатать, так как это константное определение числа. - person pgb; 20.05.2009

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

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

person unwind    schedule 20.05.2009