3

我的数据库中有各种对象,由 unique 标识System.Guid's。当我显示它们时,我希望它们中的每一个都具有基于其指导的独特颜色。

所以我想要这样的东西:

public Color ColorFromGuid(Guid guid) { /* ?? */ }

在哪里

ColorFromGuid(databaseObject1.Guid) == ColorFromGuid(databaseObject1.Guid)
ColorFromGuid(databaseObject2.Guid) == ColorFromGuid(databaseObject2.Guid)
ColorFromGuid(databaseObject1.Guid) != ColorFromGuid(databaseObject2.Guid)

最好的方法是什么?

编辑显然,有比颜色更多的独特指南,所以每个指南都不可能拥有自己独特的颜色。我只是在寻找一个好的品种。

4

5 回答 5

4

你可以这样做:

return Color.FromArgb(guid.GetHashCode());

如果您需要不透明的颜色,请使用可让您指定 alpha的重载。Color.FromArgb如果您希望相似的 GUID 生成非常不同的颜色,您可以在 Guid 上执行不同类型的哈希,例如MD5 哈希,并从中获取生成颜色的数字。

于 2012-08-11T03:21:23.687 回答
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 每次都应该产生相同的颜色。

于 2012-08-11T03:15:32.460 回答
1

如果你用一个函数来做这件事,你会失望的。

Guid 比颜色多很多倍,因此许多 Guid 将映射到相同的颜色。很多时候,更多的 Guid 将映射到过于接近而无法区分的颜色(例如 #FFFF9999 和 #FFFF9998)。实际上,您只能分辨少数颜色之间的区别——比如绝对最大值为 50 种。

向导不是随机的。对自己重复一遍:向导不是随机的。特别是如果您使用数据库生成的 Guid,这可能是所谓的“顺序唯一标识符”,其中 Guid 的前半部分是相同的。这是否意味着您最终会为每个 Guid 获得不同深浅的粉红色?也许。

因此,除非您知道 Guid 的分布并且能够创建一个将该分布映射到合适的颜色分布的函数,否则您不会对函数生成的颜色感到满意。

以可扩展的方式执行此操作的最简单方法是在数据库中创建一个包含两列的简单表 - 颜色(名称、十六进制代码或 RGB 值)和一个 Guid。这样做最耗时的部分将是选择颜色。如果它与另一种颜色过于相似,这允许您更改特定项目的颜色。没有技巧,只是简单的映射。

于 2012-08-11T04:53:03.660 回答
1

如果你需要 HTML 的颜色,你可以使用这个,或者类似的:

cssColorcode =  "#" + myguid.Substring(0, 6); 
// result can be something like: #ab3fa4

Guid 是一种六边形,Html css 颜色代码可以用类似的格式表示。

也许不完美,但最简单。

于 2017-09-12T13:44:32.097 回答
0

我在一些应用程序中使用了类似以下的内容。

Color = Color.ParseColor("#" + (Guid.NewGuid().ToString()).Substring(0, 6));

从 GUID 中获取前 6 个字符并将其解析为 HEX 颜色代码。

于 2021-01-15T14:11:33.543 回答