本文主要通过彩色图象灰度化来介绍C#处理数字图像的3种方法,Bitmap类、BitmapData类和Graphics类是C#处理图像的的3个重要的类。YWEHTML5中文学习网 - HTML5先行者学习网
  Bitmap只要用于处理由像素数据定义的图像的对象,主要方法和属性如下:YWEHTML5中文学习网 - HTML5先行者学习网
  GetPixel方法和SetPixel方法,获取和设置一个图像的指定像素的颜色。YWEHTML5中文学习网 - HTML5先行者学习网
  PixelFormat属性,返回图像的像素格式。YWEHTML5中文学习网 - HTML5先行者学习网
  Palette属性,获取或折纸图像所使用的颜色调色板。YWEHTML5中文学习网 - HTML5先行者学习网
  Height属性和Width属性,返回图像的高度和宽度。YWEHTML5中文学习网 - HTML5先行者学习网
  LockBits方法和UnlockBits方法,分别锁定和解锁系统内存中的位图像素。YWEHTML5中文学习网 - HTML5先行者学习网
  BitmapData对象指定了位图的属性:YWEHTML5中文学习网 - HTML5先行者学习网
  Height属性,被锁定位图的高度。YWEHTML5中文学习网 - HTML5先行者学习网
  Width属性,被锁定位图的宽度。YWEHTML5中文学习网 - HTML5先行者学习网
  PixelFormat属性,数据的实际像素格式。YWEHTML5中文学习网 - HTML5先行者学习网
  Scan0属性,被锁定数组的首字节地址。YWEHTML5中文学习网 - HTML5先行者学习网
  Stride属性,步幅,也称扫描宽度。YWEHTML5中文学习网 - HTML5先行者学习网
  彩色图象灰度化YWEHTML5中文学习网 - HTML5先行者学习网
  24位彩色图象每个像素用3个字节表示,每个字节对应着R、G、B分量的亮度(红、绿、蓝)。当3个分量不想同时表现为灰度图像。下面有三种转换公式:YWEHTML5中文学习网 - HTML5先行者学习网

  Gray(I,j)为转换后的灰度图像在(I,j)点出的灰度值。由于人眼对颜色的感应不同,有了下面的转换公式:YWEHTML5中文学习网 - HTML5先行者学习网

  观察发现绿色所占比重最大,所以转换时直接使用G值作为转换结果:YWEHTML5中文学习网 - HTML5先行者学习网

  图像处理的3种方法分别是:提取像素法、内存法和指针法,它们各自有各自的特点。YWEHTML5中文学习网 - HTML5先行者学习网
  提取像素法YWEHTML5中文学习网 - HTML5先行者学习网
  使用的是GDI+中的Bitmap.GetPixel和Bitmap.SetPixel方法。YWEHTML5中文学习网 - HTML5先行者学习网
                        1YWEHTML5中文学习网 - HTML5先行者学习网             2YWEHTML5中文学习网 - HTML5先行者学习网             3YWEHTML5中文学习网 - HTML5先行者学习网             4YWEHTML5中文学习网 - HTML5先行者学习网             5YWEHTML5中文学习网 - HTML5先行者学习网             6YWEHTML5中文学习网 - HTML5先行者学习网             7YWEHTML5中文学习网 - HTML5先行者学习网             8YWEHTML5中文学习网 - HTML5先行者学习网             9YWEHTML5中文学习网 - HTML5先行者学习网             10YWEHTML5中文学习网 - HTML5先行者学习网             11YWEHTML5中文学习网 - HTML5先行者学习网             12YWEHTML5中文学习网 - HTML5先行者学习网             13YWEHTML5中文学习网 - HTML5先行者学习网             14YWEHTML5中文学习网 - HTML5先行者学习网             15YWEHTML5中文学习网 - HTML5先行者学习网             16 |             if (bitmap  != null)YWEHTML5中文学习网 - HTML5先行者学习网             {YWEHTML5中文学习网 - HTML5先行者学习网                 newbitmap = bitmap.Clone() as Bitmap;YWEHTML5中文学习网 - HTML5先行者学习网                 Color  pixel;YWEHTML5中文学习网 - HTML5先行者学习网                 int ret;YWEHTML5中文学习网 - HTML5先行者学习网                 for (int x = 0; x < newbitmap.Width;  x++)YWEHTML5中文学习网 - HTML5先行者学习网                 {YWEHTML5中文学习网 - HTML5先行者学习网                     for (int y = 0; y < newbitmap.Height;  y++)YWEHTML5中文学习网 - HTML5先行者学习网                     {YWEHTML5中文学习网 - HTML5先行者学习网                         pixel = newbitmap.GetPixel(x,  y);YWEHTML5中文学习网 - HTML5先行者学习网                         ret = (int)(pixel.R * 0.299 + pixel.G * 0.587 + pixel.B *  0.114);YWEHTML5中文学习网 - HTML5先行者学习网                         newbitmap.SetPixel(x, y, Color.FromArgb(ret, ret,  ret));YWEHTML5中文学习网 - HTML5先行者学习网                     }YWEHTML5中文学习网 - HTML5先行者学习网                 }YWEHTML5中文学习网 - HTML5先行者学习网                 pictureBox1.Image = newbitmap.Clone()  as Image;YWEHTML5中文学习网 - HTML5先行者学习网             } |         
    
  内存法YWEHTML5中文学习网 - HTML5先行者学习网
  内存法是把图像数据直接复制到内存中,这样程序的运行速度就能大大提高了。YWEHTML5中文学习网 - HTML5先行者学习网
                        1YWEHTML5中文学习网 - HTML5先行者学习网             2YWEHTML5中文学习网 - HTML5先行者学习网             3YWEHTML5中文学习网 - HTML5先行者学习网             4YWEHTML5中文学习网 - HTML5先行者学习网             5YWEHTML5中文学习网 - HTML5先行者学习网             6YWEHTML5中文学习网 - HTML5先行者学习网             7YWEHTML5中文学习网 - HTML5先行者学习网             8YWEHTML5中文学习网 - HTML5先行者学习网             9YWEHTML5中文学习网 - HTML5先行者学习网             10YWEHTML5中文学习网 - HTML5先行者学习网             11YWEHTML5中文学习网 - HTML5先行者学习网             12YWEHTML5中文学习网 - HTML5先行者学习网             13YWEHTML5中文学习网 - HTML5先行者学习网             14YWEHTML5中文学习网 - HTML5先行者学习网             15YWEHTML5中文学习网 - HTML5先行者学习网             16YWEHTML5中文学习网 - HTML5先行者学习网             17YWEHTML5中文学习网 - HTML5先行者学习网             18YWEHTML5中文学习网 - HTML5先行者学习网             19YWEHTML5中文学习网 - HTML5先行者学习网             20YWEHTML5中文学习网 - HTML5先行者学习网             21YWEHTML5中文学习网 - HTML5先行者学习网             22YWEHTML5中文学习网 - HTML5先行者学习网             23YWEHTML5中文学习网 - HTML5先行者学习网             24 |             if (bitmap  != null)YWEHTML5中文学习网 - HTML5先行者学习网             {YWEHTML5中文学习网 - HTML5先行者学习网                 newbitmap = bitmap.Clone() as Bitmap;YWEHTML5中文学习网 - HTML5先行者学习网                 Rectangle rect  = new Rectangle(0, 0, newbitmap.Width,  newbitmap.Height);YWEHTML5中文学习网 - HTML5先行者学习网                 System.Drawing.Imaging.BitmapData bmpdata =  newbitmap.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite,  newbitmap.PixelFormat);YWEHTML5中文学习网 - HTML5先行者学习网                 IntPtr ptr = bmpdata.Scan0;YWEHTML5中文学习网 - HTML5先行者学习网                 int bytes =  newbitmap.Width * newbitmap.Height * 3;YWEHTML5中文学习网 - HTML5先行者学习网                 byte[] rgbvalues =  new byte[bytes];YWEHTML5中文学习网 - HTML5先行者学习网                 System.Runtime.InteropServices.Marshal.Copy(ptr,  rgbvalues, 0, bytes);YWEHTML5中文学习网 - HTML5先行者学习网                 double colortemp = 0;YWEHTML5中文学习网 - HTML5先行者学习网                 for (int i = 0; i <  rgbvalues.Length; i += 3)YWEHTML5中文学习网 - HTML5先行者学习网                 {YWEHTML5中文学习网 - HTML5先行者学习网                     colortemp = rgbvalues[i + 2] *  0.299 + rgbvalues[i + 1] * 0.587 + rgbvalues[i] * 0.114;YWEHTML5中文学习网 - HTML5先行者学习网                     rgbvalues[i]  = rgbvalues[i + 1] = rgbvalues[i + 2] =  (byte)colortemp;YWEHTML5中文学习网 - HTML5先行者学习网                 }YWEHTML5中文学习网 - HTML5先行者学习网                 System.Runtime.InteropServices.Marshal.Copy(rgbvalues,  0, ptr, bytes);YWEHTML5中文学习网 - HTML5先行者学习网                 newbitmap.UnlockBits(bmpdata);YWEHTML5中文学习网 - HTML5先行者学习网                 pictureBox1.Image =  newbitmap.Clone() as Image;YWEHTML5中文学习网 - HTML5先行者学习网             } |         
    
  指针法YWEHTML5中文学习网 - HTML5先行者学习网
  这个方法和内存法相似,开始都是通过LockBits方法来获取位图的首地址,这个方法更简洁,直接用指针进行位图操作。所以对内存的操作需要在unsafe下进行操作。YWEHTML5中文学习网 - HTML5先行者学习网
                        1YWEHTML5中文学习网 - HTML5先行者学习网             2YWEHTML5中文学习网 - HTML5先行者学习网             3YWEHTML5中文学习网 - HTML5先行者学习网             4YWEHTML5中文学习网 - HTML5先行者学习网             5YWEHTML5中文学习网 - HTML5先行者学习网             6YWEHTML5中文学习网 - HTML5先行者学习网             7YWEHTML5中文学习网 - HTML5先行者学习网             8YWEHTML5中文学习网 - HTML5先行者学习网             9YWEHTML5中文学习网 - HTML5先行者学习网             10YWEHTML5中文学习网 - HTML5先行者学习网             11YWEHTML5中文学习网 - HTML5先行者学习网             12YWEHTML5中文学习网 - HTML5先行者学习网             13YWEHTML5中文学习网 - HTML5先行者学习网             14YWEHTML5中文学习网 - HTML5先行者学习网             15YWEHTML5中文学习网 - HTML5先行者学习网             16YWEHTML5中文学习网 - HTML5先行者学习网             17YWEHTML5中文学习网 - HTML5先行者学习网             18YWEHTML5中文学习网 - HTML5先行者学习网             19YWEHTML5中文学习网 - HTML5先行者学习网             20YWEHTML5中文学习网 - HTML5先行者学习网             21YWEHTML5中文学习网 - HTML5先行者学习网             22YWEHTML5中文学习网 - HTML5先行者学习网             23YWEHTML5中文学习网 - HTML5先行者学习网             24YWEHTML5中文学习网 - HTML5先行者学习网             25YWEHTML5中文学习网 - HTML5先行者学习网             26 |             if (bitmap  != null)YWEHTML5中文学习网 - HTML5先行者学习网             {YWEHTML5中文学习网 - HTML5先行者学习网                 newbitmap = bitmap.Clone() as Bitmap;YWEHTML5中文学习网 - HTML5先行者学习网                 Rectangle rect  = new Rectangle(0, 0, newbitmap.Width,  newbitmap.Height);YWEHTML5中文学习网 - HTML5先行者学习网                 System.Drawing.Imaging.BitmapData bmpdata =  newbitmap.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite,  newbitmap.PixelFormat); YWEHTML5中文学习网 - HTML5先行者学习网                 byte temp;YWEHTML5中文学习网 - HTML5先行者学习网                 unsafeYWEHTML5中文学习网 - HTML5先行者学习网                 {YWEHTML5中文学习网 - HTML5先行者学习网                     byte*  ptr = (byte*)(bmpdata.Scan0);YWEHTML5中文学习网 - HTML5先行者学习网                     for (int x = 0; x < bmpdata.Width;  x++)YWEHTML5中文学习网 - HTML5先行者学习网                     {YWEHTML5中文学习网 - HTML5先行者学习网                         for (int y = 0; y < bmpdata.Height;  y++)YWEHTML5中文学习网 - HTML5先行者学习网                         {YWEHTML5中文学习网 - HTML5先行者学习网                             temp = (byte)(0.299 * ptr[2] + 0.587 *  ptr[1] + 0.114 * ptr[0]);YWEHTML5中文学习网 - HTML5先行者学习网                             ptr[0] = ptr[1] = ptr[2] =  temp;YWEHTML5中文学习网 - HTML5先行者学习网                             ptr += 3;YWEHTML5中文学习网 - HTML5先行者学习网                         }YWEHTML5中文学习网 - HTML5先行者学习网                         ptr +=  bmpdata.Stride - bmpdata.Width *  3;YWEHTML5中文学习网 - HTML5先行者学习网                     }YWEHTML5中文学习网 - HTML5先行者学习网                 }YWEHTML5中文学习网 - HTML5先行者学习网                 newbitmap.UnlockBits(bmpdata);YWEHTML5中文学习网 - HTML5先行者学习网                 pictureBox1.Image  = newbitmap.Clone() as Image;YWEHTML5中文学习网 - HTML5先行者学习网             } |         
    
  3种方法的比较YWEHTML5中文学习网 - HTML5先行者学习网
  比较一下可以得出结论,提取像素法比较简单,但是效率比较低;内存法效率有了很大的提高,但是代码比较复杂;指针法效率比内存法更高一些,但是不安全。综上比较结果内存法比较好,效率即高又能发挥C#安全的优点。YWEHTML5中文学习网 - HTML5先行者学习网