2010-09-16 21 views
8

Convertir de código HEX color a RGB en c puro utilizando C biblioteca solamente (sin C++, plantillas, etc.) RGB struct puede ser así -> typedef struct RGB {double r; doble g; doble b; } RGB1; función debe devolver RGB1Convertir de HEX color a estructura RGB en C

+1

No estoy seguro de entender la pregunta. Creo que marcar cosas como código y/o insertar líneas nuevas en la pregunta en lugares estratégicos puede ser útil para hacer que la pregunta sea más fácil para que las personas lean (y, por lo tanto, respondan). – cubic1271

Respuesta

8

Un valor RGB se puede almacenar como en número entero a través de 0xRRGGBB. Ejemplos:

  • rojas: 0xff0000
  • verde: 0x00FF00
  • Azul: 0x0000FF

00 es hexagonal para decimal 0, mientras que ff es 255. 0 corresponde a 0,0 y 255 a 1,0. (En realidad no especificó cuál es el rango. Supongo que es 0.0 a 1.0.)

Por lo tanto, con las suposiciones anteriores, necesita extraer cada componente y dividir por 255. Dado que suena como una tarea pregunta, le mostraré cómo puede hacer el componente rojo.

int hex = 0x123456; 
c.r = ((hex >> 16) & 0xff)/255.0; 

Cada dígito hexadecimal ocupa 4 bits. Así que cambie a la derecha en 16 bits (para mover todo 4 dígitos a la derecha) para hacer que 0xRRGGBB se convierta en 0xRR. Ahora tienes el componente rojo. (En caso de que haya datos más arriba en el entero, puede deshacerse de él enmascarando los datos a través del & 0xff.)

Si está tratando con una cadena "#FFFFFF", primero debe convertirla a un número entero para que lo anterior funcione.

14

Suponiendo que el valor hexadecimal es un tipo de 32 bits 'int', y que usamos la estructura RGB descrito anteriormente, entonces tal vez hacer algo como:

struct RGB colorConverter(int hexValue) 
{ 
    struct RGB rgbColor; 
    rgbColor.r = ((hexValue >> 16) & 0xFF)/255.0; // Extract the RR byte 
    rgbColor.g = ((hexValue >> 8) & 0xFF)/255.0; // Extract the GG byte 
    rgbColor.b = ((hexValue) & 0xFF)/255.0;  // Extract the BB byte 

    return rgbColor; 
} 
+0

Una especie de estafa de la respuesta que dio @konforce, ¿no es así? – ubiquibacon

+0

Nah. También había un código para el procesamiento de cadenas, pero el punto que Konforce hizo acerca de que probablemente era una pregunta de tarea era bueno. Por lo tanto, edité esta respuesta para que se pareciera más a la que se publicó anteriormente. – cubic1271

+0

¿Debería hexValue ser del tipo unsigned int? Creo que el & 0xFF cancela el cambio aritmético, pero ¿un valor como 0xFFFFFF no causaría un desbordamiento cuando se transfiere? –

6

Si el código hexadecimal es una cadena, puede analizar como este

char *str = "0000FF"; 
int r, g, b; 
sscanf(str, "%02x%02x%02x", &r, &g, &b); 

Eso es enteros, no dobles. También verifique que sscanf devuelve 3, la cantidad de elementos leídos.

+0

¡Gran respuesta, simple y funcional! –