resultados anómalos conseguir componentes de color de algunas UIColors
-
23-08-2019 - |
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
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.