在我的C++应用程序中,我用红色、绿色、蓝色值表示一个PNG图像的颜色。我已经将这些值存储在三个整数中。
如何将RGB值转换为相应的十六进制值?
例如,格式应该类似于0x1906。
编辑:我会将格式保存为GLuint。
将每种颜色的适当位存储到至少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);
请注意,上述内容不包含 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
。
如果您想要构建一个字符串,您可能可以使用snprintf()
函数:
const unsigned red = 0, green = 0x19, blue = 0x06;
char hexcol[16];
snprintf(hexcol, sizeof hexcol, "%02x%02x%02x", red, green, blue);
这将构建字符串001906
在`hexcol`中,这是我选择解释你的示例颜色的方式(它只有四个数字,而实际上应该有六个)。
您似乎对OpenGL头文件中定义的GL_ALPHA
预处理器符号被定义为0x1906
感到困惑。这不是一种颜色,而是用于OpenGL API调用处理像素时使用的格式说明符,以便它们知道要期望什么格式。
如果您在内存中有一个PNG图像,则GL_ALPHA
格式将仅与图像中的alpha值(如果存在)对应,上述内容完全不同,因为它是构建一个字符串。OpenGL不需要字符串,它需要一个按照所需格式保存数据的内存缓冲区。
请参阅glTexImage2D()
手册页面,了解其工作原理。
0x1906
,哪些位代表不同的颜色? - Some programmer dude