如何在C++中将16位十六进制颜色转换为RGB888值
How to convert 16 bit hex color to RGB888 values in C++
我有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: %dn",r, g, b);
}
int main()
{
//50712=0xC618
hexToRGB(50712);
return 0;
}
上面的例子产生了r: 193, g: 192, b: 193
,应该是r: 192, g: 192, b: 192
我一直在用这个问题作为参考,但我本质上需要一个向后的解决方案来解决他们的问题。
以下内容如何:
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: %dn", r, g, b);
这将导致0xC618->1922192,但0xFFFF->24825248,即不是纯白。
如果你想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->197194197,而不是预期的192192192,但0xFFFF是纯白,0x0000是纯黑。
没有"正确"的方法将RGB565比例转换为RGB888。每个颜色分量需要从其5位或6位范围缩放到8位范围,并且有不同的方法来实现这一点,每个方法通常在图像中产生不同类型的视觉伪影。
当在n位范围内缩放颜色时,我们可能会决定希望以下内容大致正确:
- 绝对黑色(例如5位空间中的
00000
)必须映射到8位空间中绝对黑色 - 绝对白色(例如5位空间中的
11111
)必须映射到8位空间中绝对白色
实现这一点意味着我们基本上希望将值从n位空间中的(2n-1)阴影缩放到8位空间中(28-1)阴影。也就是说,我们希望以某种方式有效地做到以下几点:
r_8 = (255 * r / 31)
g_8 = (255 * g / 63)
b_8 = (255 * b / 31)
通常采用的不同方法有:
- 使用整数除法缩放
- 使用浮动除法然后取整进行缩放
- 将位移位到8位空间并添加最高有效位
后一种方法实际上是以下
r_8 = (r << 3) | (r >> 2)
g_8 = (g << 2) | (g >> 4)
b_8 = (b << 3) | (b >> 2)
对于5位值11000
,这将导致8位值:
- 197
- 197
- 198(
11000000 | 110
)
类似地,您的6位值110000
将产生8位值:
- 194
- 194
- 195(
11000000 | 11
)
相关文章:
- 将"打开的CV图像"中的"颜色"转换为整数格式
- GLSL 将 uint 转换为浮点颜色
- 颜色到灰度转换
- Qmage:使用颜色表从灰度转换为RGB
- OpenCV将一种颜色转换为任何其他颜色
- 从RGB到YUV(YCoCg)的颜色转换
- 如何将每个顶点的颜色转换为时间或某些功能
- 将RGB颜色图像转换为OpenCV C 中的索引颜色图像类型
- 如何将cv::Mat转换为带有颜色的pcl::点云
- 将整数转换为位图颜色 RGB 值 C++
- 将 32bpp 位图转换为 256 种颜色
- 将颜色图像转换为OpenCV中的灰度问题
- 在open cv中,我如何将灰度图像转换回RGB图像(颜色)
- 将任何彩色PPM图像转换为只有8种颜色的彩色图像
- 处理 RGB 到 CIEL*a*b* 到 RGB "Out-of-Gamut"颜色转换
- 将不同颜色的2D阵列最佳地转换为单一颜色
- 将双rgba颜色值转换为十六进制字符
- 为什么多次将RGB888转换为RGB565会导致颜色损失
- 使用 cvtColor 转换单一颜色
- 如何在 c++ 中将十六进制整数转换为字符串(适用于 html 颜色)