在颜色列表中查找“最大”或“最小”颜色?

时间:2014-01-09 21:26:22

标签: c# list graphics colors bitmap

我有一个默认的C#对象列表。它们都是RGB格式,这意味着,对于黑色,例如,看起来像0, 0, 0。是否有可能找到此列表的“最大”和“最小”值?我的意思是,在这个颜色列表中找到最不强烈或最强烈的颜色,有点像整数列表中的list.Maximum。试图谷歌没有给我任何东西,尝试使用Intellisense只给了我这些选择:

enter image description here

2 个答案:

答案 0 :(得分:1)

如果您为每种颜色计算此值并采用具有最高值的颜色,则结果为:

var intensity = (0.2125 * R) + (0.7154 * G) + (0.0721 * B);

使用Color个对象列表找到最大值,如下所示:

var cs = new List<Color> { Color.Red, Color.Black };
var max = cs.OrderByDescending(x => (0.2125 * x.R) + (0.7154 * x.G) + (0.0721 * x.B)).First();

答案 1 :(得分:0)

Interactive Extensions(以及其他几个库)包含一个MaxBy()函数,可以让您找到具有指定函数的maxiumum值的颜色。

例如,要在列表中找到最蓝色的颜色:

// Update: Forgot MaxBy returns a list of all elements with the max value
var bluest = colors.MaxBy(c => c.B)[0];

或者,如果您不想使用其实施,则可以MaxBy()实施Aggregate()

public static T MaxBy<T, R>(this IEnumerable<T> seq, Func<T, R> selector)
    where R : IComparable
{
    return seq.Aggregate((x, y) =>
                         selector(x).CompareTo(selector(y)) < 0 ? y : x);
}

如果seq很大,则效果优于排序,即O(n lg n)