2010-11-11 12 views
6

Tengo un UILabel con color negro;Cómo obtener componentes de color de un CGColor correctamente

Estoy escribiendo el siguiente código para obtener los componentes de color negro.

UIColor *aColor = [aLabel.textColor retain]; 
const CGFloat* components = CGColorGetComponents(aColor.CGColor); 
CGColorSpaceRef colorSpace=CGColorSpaceCreateDeviceRGB(); 

pero siempre presente está dando componentes de color verde en lugar de componentes de color negro;

¿Alguien tiene idea sobre esto?

¿Estoy pasando por un espacio de color diferente?

:-(Por favor, ayúdame.

Respuesta

13

espacio de color más probable es equivocada. Creo que el componente alfa del espacio de color en escala de grises lleva a donde cree que el componente verde debe ser.
utilizo esta función para crear una cadena de UIColor, sólo encontrar espacios de color RGB y en escala de grises, así que sólo interpretar cada color con menos de 4 (R + G + B + a) componentes como escala de grises.

if (CGColorGetNumberOfComponents(color.CGColor) < 4) { 
    const CGFloat *components = CGColorGetComponents(color.CGColor); 
    color = [UIColor colorWithRed:components[0] green:components[0] blue:components[0] alpha:components[1]]; 
} 
if (CGColorSpaceGetModel(CGColorGetColorSpace(color.CGColor)) != kCGColorSpaceModelRGB) { 
    NSLog(@"no rgb colorspace"); 
    // do seomthing 
} 
const CGFloat *components = CGColorGetComponents(color.CGColor); 
NSString *colorAsString = [NSString stringWithFormat:@"%f,%f,%f,%f", components[0], components[1], components[2], components[3]]; 

por supuesto este método no es guardar para todos los casos , debe adoptarlo según sus requisitos.

+0

Hola Fluchtpunkt! ¡Gracias por tu mensaje! Me ayuda a tener alguna idea. ¿Puede decirme por qué está dando r = 0.000000 g = 1.000000 b = 0.000000 a = 0.000000 cuando estoy imprimiendo componentes de color que son componentes de color verde a pesar de que paso el color negro. Muchas gracias – Ganesh

+0

Creo que el puntero generado por CGColorGetComponents necesita ser desasignado manualmente. – AntiMoron

+0

No. Estaba equivocado. http://stackoverflow.com/questions/6219370/where-is-the-memory-leak – AntiMoron

1

Una forma de obtener RGB para estos es dibujando el color en un contexto de gráficos y leyendo el color de nuevo. Véase mi respuesta a esta pregunta, por ejemplo, código:

Get RGB value from UIColor presets

5

La razón por la que está viendo lo que parece ser r=0, g=1, b=0, a=0 es porque estás mal interpretando los valores de la matriz devuelta como estar en un RGB modelo de color. UIColor utiliza espacio de color monocromo para colores en escala de grises como negro en este caso.
Lo que está viendo es una matriz de 2 componentes de un modelo de color monocromático. El primero es gris nivel (0 para negro) y el segundo es alpha (1 para opaco). Los últimos dos valores que está viendo están fuera del final de la matriz de elementos 2 y resulta ser 0 en este caso.

Notarás si el color es negro e intentas CGColorGetNumberOfComponents(color.CGColor), devuelve 2. Y si se intenta CGColorSpaceGetModel(CGColorGetColorSpace(color.CGColor)), devuelve 0 que corresponde a kCGColorSpaceModelMonochrome (véase la enumeración CGColorSpaceModel en CGColorSpace.h)

ver CGColorSpace Reference

+0

gracias, ahora lo tengo. no hace daño si unifican escala de grises y escala de grises en 4 componentes, ya que la escala de grises también se puede representar mediante RGB. Estoy sorprendido de que iOS haya distinguido esos dos y ni siquiera documente esto: P – RainCast

2

Creo que esta es una muy buena manera de obtener la representación RGB de cualquier UIColor *, el cual ya tiene un método conveniente para retener sus componentes.

-(CGColorRef)CGColorRefFromUIColor:(UIColor*)newColor { 
    CGFloat components[4] = {0.0,0.0,0.0,0.0}; 
    [newColor getRed:&components[0] green:&components[1] blue:&components[2]  alpha:&components[3]]; 
    CGColorRef newRGB = CGColorCreate(CGColorSpaceCreateDeviceRGB(), components); 
    return newRGB; 
} 
+3

¡Cuidado! iOS5 + solo. Además, no estás liberando el objeto de espacio de color que has creado. –

0

exampel trabajar con UIColor: CALayer * btnLayer = [myLittleButton layer];

[layer setBackgroundColor:<#(CGColorRef)#>] se convierte en: [btnLayer setBorderColor:[[UIColor grayColor] CGColor]];

Sólo asegúrese de que los botones de colores originales duerma cubren la capa

Cuestiones relacionadas