我有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);
}
任何帮助将非常感激!
而不是写自己的算法,我想你应该使用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();