我必须在一些不透明矩形区域中绘制一些任意字符串。 我需要该区域的背景颜色对于给定的字符串是唯一的。
比如说,如果我画“Paris”和“Paris1”,它们的颜色应该不同。但如果我把“巴黎”画成蓝色,那么其他“巴黎”也应该画成蓝色。
我再次强调,颜色应该是不透明的。
为此我找到了一个简单的解决方案:
rectangleBackColor = Color.FromArgb(myString.GetHashCode())
问题是不透明度。我需要“消除”“A”(alpha)成分。
现在,这样的代码可能会起作用
rectangleBackColor = Color.FromArgb(myString.GetHashCode())
' set the alpha value = 255 for an opaque color '
rectangleBackColor = Color.FromArgb(255, rectangleBackColor)
但它可能会失去字符串颜色的唯一性。
假设,我有两个不同的 hashCode(十六进制)x AB 11 22 33
和 x FF 11 22 33
。
将 AB
设置为 FF
我使两个不同的字符串具有相同的背景颜色 (x FF 11 22 33
)。这不好。
最佳答案
您无法为字符串生成唯一的颜色:
RGB 空间有 24 位或 2^24-1 个唯一值(总共 16777215 种颜色)。
以下代码将打印 16777220 个唯一字符串(比颜色数量多 5 个):
for(int i=0; i<16777220 ; ++i) Console.WriteLine(i.ToString());
因此,如果您采用上面程序生成的所有字符串并给出颜色,则您必须至少有 5 个具有重复颜色的字符串。
顺便说一句,GetHashCode 不返回唯一值,只是均匀分布,用 32 位重复上面的证明(您需要在 for 循环中将 i 设为 uint 并将数字更改为大于 4294967295,但这些是仅更改),并且您发现无法为 32 位值(或任何其他固定大小值)中的每个字符串获取唯一值。
你的方法非常好,重复颜色可能很少见。
关于.net - 从字符串生成唯一的颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6594672/