這個方法比起GetPixel、SetPixel方法速度較為優秀許多,但是撰寫起來也是相較之下較困難,當然這是對於我這個C功力較不深厚的我而言,在這裡做個筆記,以防每次突然要用到還得翻箱倒櫃。
參考了「
井民全」先生的這篇「撰寫影像處理程式 難不倒我 !! - 簡單的數位影像處理 ( C# 篇)」從而得知「Christian Graus」的這篇「
http://www.codeproject.com/KB/GDI-plus/csharpgraphicfilters11.aspx」,而裡面就有一小段GrayScale灰階化的程式碼,這段程式碼實際上run起來跟我另外用VB6的GetPixel、SetPixel撰寫比較起來執行效率真的有很明顯的差異。
開啟圖片

灰階化
利用Christian Graus的方式
public static bool GrayScale(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; y< b.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;
}

Sample SourceCode:
Download