如何在C++中将RGB颜色值转换为十六进制值?

12

在我的C++应用程序中,我用红色、绿色、蓝色值表示一个PNG图像的颜色。我已经将这些值存储在三个整数中。

如何将RGB值转换为相应的十六进制值?

例如,格式应该类似于0x1906。

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


1
在这个数字中,0x1906,哪些位代表不同的颜色? - Some programmer dude
我不确定。但应该像RGB序列一样!不知道是否回答了你的问题。抱歉! - Tahlil
我已经查过了,GL_ALPHA格式只涉及一个分量:alpha值。没有红色;没有绿色;没有蓝色;没有勺子。 这个问题非常不清楚。 - R. Martinho Fernandes
1
我明白了。我把我的问题作为评论在unwind的回答中解释了。谢谢。 - Tahlil
嗯...这个问题中的“十六进制值”是什么意思?你是指一个ASCII字符串,表示十六进制符号表示的值吗? - AnT stands with Russia
显示剩余3条评论
2个回答

32

将每种颜色的适当位存储到至少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


10

如果您想要构建一个字符串,您可能可以使用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()手册页面,了解其工作原理。


您完全准确地理解了我的问题。这就是我卡住的地方。我有从 PNG 图像的 PLTE 块获取到的 RGB 值。我想设置纹理格式。但是,该图像的颜色类型为 3,即索引颜色。通常对于其他颜色类型,如 0 (PNG_COLOR_TYPE_GRAY),我将纹理格式设置为 0x1909(GL_LUMINANCE)。但是对于颜色类型为 3 的情况,应该怎么办呢?我已经在 StackOverflow 上发布了一个帖子 http://stackoverflow.com/questions/14373099/png-image-texture-format-for-color-type-3 - Tahlil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接