『QQ:1353814576』

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

这样处理要比前者效率高很多