/// <summary> /// 内存转换法 /// </summary> /// <param name="img"></param> public static Bitmap GrayByMemory(Bitmap bmp) { if (bmp == null) return bmp; //位图矩形 Rectangle bmpRect = new Rectangle(0, 0, bmp.Width, bmp.Height); //以可读写的方式锁定全部位图像素 BitmapData bmpData = bmp.LockBits(bmpRect, ImageLockMode.ReadWrite, bmp.PixelFormat); //得到首地址 IntPtr ptr = bmpData.Scan0; //获取位图的总字节数 int bytes = bmpData.Stride * bmp.Height; //定义出位图数组 byte[] rgbValues = new byte[bytes]; //把锁定的像素复制到数组内 Marshal.Copy(ptr, rgbValues, 0, bytes); //灰度化 double grayColor = 0; //逐行扫描 for (int y = 0; y < bmpData.Height; y++) { //只处理每行中图像像素的数据,舍弃未用空间 for (int x = 0; x < bmpData.Width * 3; x += 3) { grayColor = rgbValues[y * bmpData.Stride + x + 2] * 0.299 + rgbValues[y * bmpData.Stride + x + 1] * 0.587 + rgbValues[y * bmpData.Stride + x] * 0.114; rgbValues[y * bmpData.Stride + x] = rgbValues[y * bmpData.Stride + x + 1] = rgbValues[y * bmpData.Stride + x + 2] = (byte)grayColor; } } //把数据复制会位图 Marshal.Copy(rgbValues, 0, ptr, bytes); //解锁位图像素 bmp.UnlockBits(bmpData); return bmp; }