我有 uint16_t color
并且需要将其转换为等效的 RGB。十六进制设置为前 5 位代表红色,接下来的 6 位代表绿色,最后 5 位代表蓝色。
到目前为止,我已经找到了一些接近于解决方案的东西,但并不完全是由于截断。
void hexToRGB(uint16_t hexValue)
{
int r = ((hexValue >> 11) & 0x1F); // Extract the 5 R bits
int g = ((hexValue >> 5) & 0x3F); // Extract the 6 G bits
int b = ((hexValue) & 0x1F); // Extract the 5 B bits
r = ((r * 255) / 31) - 4;
g = ((g * 255) / 63) - 2;
b = ((b * 255) / 31) - 4;
printf("r: %d, g: %d, b: %d\n",r, g, b);
}
int main()
{
//50712=0xC618
hexToRGB(50712);
return 0;
}
上面的例子产生的
r: 193, g: 192, b: 193
应该是 r: 192, g: 192, b: 192
我一直在使用 this 问题作为引用,但我基本上需要一个向后解决他们所问的问题。 最佳答案
以下情况如何:
unsigned r = (hexValue & 0xF800) >> 8; // rrrrr... ........ -> rrrrr000
unsigned g = (hexValue & 0x07E0) >> 3; // .....ggg ggg..... -> gggggg00
unsigned b = (hexValue & 0x1F) << 3; // ............bbbbb -> bbbbb000
printf("r: %d, g: %d, b: %d\n", r, g, b);
这应该导致 0xC618 --> 192, 192, 192,但 0xFFFF --> 248, 252, 248,即不是纯白色。
如果您希望 0xFFFF 为纯白色,则必须进行缩放,因此
unsigned r = (hexValue & 0xF800) >> 11;
unsigned g = (hexValue & 0x07E0) >> 5;
unsigned b = hexValue & 0x001F;
r = (r * 255) / 31;
g = (g * 255) / 63;
b = (b * 255) / 31;
然后0xC618 --> 197, 194, 197,而不是预期的192, 192, 192,但是0xFFFF是纯白色,0x0000是纯黑色。
关于c++ - 如何在 C++ 中将 16 位十六进制颜色转换为 RGB888 值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38557734/