我必须在一些不透明的矩形区域中画一些任意的字符串。
我需要这些区域的背景色对于给定的字符串是唯一的。
如果我画“巴黎”和“巴黎1”,它们的颜色应该是不同的。但如果我用蓝色画“巴黎”,彼此的“巴黎”也应该用蓝色画。
我再次强调颜色应该是不透明的。
为此,我找到了一个简单的解决方案:
rectangleBackColor = Color.FromArgb(myString.GetHashCode())
问题是不透明。我需要“消除”α分量。
现在,这样的代码可以工作了
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());
所以,如果你把上面progam生成的所有字符串都给了then颜色,那么你必须至少有5个具有重复颜色的字符串。
顺便说一下,GetHashCode不返回唯一值,只是均匀分布,用32位重复上面的证明(您需要在for循环uint中设置i并将数字更改为4294967295以上但这些是唯一的更改),并且您发现不能在32位值(或任何其他固定大小值)中为每个字符串获取唯一值。
你的方法很好,重复的颜色可能很少。
关于.net - 从字符串生成唯一的颜色,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6594672/