我的数据库中有各种对象,由唯一System.Guid's
标识。当我展示它们时,我希望它们中的每一个都能根据它们的guid来获得独特的颜色。
所以我想要这样的事情:
public Color ColorFromGuid(Guid guid) { /* ?? */ }
其中
ColorFromGuid(databaseObject1.Guid) == ColorFromGuid(databaseObject1.Guid)
ColorFromGuid(databaseObject2.Guid) == ColorFromGuid(databaseObject2.Guid)
ColorFromGuid(databaseObject1.Guid) != ColorFromGuid(databaseObject2.Guid)
最好的方法是什么?
编辑显然有 WAY 比颜色更独特的guid,所以每个guid都没有办法拥有它自己独特的颜色。我只是在寻找一个好的品种。
答案 0 :(得分:3)
这样的事情怎么样:
public Color ColorFromGuid(Guid guid)
{
var values = guid.ToByteArray().Select(b => (int)b);
int red = values.Take(5).Sum() % 255;
int green = values.Skip(5).Take(5).Sum() % 255;
int blue = values.Skip(10).Take(5).Sum() % 255;
Color color = Color.FromArgb(red, green, blue);
return color;
}
这可能不太理想,但每个GUID都会获得一种颜色,每次相同的GUID应该会产生相同的颜色。
答案 1 :(得分:3)
你可以这样做:
return Color.FromArgb(guid.GetHashCode());
如果您需要不透明的颜色,请使用the overload of Color.FromArgb
来指定alpha。如果您希望类似的GUID生成非常不同的颜色,您可以在Guid上执行不同类型的哈希,例如an MD5 hash,并获取从中生成颜色的数字。
答案 2 :(得分:1)
如果您使用某项功能执行此操作,您会感到失望。
Guids比颜色多很多倍,因此很多Guid会映射到相同的颜色。很多时候,Guids会映射到太接近区分的颜色(例如#FFFF9999和#FFFF9998)。实际上,你只能说出一些颜色之间的区别 - 比如50绝对最大值。
Guids不是随机的。请重复一遍:Guids 随机。特别是如果你使用数据库生成的Guids,这可能是所谓的'sequential uniqueidentifiers',其中Guid的前半部分是相同的。这是否意味着你的每一个Guids都会以不同的粉红色结束?也许
因此,除非您知道Guids的分布并且能够创建将该分布映射到合适颜色分布的函数,否则您将对函数生成的颜色感到满意。
以可扩展的方式执行此操作的最简单方法是在数据库中创建一个包含两列的简单表 - 颜色(名称,十六进制代码或RGB值)和一个Guid。这样做最耗时的部分就是选择颜色。这允许您更改特定项目的颜色,如果它与另一种颜色太相似。没有技巧,只是简单的映射。
答案 3 :(得分:1)
如果您需要HTML颜色,可以使用此颜色或类似颜色:
cssColorcode = "#" + myguid.Substring(0, 6);
// result can be something like: #ab3fa4
Guid有点像六角形,Html css颜色代码可以用类似的格式表示。
也许不完美,但最简单。
答案 4 :(得分:0)
我在我的一些应用程序中使用了类似下面的内容。
Color = Color.ParseColor("#" + (Guid.NewGuid().ToString()).Substring(0, 6));
从 GUID 中取出前 6 个字符并将其解析为十六进制颜色代码。