如何在C#中指定RGB值范围

时间:2012-01-16 17:50:45

标签: c# .net visual-studio-2008 .net-3.5

在表格上我有一个PictureBox,一个用于在图片框中加载图片的按钮以及几个按钮,用于对装入图片框的图像进行一些操作。

我将位图图像加载到图片框中,然后我想对加载图像的rgb(150,150,150)rgb(192,222,255)的像素范围执行一些操作。

  • 是否可以使用SetPixel方法执行此操作?
  • 有没有办法在C#中指定一系列RGB值?

3 个答案:

答案 0 :(得分:5)

简单的方法就是这样:

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);
}

但是,对于较大的位图大小,GetPixelSetPixel变得非常慢。因此,在您实现算法后,如果感觉很慢,您可以使用Bitmap.LockBits方法固定位图(防止GC在内存中移动它)并允许自己快速不安全地访问单个字节。

答案 1 :(得分:1)

循环使用picturebox ang GetPixel来获取像素,检查像素rgb是否在范围内,并使用SetPixel修改像素。

答案 2 :(得分:0)

GetPixel / SetPixel 方法(在之前的答案中建议)应该可以正常工作,但它非常慢,特别是如果你想检查大图像中的每个像素。 / p>

如果您想使用更有效的方法,可以尝试使用不安全代码。它似乎有点复杂,但如果你之前使用过指针,那应该不是问题。 您可以在StackOverflow的其他问题中找到有关此方法的更多信息,例如:Unsafe Per Pixel access, 30ms access for 1756000 pixelsfind a color in an image in c#