2010-08-18 4 views
1

Comment puis-je convertir un entier ARGB en tuple ARGB correspondant (A, R, G, B)?Comment puis-je convertir un entier RGB en un tuple RGB correspondant (R, G, B)?

Je reçois du code XML dans lequel une étiquette de couleur est donnée avec une valeur entière (par exemple -16777216). J'ai besoin de dessiner un rectangle rempli de cette couleur. Mais je suis incapable de récupérer les valeurs des composants A, R, G, B à partir de la valeur entière.

+4

"Wid dat" ??? Arrête ça!! –

+1

@Heath: C'est arrêté maintenant. – unwind

+0

bien je vais arrêter tout cela, maintenant allez-vous me donner la solution de mon problème ..... –

Répondre

1

Vous pouvez essayer d'utiliser des unions. Quelque chose comme ça

struct color 
{ 
    unsigned char alpha:8; 
    unsigned char r:8; 
    unsigned char g:8; 
    unsigned char b:8; 
}; 

union 
{ 
    struct color selector; 
    unsigned int base:32; 
}; 
+1

+1 - Cela pourrait être utilisé pour fournir plus d'informations sur les questions sur les syndicats à SO. –

+2

-1, car cela introduit des problèmes endian. – unwind

2

utilisation et au niveau du bit décalage vers la droite pour sélectionner octets individuels de l'entier de 32 bits.

uint32_t color = -16777216; 

uint8_t b = (color & 0x000000ff); 
uint8_t g = (color & 0x0000ff00) >> 8; 
uint8_t r = (color & 0x00ff0000) >> 16; 
uint8_t a = (color & 0xff000000) >> 24; 
+0

BTW, IMO il serait légèrement moins sujet aux erreurs si vous avez décalé avant de masquer, puis tous les masques peuvent être '0xFF'. – jamesdlin

+0

Vous avez peut-être raison - je l'ai toujours fait de cette façon. Pourriez-vous expliquer pourquoi vous considéreriez que c'est plus sujet aux erreurs? J'espère qu'il n'y a pas un bug subtil qui me manque. –

+0

@Todd: Probablement parce qu'il est plus facile de tromper, par ex. 0x00ff0000 que de taper 0xff. En outre, les masques les plus grands sont très susceptibles d'être plus coûteux en termes de code. – unwind

3

Si l'entier est ARVB je pense qu'il devrait être:

unsigned char b = color & 0x000000FF; 
unsigned char g = (color>> 8) & 0x000000FF; 
unsigned char r = (color>>16) & 0x000000FF; 
unsigned char a = (color>>24) & 0x000000FF; 
+0

ça marche mais à la place de la flore verte ça me donne du jaune .. y at-il un problème avec une valeur alpha ?? –

+0

Oups, vous avez raison. Le mien était en arrière. Je l'ai réparé. –

+0

@Greshi Gupta Pouvez-vous fournir la valeur de couleur que vous essayez de convertir? Cela devrait fonctionner pour la couleur ARGB 32 bits. Le jaune est un mélange de rouge et de vert, donc peut-être que vos valeurs de couleur ont une profondeur de bits inférieure ou quelque chose. Les valeurs alpha AFAIK ne doivent pas affecter la teinte de la couleur. –

0

Essayez le code suivant:

unsigned a = (color >> 24) & 0x000000FF; 
unsigned b = (color >> 16) & 0x000000FF; 
unsigned g = (color >> 8) & 0x000000FF; 
unsigned r = color & 0x000000FF; 

CGFloat rf = (CGFloat)r/255.f; 
CGFloat gf = (CGFloat)g/255.f; 
CGFloat bf = (CGFloat)b/255.f; 
CGFloat af = (CGFloat)a/255.f; 
+0

Je ne sais pas si cela a quelque chose à voir avec le format fourni par mon client, mais j'ai dû échanger les noms de b et r pour le faire fonctionner. – user2875404