昨天做图像处理的题,发现在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);
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);
{
byte* pIn = (byte*)(dataIn.Scan0.ToPointer());//什么意思?,byte的范围是0~255
byte* pOut = (byte*)(dataOut.Scan0.ToPointer());//什么意思?
...
}
byte* 声明byte类型的指针变量 pIn
要在C#里使用指针须要使用unsafe关键字告知编译器,以便通过编译。Bitmap.UnlockBits后面几个都一样,Google + 方法名字搜一下就出来了
////////////修改部分/////错误从此开始,能通过编译,但是没有达到预期效果//////////
if(pOut [1]>200)
{
pOut[0] = 255;
pOut[1] = 255;
pOut[2] = 255;
}
else
{
pOut[0] = 0;
pOut[1] = 0;
pOut[2] = 0;
}
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