在表格上我有一个PictureBox
,一个用于在图片框中加载图片的按钮以及几个按钮,用于对装入图片框的图像进行一些操作。
我将位图图像加载到图片框中,然后我想对加载图像的rgb(150,150,150)
到rgb(192,222,255)
的像素范围执行一些操作。
SetPixel
方法执行此操作?答案 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);
}
但是,对于较大的位图大小,GetPixel
和SetPixel
变得非常慢。因此,在您实现算法后,如果感觉很慢,您可以使用Bitmap.LockBits
方法固定位图(防止GC在内存中移动它)并允许自己快速不安全地访问单个字节。
答案 1 :(得分:1)
答案 2 :(得分:0)
GetPixel / SetPixel 方法(在之前的答案中建议)应该可以正常工作,但它非常慢,特别是如果你想检查大图像中的每个像素。 / p>
如果您想使用更有效的方法,可以尝试使用不安全代码。它似乎有点复杂,但如果你之前使用过指针,那应该不是问题。 您可以在StackOverflow的其他问题中找到有关此方法的更多信息,例如:Unsafe Per Pixel access, 30ms access for 1756000 pixels或find a color in an image in c#。