2013-01-17 8 views
7

In meiner C++ - Anwendung habe ich die Farbe eines Png-Bildes in Bezug auf Rot, Grün, Blau. Ich habe diese Werte in drei ganzen Zahlen gespeichert.Wie konvertiert man einen RGB-Farbwert in einen hexadezimalen Wert in C++?

Wie konvertiert man RGB-Werte in den entsprechenden hexadezimalen Wert?

Beispiel, dass wie in diesem Format 0x1906

EDIT: Ich werde das Format als GLuint speichern.

+1

In dieser Nummer, '0x1906', welche Bits repräsentiert die verschiedenen Farben? –

+0

Ich bin mir nicht sicher. Aber es sollte wie RGB-Sequenz sein! Weiß nicht, ob es deine Frage beantwortet. Es tut uns leid! – Tahlil

+0

Warten Sie, Sie möchten in ein anderes Format konvertieren, wissen aber nicht, welches Format das ist? Es gibt nur eine Möglichkeit, dieses Problem zu lösen, und niemand kann Ihnen dabei wirklich helfen. –

Antwort

17

Speichern Sie die entsprechenden Bits jeder Farbe in eine unsignierte ganze Zahl von mindestens 24 Bit (wie ein long):

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

jetzt statt:

unsigned long rgb = 0xFA09CA; 

können Sie tun:

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

Beachten Sie, dass die oben genannten nicht mit dem Alpha-Kanal befassen. Wenn Sie müssen auch alpha (RGBA) kodieren, dann müssen Sie diese stattdessen:

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

ersetzen unsigned long mit GLuint wenn das, was Sie brauchen.

7

Wenn Sie eine Zeichenfolge aufbauen wollen, können Sie wahrscheinlich snprintf() verwenden:

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

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

Dies wird die Zeichenfolge 001906" in hexcol` bauen, das ist, wie ich wählte Ihr Beispiel Farbe zu interpretieren (die nur vier Ziffern wenn es sechs sein sollte).

Sie scheinen verwirrt über die Tatsache zu sein, dass das GL_ALPHA Präprozessorsymbol in OpenGL-Headerdateien als 0x1906 definiert ist. Dies ist keine Farbe, es ist ein Format-Spezifizierer mit OpenGL API-Aufrufe, die mit Pixeln umgehen, so dass sie wissen, welches Format zu erwarten ist.

Wenn Sie ein PNG-Bild im Speicher haben, würde das GL_ALPHA Format entspricht nur die Alpha-Werte im Bild (falls vorhanden), die oben ist etwas ganz anderes, da es eine Reihe aufbaut. OpenGL benötigt keine Zeichenkette, es benötigt einen In-Memory-Puffer, der die Daten im erforderlichen Format enthält.

Eine Anleitung dazu finden Sie in der Handbuch-Seite glTexImage2D().

+0

Du hast mein Problem genau richtig. Dies ist, wo ich stecken geblieben bin. Ich habe die rgb-Werte, die ich von dem PLTE-Block eines PNG-Bildes erhalten habe. Ich möchte das Texturformat einstellen. Der Farbtyp des Bildes ist jedoch 3, was eine indizierte Farbe ist. Normalerweise für andere Farben wie 0 (PNG_COLOR_TYPE_GRAY) setze ich das Texturformat als 0x1909 (GL_LUMINANCE). Aber was soll ich für Farbtyp 3 tun? Ich habe einen Beitrag darüber gemacht http://stackoverflow.com/questions/14373099/png-image-texture-format-for-color-type-3 – Tahlil