Как указать диапазон значений RGB в C # - PullRequest
3 голосов
/ 16 января 2012

В форме у меня есть PictureBox, кнопка для загрузки изображения в поле для картинок и несколько дополнительных кнопок для выполнения некоторых операций с изображением, загруженным в поле для изображения.

Я загружаю растровое изображение в поле для картинок, а затем хочу выполнить некоторую операцию с диапазонами пикселей от rgb(150,150,150) до rgb(192,222,255) загруженного изображения.

  • Можно ли сделать это, используя метод SetPixel?
  • Есть ли способ указать диапазон значений RGB в C #?

Ответы [ 3 ]

5 голосов
/ 16 января 2012

Простой способ будет выглядеть примерно так:

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 перемещать его по памяти) и позволить себе быстрый небезопасный доступ к отдельным байтам .

1 голос
/ 16 января 2012

Просмотрите ваш picturebox ang, используйте GetPixel , чтобы получить свой пиксель, проверьте, находится ли пиксель rgb в диапазоне, и используйте SetPixel , чтобы изменить пиксель.

0 голосов
/ 17 января 2012

GetPixel / SetPixel подход (предложенный в предыдущих ответах) должен работать правильно, НО это очень медленно, особенно если вы хотите проверить каждый пиксель в большом изображении.

Если вы хотите использовать более эффективный метод, вы можете попробовать небезопасный код .Это кажется немного сложнее, но если вы работали с указателями раньше, это не должно быть проблемой.Дополнительную информацию об этом методе можно найти в других вопросах о StackOverflow, таких как: Небезопасный доступ на пиксель, 30 мс для 1756000 пикселей или поиск цвета на изображении в c # .

...