在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不能和图像中坐标进行对应(特别要注意),如果对一幅图的每个点都进行同样的操作可以考虑第一种方法。但要对某些特定坐标上的点进行操作那就只能用第二种方法了。