搜尋此網誌

2009年2月27日 星期五

C# 利用指標灰階化影像

這個方法比起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

沒有留言:

張貼留言