Extraire rgb de UIColor

Vu cela demandé auparavant, mais mon exemple ne semble pas fonctionner.

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

Le tableau est vide après l’avoir vu avec GDB. Des indices?

L’échantillon de code que vous avez fourni devrait fonctionner.

Essaye ça:

 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]; 

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

Voici une solution complète qui prend également en compte les couleurs non-RVB, par exemple [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]; } 

Utilisez simplement memcpy:

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

Merci pour la direction Willster. Pour ceux qui utilisent des couleurs en niveaux de gris (créées avec colorWithWhite:alpha: , l’exemple de code ci-dessous vous permettra de déterminer la valeur blanche (la méthode HSV ne fonctionne pas avec les couleurs créées de cette manière).

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

Cet article m’a aidé à résoudre ce problème ou au moins à construire le cadre pour le résoudre.

http://developer.apple.com/iphone/library/qa/qa2007/qa1509.html

Voici un exemple de code plus direct pour obtenir des composants RVB à partir d’une couleur arbitraire:

Obtenir une valeur RVB à partir des parameters prédéfinis UIColor

Commander les utilitaires uicolor . 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];