我想用C#编写代码来构建表,将每个UNICODE代码转换为RGB颜色值。 我使用UTF-16。 这个表有三列,一列用于字符或符号或数字,另一列用于它的UNICODE代码,另一列用于1600万种颜色之一 谁能建议一个简单的方法来做到这一点?
答案 0 :(得分:2)
如果忽略组合字符等,则每个Unicode代码点为16位。 RGB是一个24位空间,使用一个字节表示红色,一个字节表示绿色,一个字节表示蓝色。显然你不能用16位代码做到这一点。所以你要做的就是使用,例如红色为5位,绿色为5位,蓝色为6位。这是一种方法。
说你给了一个字符串:
const string foo = "Hello, world.";
// rrrr rggg ggbb bbbb
const int RedMask = 0xF8;
const int GreenMask = 0xF8;
const int BlueMask = 0xFC;
const int RedShift = 8;
const int GreenShift = 3;
const int BlueShift = 2;
foreach (var c in foo)
{
int val = c;
int r = (val >> RedShift) & RedMask;
int g = (val >> GreenShift) & GreenMask;
int b = (val << BlueShift) & BlueMask;
// now create a color
Color clr = Color.FromArgb(r, g, b);
// and do something with it.
}
此代码对每种颜色使用高5位(蓝色为6位),与使用低位相比,它会有更多区别。
没有什么能像你一样强迫你使用5,5,6。您可以将它设为5,6,5或6,5,5或3,8,5,或任何您想要的r / g / b组合。您所要做的就是改变班次和补偿。
也就是说,对于典型的英文文本,颜色会非常相似。你可以做其他有趣的事情,虽然他们会做更多的工作。例如,您可以将蓝色分量设置为位0,3,6,9,12和15的组合。绿色将是位1,4,7,10和13.红色将是位2,5, 8,11和14.这将区分非常接近的字符。
但是,这个想法保持不变:从Unicode值中选择特定位并使用它们构建红色,绿色和蓝色组件。