我必须在一些不透明的矩形区域中画一些任意的字符串。
我需要这些区域的背景色对于给定的字符串是唯一的。
如果我画“巴黎”和“巴黎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 33x 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/

10-17 01:20