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

Posted

技术标签:

【中文标题】如何在 C++ 中将 RGB 颜色值转换为十六进制值?【英文标题】:how to convert a RGB color value to an hexadecimal value in C++? 【发布时间】:2012-12-31 18:15:03 【问题描述】:

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

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

这种格式0x1906的例子

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

【问题讨论】:

在那个数字中,0x1906,哪些位代表不同的颜色? 我不确定。但它应该像RGB序列!不知道它是否回答了你的问题。对不起! 等等,你想转换成某种格式但你不知道那个格式是什么?只有一种方法可以解决这个问题,没有人能真正帮助你。 格式应该和GL_ALPHA的格式一样。等于 0x1906。它是在 GLES 上定义的。 我明白了。我在 unwind 的回答中作为评论解释了我的问题。谢谢。 【参考方案1】:

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

【讨论】:

【参考方案2】:

如果你想构建一个字符串,你大概可以使用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 预处理器符号在OpenGL 的头文件中定义为0x1906 这一事实感到困惑。这不是颜色,它是用于处理像素的 OpenGL API 调用的格式说明符,因此它们知道预期的格式。

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

请参阅 @987654321@ 手册页,了解有关其工作原理的讨论。

【讨论】:

你的问题完全正确。这就是我卡住的地方。我有从 png 图像的 PLTE 块中获得的 rgb 值。我想设置纹理格式。但是图像的颜色类型是 3,它是索引颜色。通常对于其他颜色类型,如 0 (PNG_COLOR_TYPE_GRAY),我将纹理格式设置为 0x1909 (GL_LUMINANCE)。但是我应该为颜色类型 3 做些什么呢?我已经发了一个帖子***.com/questions/14373099/…

以上是关于如何在 C++ 中将 RGB 颜色值转换为十六进制值?的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中将十六进制转换为 RGB 值

在Javascript中将rgb字符串转换为十六进制

js中如何把RGB颜色转换为16进制颜色

如何使用 Swift 5 在 SwiftUI 中将颜色与 RGB 或十六进制值一起使用? [复制]

将 RGB 颜色值转换为十六进制字符串

将 RGB 颜色值转换为十进制