该函数实现的程序效果如下:
(处理前)
(处理后)
Gray()函数的算法如下:
public static bool Gray(Bitmap b){BitmapData bmData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height),ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);int stride = bmData.Stride;System.IntPtr Scan0 = bmData.Scan0;unsafe{byte * p = (byte *)(void *)Scan0;int nOffset = stride - b.Width*3;byte red, green, blue;for(int y=0;yb.Height;++y){for(int x=0; x b.Width; ++x ){blue = p[0];green = p[1];red = p[2];p[0] = p[1] = p[2] = (byte)(.299 * red + .587 * green + .114 * blue);p += 3;}p += nOffset;}}b.UnlockBits(bmData);return true;}
本函数完成的功能是对图像进行灰度处理,我们的基本想法可是将每个象素点的三种颜色成分的值取平均值。然而由于人眼的敏感性,这样完全取平均值的做法的效果并不好,所以在程序中我取了三个效果最好的参数:.299,.587,.114。不过在这里要向读者指明的是,在GDI+中图像存储的格式是BGR而非RGB,即其顺序为:Blue、Green、Red。所以在for循环内部一定要设置好red、green、blue等变量的值,切不可颠倒。函数执行成功后,同样返回true值。