在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不能和圖像中坐標進行對應(特別要注意),如果對一幅圖的每個點都進行同樣的操作可以考慮第一種方法。但要對某些特定坐標上的點進行操作那就只能用第二種方法了。
