9

在我的 C++ 应用程序中,我有一个 png 图像的红色、绿色、蓝色值。我将这些值存储在三个整数中。

如何将 RGB 值转换为等效的十六进制值?

像这种格式的例子 0x1906

编辑:我将格式保存为 GLuint。

4

2 回答 2

25

将每种颜色的相应位存储到至少 24 位的无符号整数中(如 a 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);

请注意,上面不会处理 alpha 通道。如果您还需要编码 alpha (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`,这就是我选择解释您的示例颜色的方式(当它应该是六位时只有四位数字)。

GL_ALPHA您似乎对预处理器符号被定义0x1906在 OpenGL 的头文件中这一事实感到困惑。这不是颜色,它是用于处理像素的 OpenGL API 调用的格式说明符,因此他们知道预期的格式。

如果您在内存中有一个 PNG 图像,则GL_ALPHA格式将对应于图像中的 alpha 值(如果存在),上述内容完全不同,因为它构建了一个字符串。OpenGL 不需要字符串,它需要一个内存缓冲区来保存所需格式的数据。

glTexImage2D()有关其工作原理的讨论,请参见手册页。

于 2013-01-17T08:55:09.220 回答