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

Ben*_*min 3 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;
}
Run Code Online (Sandbox Code Playgroud)

上面的例子r: 193, g: 192, b: 193应该是r: 192, g: 192, b: 192我一直在使用这个问题作为参考,但我基本上需要一个向后解决他们所要求的问题.

Rud*_*uis 7

关于以下内容:

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);
Run Code Online (Sandbox Code Playgroud)

这应该导致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;
Run Code Online (Sandbox Code Playgroud)

然后是0xC618-> 197、194、197,而不是预期的192、192、192,但是0xFFFF是纯白色而0x0000是纯黑色。


don*_*mus 5

没有"正确"的方法可以将RGB565转换为RGB888.每个颜色分量需要从5位或6位范围缩放到8位范围,并且有不同的方法来执行此操作,每种方法通常会在图像中产生不同类型的视觉伪像.

在n位范围内缩放颜色时,我们可能会认为我们希望以下内容通常为真:

  • 绝对黑色(例如00000在5位空间中)必须映射到8位空间中的绝对黑色;
  • 绝对白色(例如11111在5位空间中)必须映射到8位空间中的绝对白色;

实现这一点意味着我们基本上希望将n位空间中的(2 n - 1)个阴影的值缩放到8位空间中的(2 8 - 1)个阴影中.也就是说,我们希望以某种方式有效地执行以下操作:

r_8 = (255 * r / 31)
g_8 = (255 * g / 63)
b_8 = (255 * b / 31)
Run Code Online (Sandbox Code Playgroud)

经常采用的不同方法是:

  • 使用整数除法进行缩放
  • 使用浮动除法然后舍入
  • 位移到8位空间并添加最高有效位

后一种方法实际上如下

r_8 = (r << 3) | (r >> 2)
g_8 = (g << 2) | (g >> 4)
b_8 = (b << 3) | (b >> 2)
Run Code Online (Sandbox Code Playgroud)

对于您的5位值,11000这些将导致8位值:

  • 197
  • 197
  • 198(11000000 | 110)

类似地,您的六位值110000将导致8位值:

  • 194
  • 194
  • 195(11000000 | 11)