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);
这样处理要比前者效率高很多