2009-05-03 5 views
79

Vu cela demandé avant mais mon exemple ne semble pas fonctionner.Extraire rgb de UIColor

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

Le tableau est vide de le regarder avec GDB. Des indices?

Répondre

108

L'exemple de code que vous avez fourni devrait fonctionner.

Essayez ceci:

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 va essayer dans un instant, merci –

+0

Pourquoi "retenir" nécessaire ici? En outre, je peux seulement sembler obtenir 2 (pas 4) composants. – Susanna

+5

FYI, Susanna, les couleurs en niveaux de gris apparaissent comme seulement 2 composants. – davidcann

1

Commander uicolor-utilities. On dirait une très bonne bibliothèque pour faire cela et beaucoup d'autres choses utiles avec UIColor. Par exemple, avec cette bibliothèque, vous pouvez écrire:

CGFloat red = [myColor red]; 
7

Il suffit d'utiliser memcpy:

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

Test, si ok c'est la solution la plus simple et pas si complexe à comprendre – htafoya

+0

Je l'ai utilisé dans mon application ios et cela fonctionne. Impossible de voir quelle raison n'utilisez pas cette approche – Realexer

38

Dans iOS 5, vous pouvez utiliser:

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 (rouge, vert, bleu, alpha); –

14

est ici une toute solution complète qui prend aussi tenir compte des couleurs non-RVB [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

Merci pour la direction Willster. Pour tous ceux qui utilisent la couleur en niveaux de gris (créée avec colorWithWhite:alpha:), l'exemple de code ci-dessous vous permettra de déterminer la valeur du blanc (la méthode HSV ne fonctionne pas sur les couleurs créées de cette façon).

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]; 
    } 
} 
Questions connexes