指针法
这个方法和内存法相似,开始都是通过LockBits方法来获取位图的首地址,这个方法更简洁,直接用指针进行位图操作。所以对内存的操作需要在unsafe下进行操作。
if (bitmap != null) { newbitmap = bitmap.Clone() as Bitmap; Rectangle rect = new Rectangle(0, 0, newbitmap.Width, newbitmap.Height); System.Drawing.Imaging.BitmapData bmpdata = newbitmap.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, newbitmap.PixelFormat); byte temp; unsafe { byte* ptr = (byte*)(bmpdata.Scan0); for (int x = 0; x < bmpdata.Width; x++) { for (int y = 0; y < bmpdata.Height; y++) { temp = (byte)(0.299 * ptr[2] + 0.587 * ptr[1] + 0.114 * ptr[0]); ptr[0] = ptr[1] = ptr[2] = temp; ptr += 3; } ptr += bmpdata.Stride - bmpdata.Width * 3; } } newbitmap.UnlockBits(bmpdata); pictureBox1.Image = newbitmap.Clone() as Image; } |
3种方法的比较
比较一下可以得出结论,提取像素法比较简单,但是效率比较低;内存法效率有了很大的提高,但是代码比较复杂;指针法效率比内存法更高一些,但是不安全。综上比较结果内存法比较好,效率即高又能发挥C#安全的优点。