昨天做图像处理的题,发现在pictureBox里面处理图像的话,用set.pixel很慢,于是乎在网上找到一个快速处理的代码,如下:(效果是讲图片给取反,就是呈现底片效果,这段代码能正常运行,但是改一点点就不行了)
Bitmap img;
            img = (Bitmap)this.pictureBox1.BackgroundImage;//从picture。Box1中取出图像
            int h = img.Height;
            int w = img.Width;
            Bitmap bmpOut = new Bitmap(w, h, img.PixelFormat); //将处理后的图像存放在bmpOut中           
            BitmapData dataIn = img.LockBits(new Rectangle(0, 0, w, h), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);//据说这句的是关键用了BitmapData类
            BitmapData dataOut = bmpOut.LockBits(new Rectangle(0, 0, w, h), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
            unsafe
            {
                byte* pIn = (byte*)(dataIn.Scan0.ToPointer());//什么意思?,byte的范围是0~255
                byte* pOut = (byte*)(dataOut.Scan0.ToPointer());//什么意思?                for (int y = 0; y < dataIn.Height; y++)
                {
                    for (int x = 0; x < dataIn.Width; x++)
                    {
                       //核心部分
                        pOut[0] = (byte)(255 - pIn[0]);
                        pOut[1] = (byte)(255 - pIn[1]);
                        pOut[2] = (byte)(255 - pIn[2]);                        pIn += 3;
                        pOut += 3;
                    }                    pIn += dataIn.Stride - dataIn.Width * 3;
                    pOut += dataOut.Stride - dataOut.Width * 3;
                }
            }
            bmpOut.UnlockBits(dataOut);//什么意思?
            img.UnlockBits(dataIn); //什么意思?
错误代码:(我想让灰度图片变成黑白图片,但是调试后所有的pOut[0],pOut[1],pOut[2]的值都变成了0,求大虾解释啊。。)
 Bitmap img;
            img = (Bitmap)this.pictureBox1.BackgroundImage;
            int h = img.Height;
            int w = img.Width;
            Bitmap bmpOut = new Bitmap(w, h, img.PixelFormat);//将两者联系起来
            BitmapData dataIn = img.LockBits(new Rectangle(0, 0, w, h), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
            BitmapData dataOut = bmpOut.LockBits(new Rectangle(0, 0, w, h), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
            unsafe
            {
                byte* pIn = (byte*)(dataIn.Scan0.ToPointer());//什么意思?
                byte* pOut = (byte*)(dataOut.Scan0.ToPointer());//什么意思?                for (int y = 0; y < dataIn.Height; y++)
                {
                    for (int x = 0; x < dataIn.Width; x++)
                    { ////////////修改部分/////错误从此开始,能通过编译,但是没有达到预期效果//////////
                        if(pOut [1]>200)
                        {
                            pOut[0] = 255;
                            pOut[1] = 255;
                            pOut[2] = 255;
                        }
                        else 
                        {
                            pOut[0] = 0;
                            pOut[1] = 0;
                            pOut[2] = 0;
                        }                        pIn += 3;
                        pOut += 3;
                    }                    pIn += dataIn.Stride - dataIn.Width * 3;
                    pOut += dataOut.Stride - dataOut.Width * 3;
                }
            }            bmpOut.UnlockBits(dataOut);
            img.UnlockBits(dataIn); 

解决方案 »

  1.   

    255在图片里的应用肯定是color了
      

  2.   

    unsafe
    {
       byte* pIn = (byte*)(dataIn.Scan0.ToPointer());//什么意思?,byte的范围是0~255
       byte* pOut = (byte*)(dataOut.Scan0.ToPointer());//什么意思?
       ...
    }
    byte* 声明byte类型的指针变量 pIn
    要在C#里使用指针须要使用unsafe关键字告知编译器,以便通过编译。
    Bitmap.UnlockBits后面几个都一样,Google + 方法名字搜一下就出来了
      

  3.   

    大虾们,我重点是想知道为什么换成这句程序就错呢?
    ////////////修改部分/////错误从此开始,能通过编译,但是没有达到预期效果//////////
      if(pOut [1]>200)
      {
      pOut[0] = 255;
      pOut[1] = 255;
      pOut[2] = 255;
      }
      else 
      {
      pOut[0] = 0;
      pOut[1] = 0;
      pOut[2] = 0;
      }
      

  4.   

    //核心部分
      pOut[0] = (byte)(255 - pIn[0]);
      pOut[1] = (byte)(255 - pIn[1]);
      pOut[2] = (byte)(255 - pIn[2]);如果在这里赋值时,当有计算过程时常常会出错,常见的为:溢出,除数为零等,
    可以先计算好,再直接赋值.
    dim A as integer=255-PIn(0)
    pOut(0)=A