c++ - 如何在 C++ 中将 16 位十六进制颜色转换为 RGB888 值

标签 c++ colors

我有 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/

相关文章:

c++ - 如果返回类具有析构函数,则忽略 gnu::warn_unused_result 属性

.net - 计算 PDF 上的 CMYK 覆盖率

wpf - 绑定(bind)颜色资源?

c# - 反转矩形下的 1bbp 颜色

c# - 如何生成彩色图像的直方图?

javascript - 使用 "If statement"获取 Javascript 中彩色文本的值

C++ 线程错误 : pointer being freed was not allocated

c++ - 如果未使用 CloseHandle 正确关闭,则重新打开串行端口会失败

c++ - AVX2:计算 512 个 float 组的点积

c++ - 递归结构的 vector 存在内存问题