2009-05-03 11 views
79

Visto esto antes, pero mi ejemplo no parece funcionar.Extrayendo rgb de UIColor

const CGFloat *toCol = CGColorGetComponents([[UIColor greenColor] CGColor]); 

La matriz está vacía al mirarla con GDB. ¿Algún consejo?

Respuesta

108

El ejemplo de código que proporcionó debería funcionar.

Prueba esto:

UIColor uicolor = [[UIColor greenColor] retain]; 
CGColorRef color = [uicolor CGColor]; 

int numComponents = CGColorGetNumberOfComponents(color); 

if (numComponents == 4) 
{ 
    const CGFloat *components = CGColorGetComponents(color); 
    CGFloat red = components[0]; 
    CGFloat green = components[1]; 
    CGFloat blue = components[2]; 
    CGFloat alpha = components[3]; 
} 

[uicolor release]; 
+0

OK intentaré esto en un momento, gracias –

+0

¿Por qué es necesario "retener" aquí? Además, parece que solo puedo obtener 2 (no 4) componentes. – Susanna

+5

FYI, Susanna, los colores de escala de grises aparecen como solo 2 componentes. – davidcann

1

Pedido uicolor-utilities. Parece una muy buena biblioteca para hacer esto y muchas otras cosas útiles con UIColor. Por ejemplo, con esta biblioteca se podría escribir:

CGFloat red = [myColor red]; 
7

Sólo tiene que utilizar memcpy:

CGColorRef tmpColor = [[currentColorView backgroundColor] CGColor]; 
CGFloat newComponents[4] = {}; 
memcpy(newComponents, CGColorGetComponents(tmpColor), sizeof(newComponents)); 
// now newComponents is filled with tmpColor rgba data 
+0

Probaremos, si está bien, es la solución más simple y no tan compleja de entender – htafoya

+0

Lo usé en mi aplicación ios y funciona. No se puede ver ninguna razón, no use este enfoque – Realexer

38

En iOS 5 podría usar:

UIColor *color = [UIColor orangeColor]; 
CGFloat red = 0.0, green = 0.0, blue = 0.0, alpha = 0.0; 

if ([color respondsToSelector:@selector(getRed:green:blue:alpha:)]) { 
    [color getRed:&red green:&green blue:&blue alpha:&alpha]; 
} else { 
    const CGFloat *components = CGColorGetComponents(color.CGColor); 
    red = components[0]; 
    green = components[1]; 
    blue = components[2]; 
    alpha = components[3]; 
} 
+1

En MonoTouch (Xamarin): 'color.GetRGBA (rojo, verde, azul, alfa);' –

14

Aquí es una solución todo redondo que también toma en cuenta colores no RGB, por ejemplo [UIColor blackColor]

UIColor *color = [UIColor blackColor]; 
CGFloat red = 0.0, green = 0.0, blue = 0.0, alpha = 0.0; 
// iOS 5 
if ([color respondsToSelector:@selector(getRed:green:blue:alpha:)]) { 
    [color getRed:&red green:&green blue:&blue alpha:&alpha]; 
} else { 
    // < iOS 5 
    const CGFloat *components = CGColorGetComponents(color.CGColor); 
    red = components[0]; 
    green = components[1]; 
    blue = components[2]; 
    alpha = components[3]; 
} 

// This is a non-RGB color 
if(CGColorGetNumberOfComponents(color.CGColor) == 2) { 
    CGFloat hue; 
    CGFloat saturation; 
    CGFloat brightness; 
    [color getHue:&hue saturation:&saturation brightness:&brightness alpha:&alpha]; 

} 
5

Gracias por la dirección Willster. Para cualquiera que esté usando color en escala de grises (creado con colorWithWhite:alpha:), el siguiente ejemplo de código le permitirá calcular el valor en blanco (el método HSV no funciona en los colores creados de esta manera).

CGFloat red = 0.0, green = 0.0, blue = 0.0, alpha = 0.0, white = 0.0; 

// This is a non-RGB color 
if(CGColorGetNumberOfComponents(self.color.CGColor) == 2) { 
    [self.color getWhite:&white alpha:&alpha]; 
} 
else { 
    // iOS 5 
    if ([self.color respondsToSelector:@selector(getRed:green:blue:alpha:)]) { 
     [self.color getRed:&red green:&green blue:&blue alpha:&alpha]; 
    } else { 
     // < iOS 5 
     const CGFloat *components = CGColorGetComponents(self.color.CGColor); 
     red = components[0]; 
     green = components[1]; 
     blue = components[2]; 
     alpha = components[3]; 
    } 
} 
Cuestiones relacionadas