Color16值的C ++ Unicode

时间:2013-09-19 22:10:03

标签: c++ unicode

这是一个令人头痛的问题。我搜索了一切,发现很少,对unicode知之甚少,从搜索中学到了一点。我需要的是非常简单的,对吧?我正在使用的结构需要COLOR16。

所以我知道0x0000和0x00FF是0到255,这对COLOR16来说是没用的。

我看到的每个可以代表0到15的四个零。

我知道COLOR16代表所有16 ^ 4种颜色。

但我不能为我的生活弄清楚如何将说(R:100; G:35; B:42)转换为unicode值。

我真的可以使用这方面的一些信息,或教程或任何东西。

感谢。

3 个答案:

答案 0 :(得分:6)

我知道你在找什么。你只是问错了方法。您的意思是short值,而不是Unicode值。这个的通用名称是RGB565。这意味着红色为5位,绿色为6位,蓝色为5位。

最多可增加16位。你打包这样的位:

unsigned short val = ((r<<8) & 0xf800) | ((g<<3) & 0x07e0) | (b>>3);

这些位是这样的:

R  00000000 12345xxx  ->  12345000 00000000  (shift left by 8 and masked)
G  00000000 123456xx  ->  00000123 45600000  (shift left by 3 and masked)
B  00000000 12345xxx  ->  00000000 00012345  (shift right by 3, no mask required)

显然,此过程中丢失了信息。您只需要使用颜色中最重要的部分并使用它。这就像有损压缩,但是当你没有注意到颜色定义的损失时,它对视频非常有用。绿色获得额外位的原因是因为人眼对该光谱中的颜色更敏感。

答案 1 :(得分:0)

最后找到一个随机的例子,里面有解决方案。这需要一个COLORREF并为TRIVERTEX结构提取16位颜色:

vertex[1].Red = GetRValue(clrStart)<<8; vertex[1].Green = GetGValue(clrStart)<<8; vertex[1].Blue = GetBValue(clrStart)<<8;

答案 2 :(得分:0)

如果您要的是Windows API,这是一种误导,对于TRIVERTEX结构中的每个通道,RGBA所有“ COLOR16”引用都应存储为字节[0-255]。尽管我看到大多数人使用的是8位短值

红色[0-255]; <=字节
绿色[0-255]; <=字节
蓝色[0-255]; <=字节
阿尔法[0-255]; <=字节

微软:您能说什么