将实际RGB值与Dictionary中的RGB值进行比较

时间:2019-02-09 20:50:43

标签: c# .net rgb

我有一本字典,里面有2种颜色:

private Dictionary<string, Color> someColours = new Dictionary<string, Color>()
    {
        {"red", Color.FromArgb(255,0,0) },
        { "purple",Color.FromArgb(100,100,100) }
    };

我有一个颜色变量imageColour,它代表RGB值(100,100,100)

我想根据RGB值找出字典中哪种颜色最接近我的颜色imageColour

这是我想出的,但是每次我获得所有3个RGB的0值时。

//Compare values
    public Color CompareColours()
    {
        var imageColour = AverageColour();

        int a = 0;
        int c = 0;
        int d = 0;

        //check if Dictionary contains 'Color' type value

        if (someColours.OfType<Color>().Any())
         {  //Loop over dictionary
            foreach (var setColors in someColours.Values)
            { //Compare both values
              if(setColors.ToArgb().Equals(imageColour.ToArgb()))
                {
                    Color testColr = setColors;
                    a = a + testColr.R;
                    c += testColr.G;
                    d += testColr.B;
                }
            }
         }
        return Color.FromArgb(a, c, d);
    }

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

我认为您应该利用Linq使用IComparer进行排序的能力,而不是编写自己的算法

IComparer是棘手的部分。其工作是确定一种颜色是“小于”,“等于”还是“大于”另一种颜色。对于您的情况,让我们将“大于”定义为“与参考颜色更相似”。

我已经根据您的代码示例中的比较逻辑编写了一个示例IComparer。我不确定此比较器是否会提供您期望的结果-如果没有,请对其进行修改以满足您的需求。

class ColorDistanceComparer : IComparer<Color>
{
    readonly int referenceColor;

    public ColorDistanceComparer(Color referenceColor)
        => this.referenceColor = referenceColor.ToArgb();

    public int Compare(Color x, Color y)
        => Math.Abs(referenceColor - y.ToArgb()) - Math.Abs(referenceColor - x.ToArgb());
}

一旦写入IComparer,就可以使用它对颜色进行排序。如果按降序对它们进行排序,则“最大”颜色(与图像颜色最相似)将是列表中的第一位。

var bestMatch = _referenceColours
    .OrderByDescending(kvp => kvp.Value, new ColorDistanceComparer(imageColour))
    .Select(kvp => kvp.Key) // Select kvp.Value if you want the Color rather than its name
    .First();