比较在字典RGB值实际RGB值

问题描述 投票:0回答:1

我有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);
    }

任何帮助将非常感激!

c# .net rgb
1个回答
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();
© www.soinside.com 2019 - 2024. All rights reserved.