本文图片比对采用的是byte* ptr = (byte*)(bmpData.Scan0); 获取图像数据根位置的指针,然后用bmpData.Scan0获取图像的扫描宽度,就可以进行指针操作了。代码如下:
/// <summary> /// 指针法 /// </summary> /// <param name="curBitmap"></param> private unsafe void PointerFun(Bitmap curBitmap) { int width = curBitmap.Width; int height = curBitmap.Height; Rectangle rect = new Rectangle(0, 0, curBitmap.Width, curBitmap.Height); System.Drawing.Imaging.BitmapData bmpData = curBitmap.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite,PixelFormat.Format24bppRgb );//curBitmap.PixelFormat byte temp = 0; int w = bmpData.Width; int h = bmpData.Height; byte* ptr = (byte*)(bmpData.Scan0); for (int i = 0; i < h; i++) { for (int j = 0; j <w; j++) { temp = (byte)(0.299 * ptr[2] + 0.587 * ptr[1] + 0.114 * ptr[0]); ptr[0] = ptr[1] = ptr[2] = temp; ptr +=3; //Format24bppRgb格式每个像素占3字节 } ptr += bmpData.Stride - bmpData.Width * 3 ;//每行读取到最后“有用”数据时,跳过未使用空间XX } curBitmap.UnlockBits(bmpData); }