2013-01-17 20 views
7

Nella mia applicazione C++, ho un colore dell'immagine png in termini di valori di rosso, verde, blu. Ho memorizzato questi valori in tre interi.come convertire un valore di colore RGB in un valore esadecimale in C++?

Come convertire i valori RGB nel valore esadecimale equivalente?

Esempio di che, come in questo formato 0x1906

EDIT: io salverò il formato come GLuint.

+1

In quel numero, '0x1906', quali bit rappresentano i diversi colori? –

+0

Non ne sono sicuro. Ma dovrebbe essere come una sequenza RGB! Non so se risponde alla tua domanda. Scusate! – Tahlil

+0

Aspetta, vuoi convertire in qualche formato ma non sai quale sia quel formato? C'è solo un modo per risolvere questo problema, e nessuno può davvero aiutarti in questo. –

risposta

17

Conservare i bit appropriati di ogni colore in un intero senza segno di almeno 24 bit (come un long):

unsigned long createRGB(int r, int g, int b) 
{ 
    return ((r & 0xff) << 16) + ((g & 0xff) << 8) + (b & 0xff); 
} 

Ora, invece di:

unsigned long rgb = 0xFA09CA; 

si può fare:

unsigned long rgb = createRGB(0xFA, 0x09, 0xCA); 

Si noti che quanto sopra non si occuperà del canale alfa. Se avete bisogno di codificare anche alfa (RGBA), allora avete bisogno di questo, invece:

unsigned long createRGBA(int r, int g, int b, int a) 
{ 
    return ((r & 0xff) << 24) + ((g & 0xff) << 16) + ((b & 0xff) << 8) 
      + (a & 0xff); 
} 

Sostituire unsigned long con GLuint se questo è quello che vi serve.

7

Se si vuole costruire una stringa, probabilmente si può utilizzare snprintf():

const unsigned red = 0, green = 0x19, blue = 0x06; 
char hexcol[16]; 

snprintf(hexcol, sizeof hexcol, "%02x%02x%02x", red, green, blue); 

Questo costruisce il hexcol` stringa di 001906" in, che è come ho scelto di interpretare il colore esempio (che è solo quattro cifre quando dovrebbe essere sei).

Sembra che tu sia confuso dal fatto che il simbolo del preprocessore GL_ALPHA sia definito come 0x1906 nei file di intestazione di OpenGL. Questo non è un colore, è un identificatore di formato utilizzato con chiamate API OpenGL che gestiscono i pixel, in modo che sappiano quale formato aspettarsi.

Se si dispone di un'immagine PNG in memoria, il formato GL_ALPHA corrisponderebbe a solo i valori alfa nell'immagine (se presente), quanto sopra è qualcosa di totalmente diverso, dato che produce una stringa. OpenGL non avrà bisogno di una stringa, avrà bisogno di un buffer in-memory contenente i dati nel formato richiesto.

Vedere la pagina di manuale glTexImage2D() per una discussione su come funziona.

+0

Hai risolto esattamente il mio problema. Questo è dove sono rimasto bloccato. Ho i valori rgb che ho ottenuto dal pezzo PLTE di un'immagine png. Voglio impostare il formato della trama. Ma il tipo di colore dell'immagine è 3, che è un colore indicizzato. Normalmente per un altro tipo di colore come 0 (PNG_COLOR_TYPE_GRAY) imposto il formato della trama come 0x1909 (GL_LUMINANCE). Ma cosa dovrei fare per il tipo di colore 3? Ho fatto un post su di esso http://stackoverflow.com/questions/14373099/png-image-texture-format-for-color-type-3 – Tahlil