Сравните два списка цветов
Скажем, у меня есть два списка цветов, и мне нужно их сравнить. У меня есть функция сравнения цветов, но я немного запутался в типах, которые получает функция. Как их отличить?
public bool AreColorsSimilar(Color c1, Color c2, int tolerance)
{
return Math.Abs(c1.R - c2.R) < tolerance &&
Math.Abs(c1.G - c2.G) < tolerance &&
Math.Abs(c1.B - c2.B) < tolerance;
}
Вот мой первый список:
public static List<Color> PaletteOfSeasons()
{
List<Color> springColors = new List<Color>();
springColors.Add(ColorTranslator.FromHtml("#80a44c"));
springColors.Add(ColorTranslator.FromHtml("#b4cc3a"));
return springColors;
}
И в другом списке я вынимаю пиксели из изображения:
public static IEnumerable<Color> GetPixels(Bitmap bitmap)
{
for (int x = 0; x < bitmap.Width; x++)
{
for (int y = 0; y < bitmap.Height; y++)
{
Color pixel = bitmap.GetPixel(x, y);
yield return pixel;
}
}
}
И вопрос в том, как я могу сравнить эти цвета?
Ответы
Ответ 1
Если вы правильно поняли:
var springColors = null;
springColors = PaletteOfSeasons(springColors);
var similarColors = GetPixels(bitmap).Intersect(springColors, new ColorComparer(tolerance));
И вам нужен этот класс:
public class ColorComparer : IEqualityComparer<Color>
{
private _tolerance;
public ColorComparer(int tolerance)
{
_tolerance = tolerance;
}
public bool Equals(Color x, Color y)
{
return AreColorsSimilar(x, y, _tolerance);
}
public int GetHashCode(Foo x)
{
return 0;
}
private bool AreColorsSimilar(Color c1, Color c2, int tolerance)
{
return Math.Abs(c1.R - c2.R) < tolerance &&
Math.Abs(c1.G - c2.G) < tolerance &&
Math.Abs(c1.B - c2.B) < tolerance;
}
}
P.S. Ваш метод PaletteOfSeasons немного запутан. Передача списка в метод глупо.
P.P.S. Используйте Bitmap.LockBits() для повышения производительности кода.
P.P.P.S. Такая реализация GetHashCode не очень хорошая. Но в нашей ситуации все в порядке.
Ответ 2
Просто сравните все пиксели растрового изображения со всеми цветами в палитрах:
foreach(var pixel in GetPixels(myBitmap))
{
foreach(var candidate in paletteOfSeasons)
{
if(AreColorsSimilar(pixel, candidate, 42)
{
// Hooray, found some similar colors.
}
}
}