2013-01-17 11 views
7

W mojej aplikacji C++, mam kolor obrazu png w kategoriach wartości Czerwonej, Zielonej, Niebieskiej. Zapisałem te wartości w trzech liczbach całkowitych.jak przekonwertować wartość koloru RGB na wartość szesnastkową w C++?

Jak przekonwertować wartości RGB na równoważną wartość szesnastkową?

Przykład, że podobnie jak w tym formacie 0x1906

EDIT: będę zapisać jako format GLuint.

+1

W tym numerze "0x1906", które bity reprezentują różne kolory? –

+0

Nie jestem tego pewien. Ale powinno to być jak sekwencja RGB! Nie wiem, czy odpowiada na twoje pytanie. Przepraszam! – Tahlil

+0

Czekaj, chcesz przekonwertować na jakiś format, ale nie wiesz, jaki to format? Jest tylko jeden sposób na rozwiązanie tego problemu i nikt nie może ci w tym pomóc. –

Odpowiedz

17

Store odpowiednie bity każdego koloru w unsigned całkowitej wynoszącej co najmniej 24 bitów (jak long):

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

Teraz zamiast:

unsigned long rgb = 0xFA09CA; 

można zrobić:

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

Należy zauważyć, że powyższe nie dotyczy kanału alfa. Jeśli trzeba też kodować alfa (RGBA), to trzeba to zamiast:

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

Wymień unsigned long z GLuint jeśli to, co trzeba.

7

Jeśli chcesz zbudować ciąg, prawdopodobnie można użyć snprintf():

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

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

To zbuduje ciąg 001906" in hexcol`, czyli jak wybrałem interpretować swój przykładowy kolor (który jest tylko cztery cyfry kiedy powinno być sześć).

Wygląda na to, że nie rozumiesz, że symbol preprocesora GL_ALPHA jest zdefiniowany jako 0x1906 w plikach nagłówkowych OpenGL. To nie jest kolor, jest to specyfikator formatu w formacie używany z wywołaniami OpenGL API, które dotyczą pikseli, dzięki czemu wiedzą, jakiego formatu oczekiwać.

Jeśli masz obrazu PNG w pamięci, należy sformatować GL_ALPHA odpowiadałaby tylko wartości alfa w obrazie (jeśli występuje), powyższe jest coś zupełnie innego, ponieważ buduje ciąg. OpenGL nie będzie potrzebował łańcucha, będzie potrzebował bufora w pamięci przechowującego dane w wymaganym formacie.

Zobacz stronę podręcznika glTexImage2D(), aby dowiedzieć się, jak to działa.

+0

Masz mój problem dokładnie. Właśnie tam utknąłem. Mam wartości rgb, które otrzymałem z fragmentu PLTE obrazu png. Chcę ustawić format tekstury. Ale typem koloru obrazu jest 3, które jest zindeksowanym kolorem. Zwykle dla innych typów kolorów, takich jak 0 (PNG_COLOR_TYPE_GRAY) ustawiam format tekstury jako 0x1909 (GL_LUMINANCE). Ale co powinienem zrobić dla koloru typu 3? Zrobiłem post o tym http://stackoverflow.com/questions/14373099/png-image-texture-format-for-color-type-3 – Tahlil

Powiązane problemy