Простой способ будет выглядеть примерно так:
for (int i = 0; i < width; i++)
for (int j = 0; j < height; j++)
{
Color c = bitmap.GetPixel(i, j);
if (ColorWithinRange(c))
{
// do stuff
}
}
С ColorWithinRange
, определенным так:
private readonly Color _from = Color.FromRgb(150, 150, 150);
private readonly Color _to = Color.FromRgb(192, 222, 255);
bool ColorWithinRange(Color c)
{
return
(_from.R <= c.R && c.R <= _to.R) &&
(_from.G <= c.G && c.G <= _to.G) &&
(_from.B <= c.B && c.B <= _to.B);
}
Однако для больших размеров растрового изображения GetPixel
и SetPixel
становятся очень медленными. Итак, после того, как вы реализовали свой алгоритм, если он кажется медленным, вы можете использовать метод Bitmap.LockBits
, чтобы закрепить растровое изображение (не позволяйте GC перемещать его по памяти) и позволить себе быстрый небезопасный доступ к отдельным байтам .