9

私のC++アプリケーションでは、赤、緑、青の値でpng画像の色を使用しています。これらの値を3つの整数で格納しました。

RGB値を同等の16進値に変換するにはどうすればよいですか?

この形式のような例0x1906

編集:フォーマットをGLuintとして保存します。

4

2 に答える 2

25

各色の適切なビットを、少なくとも24ビットの符号なし整数(のようにlong)に格納します。

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

今の代わりに:

unsigned long rgb = 0xFA09CA;

できるよ:

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

上記はアルファチャネルを扱っていないことに注意してください。アルファ(RGBA)もエンコードする必要がある場合は、代わりにこれが必要です。

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

それが必要な場合は、と交換unsigned longしてください。GLuint

于 2013-01-17T08:56:51.400 に答える
10

文字列を作成する場合は、おそらく次を使用できますsnprintf()

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

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

これにより、文字列001906" inhexcol`が作成されます。これは、例の色を解釈するために選択した方法です(6桁の場合は4桁のみです)。

プリプロセッサシンボルがOpenGLのヘッダーファイルGL_ALPHAにあると定義されているという事実に混乱しているようです。0x1906これは色ではなく、ピクセルを処理するOpenGL API呼び出しで使用される形式指定子であるため、予想される形式を認識しています。

PNG画像がメモリにある場合、GL_ALPHA形式は画像内のアルファ値(存在する場合)のみに対応します。上記は文字列を作成するため、まったく異なるものです。OpenGLは文字列を必要とせず、必要な形式でデータを保持するメモリ内バッファが必要になります。

glTexImage2D()これがどのように機能するかについては、マニュアルページを参照してください。

于 2013-01-17T08:55:09.220 に答える