为每个字符串生成特定颜色?

时间:2010-08-30 21:21:36

标签: wpf colors

我有一个显示属于产品的订单的DataGrid。

我希望每个产品都有一个独特的生成SolidColorBrush

更新

我需要这些颜色是坚实和独特的,或者至少要以独特的方式进行排序,即不应该有黑色,蓝色,绿色,因为这3种颜色可能会相互混淆。此外它应该是黑色,红色,蓝色等。

公式必须是:

  1. 将所有颜色分组为主要颜色的子组
  2. 按黑暗命令
  3. 再次与透水组一起订购乒乓球交替方式(暗光暗光等)。
  4. 我刚注意到有一个很酷的功能:Color.AreClose,它可能很有用,我还是不知道如何实现它。
  5. 我相信你有更多想法。
  6.   

    相关:Is there a .NET list of 256 colors only?

4 个答案:

答案 0 :(得分:2)

你可以创建一个基于某种种子返回颜色的函数。然后在xaml中绑定项目backcolor。种子可以是例如将采用R(RGB)并添加+10的普通字节。问题是你需要提供更多信息。就像akellehe询问颜色是否看起来不错一样,两个彼此接近的物品是否需要两种真正不同的颜色或类似的东西(例如RGB(128,128,128)和(128,128,129))。还有多少项目?

答案 1 :(得分:2)

根据色调,饱和度和值来考虑颜色可能会有所帮助。现在,您可以在Hue和Value中考虑不同的采样函数,例如,生成颜色。例如,您可以在Hue中递增,然后在不同的值处重复以获得相同颜色的较暗版本。您还可以在交替的Value位置偏移您的Hue,以获得额外的颜色变化。为了获得最佳效果,您可能希望在采样过程中交替使用“暖色”和“冷色”(有利于红色而不是青色)。


编辑:

有关Hue的技术概述,请参阅this article了解转化HSV< - > RGB。它们有点尴尬,因为HSV通常被解释为锥形,其色调被视为围绕法线轴的角度。它是这样构造的,因为一旦你达到V = 0,色调和饱和度都是未定义的(基本上,黑色是黑色;它没有色调;灰色(垂直轴)也没有色调)为了您的目的,您可以简单地使用方程式(参见“色调和色度”和“转换为RGB”部分)。

一旦你实现了HSV转换,纯色调的最简单的颜色采样就是从0到360 /(N-1)采用色调,其中N是样本数。您可以随意设置饱和度和值; S = 1和V = 1将为您提供最亮,最“丰富多彩”(饱和)的颜色。如果你有太多的点只是简单地在Hue中采样,你可以开始将它与值的变化(对于较暗的颜色)或饱和度(对于更多的去饱和,'灰色'颜色)进行组合。

答案 2 :(得分:1)

在W3C网站的工作草案中提出了粗略的color difference formula

  

色差由   下列公式:(最大值(红色值)   1,红色值2) - 最小值(红色值   1,红色值2))+(最大值(绿色   值1,绿色值2) - 最小值   (绿色值1,绿色值2))+   (最大值(蓝色值1,蓝色值2)    - 最小值(蓝色值1,蓝色值2))

     

ra [n] ge用于颜色亮度   差异是125.颜色范围   差异是500。

还有其他more complex ones,您可能需要获得最佳效果。

然后,您可以在算法中使用该函数,该算法将存储集合中的所有可能颜色,从该集合中选择一种颜色(比如黑色),并将其用作迭代排序的起点。

这既未经过优化也未经过测试,但可能有效:

static List<Color> SortColors(IEnumerable<Color> colors)
{
    var hashed = new HashSet<Color>(colors);
    var sorted = new List<Color>(hashed.Count);

    //Start with black
    var last = hashed.Single(x => x.Red == 0 && x.Green == 0 && x.Blue == 0);
    hashed.Remove(last);
    sorted.Add(last);

    while (hashed.Any())
    {
        //This could of course be optimized by doing these two steps in a single loop
        var bestDiff = hashed
            .Max(x => Difference(x, last));
        var best = hashed.First(x => Difference(x, last) == bestDiff);

        hashed.Remove(best);
        sorted.Add(best);
        last = best;
    }

    return sorted;
}

static int Difference(Color a, Color b)
{
    return Math.Abs(a.Red - b.Red)
        + Math.Abs(a.Green - b.Green)
        + Math.Abs(a.Blue - b.Blue);
}

答案 3 :(得分:0)

最适合我:

Private Shared ReadOnly rndm As New Random
Public Shared ReadOnly m_ColorsList As IEnumerable(Of Color) =
  Enumerable.Range(0, 100).Select(
    Function(i) Color.FromRgb(rndm.Next(256), rndm.Next(256), rndm.Next(256)))

将数字100替换为所需的颜色数量。