-3

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

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

四个零每个都可以代表我见过的 0 到 15。

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

但我一生无法弄清楚如何将 (R:100; G:35; B:42) 转换为 unicode 值。

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

谢谢。

4

3 回答 3

7

我知道你在找什么。你只是问错了方式。您的意思是一个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)

显然,信息在这个过程中丢失了。您只是获取颜色的最重要部分并使用它。这就像有损压缩,但当您没有注意到色彩清晰度的损失时,它对于视频来说非常好。绿色获得额外位的原因是因为人眼对该光谱中的颜色更敏感。

于 2013-09-19T22:19:16.717 回答
1

终于找到了一个包含解决方案的随机示例。这需要一个 COLORREF 并为 TRIVERTEX 结构提取 16 位颜色:

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

于 2013-09-21T14:53:42.413 回答
0

如果这就是您所要求的,那么在 Windows API 中会产生误导,对于 TRIVERTEX 结构中的每个通道,RGBA 所有“COLOR16”引用都应存储为字节 [0-255]。虽然我见过大多数使用 8 位的短值

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

微软:你能说什么

于 2020-11-07T17:51:19.817 回答