我有一本字典,里面有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);
}
任何帮助将不胜感激!
答案 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();