Pregunta

Estoy tratando de extraer los componentes RGB de un UIColor con el fin de construir a mano los píxeles en una CGBitmapContext. El siguiente código de ejemplo funciona bien para la mayoría de las constantes UIColor pero, confusamente, no todos. A saber:

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);

Los resultados para [UIColor yellowColor] arriba son
r = 1.000000 g = 1.000000 b = 0.000000 a = 1.000000, como se esperaba.

[UIColor redColor] da r = 1.000000 g = 0.000000 b = 0.000000 a = 1.000000, de nuevo como se esperaba. Del mismo modo para blueColor y greenColor.

No obstante , los resultados para [UIColor blackColor] y [UIColor whiteColor] parecen completamente anómala, y no sé lo que estoy haciendo mal (si es que soy).

A saber, da [UIColor blackColor]     r = 0.000000 g = 1.000000 b = 0.000000 a = 0.000000, que es un verde tranparent,

y [UIColor whiteColor] da     r = 1.000000 g = 1.000000 b = 0.000000 a = 0.000000, que es un amarillo transparente.

Te agradecería que si alguien podría o:

(1) explicar lo que estoy haciendo mal
(2) reproducir mis resultados anómalos y dime que no soy yo, o
(3) me golpeó en la cabeza con un martillo grande por lo que deja de doler tanto.

Howard

¿Fue útil?

Solución

Se está asumiendo el espacio de color es siempre RGBA, que no es el caso.

Prueba este código:

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

Y modelo permitirá kCGColorSpaceModelMonochrome.

Otros consejos

Creo que lo que se está perdiendo es que los colores pueden definirse en diferentes espacios de color:. Que está asumiendo que son todos RGBA

Por ejemplo, los docs estado que blackColor 'Devuelve un objeto de color cuya escala de grises valor es 0,0 y cuyo valor es alfa 1,0'. Así que creo que sólo dos componentes tienen una validez de negro, no cuatro.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top