【问题标题】:Generate color from Guid从 Guid 生成颜色
【发布时间】:2012-08-08 07:57:40
【问题描述】:

我的数据库中有各种对象,由唯一的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都有自己独特的颜色。我只是在寻找一个好的品种。

【问题讨论】:

  • 我认为 Guid 是 36 个字符。红色的前 12 个字符,绿色的第二个 12 个字符,蓝色的第三个 12 个字符。将这 12 个字符转换为 int。并以此值产生随机数 0-255。
  • @LarsTech 所述数组中可能有数万亿个条目。这似乎有点低效......

标签: c# colors guid


【解决方案1】:

这样的事情怎么样:

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 每次都会产生相同的颜色。

【讨论】:

  • 而不是.Select(b => (int)b),你不能用.Cast<int>()吗?
  • @codesparkle:在 LINQPad 中获得InvalidCastException。我懒得运行 Visual Studio。
  • 确实,VS中的结果相同,因为Cast<T>boxes the items in the input sequence
【解决方案2】:

你可以这样做:

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

如果您需要不透明的颜色,请使用the overload of Color.FromArgb,它可以让您指定 alpha。如果您希望相似的 GUID 生成非常不同的颜色,您可以在 Guid 上执行不同类型的哈希,例如an MD5 hash,然后获取生成颜色的数字。

【讨论】:

    【解决方案3】:

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

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

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

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

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

    【讨论】:

      【解决方案4】:

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

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

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

      也许并不完美,但最简单。

      【讨论】:

        【解决方案5】:

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-09-24
          • 1970-01-01
          • 1970-01-01
          • 2017-05-28
          • 2011-03-31
          • 1970-01-01
          • 2011-03-11
          相关资源
          最近更新 更多