这是一个令人头痛的问题。我搜索了一切,发现很少,对unicode知之甚少,从搜索中学到了一点。我需要的是非常简单的,对吧?我正在使用的结构需要COLOR16。
所以我知道0x0000和0x00FF是0到255,这对COLOR16来说是没用的。
我看到的每个可以代表0到15的四个零。
我知道COLOR16代表所有16 ^ 4种颜色。
但我不能为我的生活弄清楚如何将说(R:100; G:35; B:42)转换为unicode值。
我真的可以使用这方面的一些信息,或教程或任何东西。
感谢。
答案 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]; <=字节
微软:您能说什么