2010-09-16 12 views
8

Converti da codice HEX a RGB in puro c utilizzando solo la libreria C (senza C++, modelli, ecc.) La struttura RGB può essere come questa -> typedef struct RGB {double r; doppio g; doppio b; } RGB1; La funzione deve restituire RGB1Converti da HEX a struct RGB in C

+1

Non sono sicuro di aver capito la domanda. Credo che contrassegnare le cose come codice e/o inserire nuove righe nella domanda in punti strategici possa essere utile per rendere la domanda più semplice da leggere (e quindi rispondere). – cubic1271

risposta

8

Un valore RGB può essere memorizzato come intero tramite 0xRRGGBB. Esempi:

  • rossi: 0xff0000
  • Verde: 0x00FF00
  • Blu: 0x0000FF

00 è esadecimale per decimali 0, mentre FF è 255. 0 corrisponde a 0,0 e 255 a 1.0. (In realtà non hai specificato quale sia l'intervallo. Sto assumendo da 0.0 a 1.0)

Quindi, con le ipotesi sopra riportate, devi estrarre ogni componente e dividerlo per 255. Poiché suona molto come un compito domanda, ti mostrerò solo come puoi fare il componente rosso.

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

Ogni cifra esadecimale occupa 4 bit. Quindi spostare a destra di 16 bit (per spostare tutte le 4 cifre a destra) per rendere 0xRRGGBB diventare 0xRR. Ora hai il componente rosso. (Nel caso ci siano alcuni dati più in alto nel numero intero, puoi eliminarlo mascherando i dati tramite & 0xff.)

Se hai a che fare con una stringa "#FFFFFF", devi prima convertirla a un numero intero per cui sopra funziona.

14

Supponendo che il valore esadecimale è un tipo a 32 bit 'int', e che noi utilizziamo lo struct RGB sopra descritto, allora forse fare qualcosa di simile:

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

Tipo di strappare via la risposta che @konforce ha dato non siamo noi? – ubiquibacon

+0

Nah. C'era anche del codice per l'elaborazione delle stringhe, ma il punto su cui konforce faceva questo probabilmente era una domanda a casa. Così, ho modificato questa risposta per essere più simile a quella pubblicata sopra. – cubic1271

+0

Se hexValue deve essere di tipo unsigned int? Penso che il & 0xFF annulli lo spostamento aritmetico, ma un valore come 0xFFFFFF non causerebbe un overflow quando è passato? –

6

Se il codice esadecimale è una stringa, è possibile analizzare come questo

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

Vale a int, non doppie. Controlla anche che sscanf restituisca 3, il numero di elementi letti.

+0

Ottima risposta, semplice e funzionante! –