代码之家  ›  专栏  ›  技术社区  ›  Shimmy Weitzhandler 500 - Internal Server Error

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

  •  2
  • Shimmy Weitzhandler 500 - Internal Server Error  · 技术社区  · 14 年前

    SolidColorBrush 这是每个产品所独有的。

    更新

    我需要这些颜色是坚实和独特的,或至少是在一个独特的方式排序,也就是说,不应该有黑色,蓝色,绿色,因为这3种颜色可以相互混淆。此外,它应该是黑色,红色,蓝色等。

    公式必须为:

    1. 再以乒乓球交替方式(暗光暗光等)与透水组订购。
    2. 我刚刚注意到有一个很酷的功能: Color.AreClose ,它可能有用,但我仍然不知道如何实现它。
    3. 我相信你有更多的想法。

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

    4 回复  |  直到 7 年前
        1
  •  1
  •   Peter O. Manuel Pinto    7 年前

    有一个粗糙的 color difference formula 在W3C网站的工作草案中建议:

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

    颜色亮度的范围 差别是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);
    }
    
        2
  •  2
  •   nomail    14 年前

    你可以创建一个函数,基于某种种子返回颜色。然后只需在xaml中绑定项目backcolor。例如,种子可以只是一个普通字节,它将取R(RGB的值)并加上+10。问题是你需要提供更多的信息。像Akelle一样,他问颜色是否必须好看,两个彼此接近的项目是否需要两种真正不同的颜色,或者类似的东西(例如RGB(128128)和(128129))。还有可以有多少个项目?

        3
  •  2
  •   Dan Bryant    14 年前


    编辑:

    有关色调的技术概述,请参见 this article

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

        4
  •  0
  •   Shimmy Weitzhandler 500 - Internal Server Error    14 年前

    最适合我的是:

    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)))