2009-05-20 6 views
12

Estoy tratando de extraer los componentes rgb de un UIColor para construir manualmente los píxeles en un CGBitmapContext. El siguiente código de ejemplo funciona bien para la mayoría de las constantes UIColor pero, confusamente, no todas. A saber:Resultados anómalos obteniendo componentes de color de algunos UIColors

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] anteriormente 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.

Sin embargo, 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, [UIColor blackColor] da r = 0,000000 g = 1,000000 b = 0,000000 a = 0,000000, que es un tranparent verde,

y [UIColor whiteColor] da r = 1,000000 g = 1,000000 b = 0,000000 a = 0,000000 , que es un amarillo transparente.

lo agradecería si alguien podría o:

(1) explicar lo que estoy haciendo mal
(2) replicar mis resultados anómalos y dime que no soy yo, o
(3) golpéame en la cabeza con un gran martillo para que deje de doler tanto.

Howard

Respuesta

11

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

probar 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.

+0

Brilliant! Gracias. He estado confundido antes por la referencia frecuente a 'CGColorGetNumberOfComponents (color)' antes de llamar 'CGColorGetComponents (color)'. Ahora veo por qué. Por cierto, ¿no hay una forma de imprimir el * nombre * del modelo anterior, y no solo su valor? – hkatz

+0

El depurador le mostrará el nombre, no estoy seguro de que pueda imprimirlo, ya que es una definición constante de un número. – pgb

2

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

Por ejemplo, the docs declara que blackColor "Devuelve un objeto de color cuyo valor en escala de grises es 0.0 y cuyo valor alfa es 1.0". Entonces creo que solo dos componentes son válidos para negro, no cuatro.

Cuestiones relacionadas