在c#中用指针操作图片像素点

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

原文地址:https://www.cnblogs.com/zhayunjia/p/4595050.html