我有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问题作为参考,但我基本上需要向后解决他们的问题。
答案 0 :(得分:6)
以下内容如何:
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 - &gt; 192,192,192,但0xFFFF - &gt; 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 - &gt; 197,194,197,而不是预期的192,192,192,但0xFFFF是纯白色,0x0000是纯黑色。
答案 1 :(得分:5)
没有“正确”的方法可以将RGB565转换为RGB888。每个颜色分量需要从5位或6位范围缩放到8位范围,并且有不同的方法来执行此操作,每种方法通常会在图像中产生不同类型的视觉伪像。
当缩放n位范围内的颜色时,我们可能会认为我们希望以下内容通常为真:
00000
)必须映射到8位空间中的绝对黑色; 11111
)必须映射到8位空间中的绝对白色; 实现这意味着我们基本上希望将n位空间中的(2 n - 1)色调的值缩放为8中的(2 8 - 1)色调。位空间。也就是说,我们希望以某种方式有效地执行以下操作:
r_8 = (255 * r / 31)
g_8 = (255 * g / 63)
b_8 = (255 * b / 31)
经常采取的不同方法是:
后一种方法实际上是以下
r_8 = (r << 3) | (r >> 2)
g_8 = (g << 2) | (g >> 4)
b_8 = (b << 3) | (b >> 2)
对于5位值11000
,这些将导致8位值:
11000000 | 110
)类似地,您的六位值110000
将导致8位值:
11000000 | 11
)