我不知道散列是否是正确的词,但我想将一个字符串半随机转换为十六进制或argb颜色.
我使用了string.GetHasCode函数,但结果偏向于绿色:
string[] list = { "Test String", "something else", "Test Hooray" };
foreach (string k in list)
{
string x = k.ToUpper().GetHashCode().ToString("X8");
Console.WriteLine("#" + x.Substring(0,6));
}
Run Code Online (Sandbox Code Playgroud)
理想情况下,我喜欢以类似前缀开头的字符串,以使颜色大不相同.例如,"Test String"和"Test Hooray"应该完全不同,因为它们都以"Test"开头.
我并不担心绝对的解决方案,我只想要一些足够好的东西.列表[]一次最多只有10个元素,大部分时间只有2,3或4.这意味着颜色必须与2或3种其他颜色不同.
我基本上生成一个可视列表,颜色引用名称,但名称应始终映射到相同的颜色.
编辑:示例输出:
#66BD44
#7EC83E
#95E4FE
Run Code Online (Sandbox Code Playgroud)
颜色:http://www.colorcombos.com/combotester.html? color0 = 66BD44&color1 = 7EC83E&color2 = 95E4FE&color3 = 000316
Nat*_*lch 27
创建字符串的MD5哈希值,并将前三个字节分别作为红色,绿色和蓝色组件.
以下演示可生成合理的颜色分布.
var words = ("She sells sea shells on the sea shore but the sea " +
"shells she sells are sea shells no more.").Split(' ');
var md5 = MD5.Create();
var box = new ListBox
{
Dock = DockStyle.Fill,
DrawMode = DrawMode.OwnerDrawFixed
};
box.Items.AddRange(words);
box.DrawItem += (sender, e) =>
{
var value = (string) box.Items[e.Index];
var hash = md5.ComputeHash(Encoding.UTF8.GetBytes(value));
var color = Color.FromArgb(hash[0], hash[1], hash[2]);
using (var backBrush = new SolidBrush(color))
using (var foreBrush = new SolidBrush(e.ForeColor))
{
e.Graphics.FillRectangle(backBrush, e.Bounds);
e.Graphics.DrawString(value, e.Font, foreBrush, e.Bounds);
}
e.DrawFocusRectangle();
};
new Form {Controls = {box}}.ShowDialog();
Run Code Online (Sandbox Code Playgroud)
