在Bitmap類中有兩個函數SetPixel,GetPixel,分別用來設置或讀取圖片中指定點的顏色(這里發現了VS的一個錯誤,SetPixel的文檔說明寫的是“獲取顏色”??)。
當要對一幅圖進行相當操作時,用這兩個函數,性能上就不盡人意了……這時就可以考慮用指針來對性能進行提升。
這里介紹兩種方法:
一、
1public struct Pixel 2{ public byte B; // public byte G; // public byte R; // 6} 8public void ReadColor() 9{ Bitmap b=new Bitmap("d:\\a.bmp"); BitmapData bData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadWrite , PixelFormat.Format24bppRgb); unsafe { Pixel* p = null; for (int x = 0; x < b.Width; x++) { p = (Pixel*)bData.Scan0 + x * b.Height; for (int y = 0; y < b.Height; y++) { int R = p->R; int G = p->G; int B = p->B; //這里獲取顏色分量的各個值,同樣在這里還可以對其進行賦值 } } } b.UnlockBits(bData); 28}
二:
//這里的x,y參數,指的是圖像中像素點的x,y坐標 pubic void ReadColor(int x,int y) { Bitmap b = new Bitmap("d:\\a.bmp"); BitmapData bData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); unsafe { byte* color = (byte*)bData.Scan0 + x * 3 + y * Data.Stride; int R = *(color + 2); int G = *(color + 1); int B = *color; //同樣在這里也可以對其行進修改 } b.UnlockBits(bData); }
通過以上的代碼可以很容易的知道怎么指針來操作像素點。
這里要說明的是,第一種方法中的x,y不能和圖像中坐標進行對應(特別要注意),如果對一幅圖的每個點都進行同樣的操作可以考慮第一種方法。但要對某些特定坐標上的點進行操作那就只能用第二種方法了。