Подтвердить что ты не робот

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

Ховард

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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