.NET开发Bitmap GetPixel,SetPixel处理太慢的替代解决办法
Bitmap处理图像 GetPixel + SetPixel大图像处理太慢的解决办法
最近做的一些事情和图像识别有关,图像处理这块就必不可免,有时甚至需要对图像每个像素进行处理,对于小图片,使用 Bitmap的方法 GetPixel + SetPixel 还能凑合用,但对于大图像处理来说这个处理效率是真的惨不忍睹。 替代方法如下
string imgPath = @"C:\Users\Administrator\Desktop\123.jpg";
System.Drawing.Bitmap BasicImageBox = new System.Drawing.Bitmap(imgPath);
Rectangle rect = new Rectangle(0, 0, BasicImageBox.Width, BasicImageBox.Height);//创建容器矩阵
System.Drawing.Imaging.BitmapData bmpData =
BasicImageBox.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite,BasicImageBox.PixelFormat);//实例化一个BitmapData
//获取首行地址
IntPtr ptr = bmpData.Scan0;
//定义数组保存位图
int bytes = Math.Abs(bmpData.Stride) * BasicImageBox.Height;
byte[] rgbValues = new byte[bytes];
//复制RGB值到数组
System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, bytes);
byte rgb;
//for (int counter = 2; counter < rgbValues.Length; counter += 3)
for (int counter = 0; counter < rgbValues.Length; counter++)
{
//这里可以针对rgb的值进行处理 像素处理
rgb = rgbValues[counter];
if (rgb < 100)
{
///当该位置rgb值小于100时 将其修改成0
rgbValues[counter] = 0;
}
}
//把RGB数组值拷回位图
System.Runtime.InteropServices.Marshal.Copy(rgbValues, 0, ptr, bytes);
//解锁
BasicImageBox.UnlockBits(bmpData);
这样处理要比前者效率高很多