2009-05-20 48 views
12

J'essaie d'extraire les composants rgb d'un UIColor afin de construire manuellement les pixels dans un CGBitmapContext. L'exemple de code suivant fonctionne correctement pour la plupart des constantes UIColor mais, pas de confusion, pas tous. A savoir:Résultats anormaux obtenant des composants de couleur de certains UIColors

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

Les résultats ci-dessus sont pour [UIColor yellowColor]
r = 1,000000 g = 1,000000 b = 0,000000 a = 1,000000, comme prévu.

[UIColor redColor] donne r = 1,000000 g = 0,000000 b = 0,000000 a = 1,000000, à nouveau comme prévu. De même pour blueColor et greenColor.

Cependant, les résultats pour [UIColor blackColor] et [UIColor whiteColor] semble tout à fait anormale, et je ne sais pas ce que je fais mal (si je suis en effet).

À savoir, [UIColor blackColor] donne r = 0,000000 g = 1,000000 b = 0,000000 a = 0,000000, qui est un vert tranparent,

et [UIColor whiteColor] donne r = 1,000000 g = 1,000000 b = 0,000000 a = 0,000000 , qui est un jaune transparent.

Je serais reconnaissant si quelqu'un pouvait soit:

(1) expliquer ce que je fais mal
(2) de reproduire mes résultats anormaux et me dire que c'est pas moi, ou
(3) Frappez-moi sur la tête avec un gros marteau pour que ça cesse de me faire tellement mal.

Howard

Répondre

11

Vous supposez que l'espace colorimétrique est toujours RVBA, ce qui n'est pas le cas.

Essayez ce code:

CGColorRef color = [[UIColor blackColor] CGColor]; 
const CGFloat* rgba = CGColorGetComponents(color); 
CGColorSpaceRef space = CGColorGetColorSpace(color); 
CGColorSpaceModel model = CGColorSpaceGetModel(space); 
NSLog(@"%d", model); 

Et le modèle donnera kCGColorSpaceModelMonochrome.

+0

Brillant! Je vous remercie. J'ai déjà été troublé par la référence fréquente à 'CGColorGetNumberOfComponents (color)' avant d'appeler 'CGColorGetComponents (color)'. Maintenant je vois pourquoi. En passant, n'y a-t-il pas moyen d'imprimer le * nom * du modèle ci-dessus, et pas seulement sa valeur? – hkatz

+0

Le débogueur vous montrera le nom, je ne suis pas sûr que vous pouvez l'imprimer, puisqu'il s'agit d'une définition constante d'un nombre. – pgb

2

Je pense que la chose vous manque est que les couleurs peuvent être définies dans différents espaces de couleurs: vous en supposant qu'ils sont tous RGBA.

Par exemple, the docs indique que blackColor "Retourne un objet de couleur dont la valeur d'échelle de gris est 0.0 et dont la valeur alpha est 1.0". Donc, je pense que seulement deux composants sont valables pour le noir, pas quatre.