c#图像处理已经知道像素数据,想生成一幅图片存到本地计算机,有没有高效的方法?? (除了使用双重for循环setPixel)
2019-05-30
c#图像处理已经知道像素数据,想生成一幅图片存到本地计算机,有没有高效的方法?? (除了使用双重for循环setPixel)
优质解答
由于C#托管代码中不能使用指针(后来经过我的验证,即使是在unsafe代码中用指针操作,速度仍然很慢),因此我们就不能像C++里面一样直接利用指针在内存中完成读写操作。好在.NETFramework提供了托管内存与非托管内存之间的读写功能,一个强大的Marshal类,使得我们快速读写图像的像素信息成为可能。 在.NETFramework2.0中,Bitmap类多了两个有关内存操作的新方法:LockBits与UnlockBits,其具体含义请参见MSDN,我在这里就直接给出利用它们以及Marshal类进行内存读写的代码。上面的GetRGB方法经过改进之后: publicstaticboolGetRGB(BitmapSource,outint[,]R,outint[,]G,outint[,]B) { try { intiWidth=Source.Width; intiHeight=Source.Height; Rectanglerect=newRectangle(0,0,iWidth,iHeight); System.Drawing.Imaging.BitmapDatabmpData=Source.LockBits(rect,System.Drawing.Imaging.ImageLockMode.ReadWrite,Source.PixelFormat); IntPtriPtr=bmpData.Scan0; intiBytes=iWidth*iHeight*3; byte[]PixelValues=newbyte[iBytes]; System.Runtime.InteropServices.Marshal.Copy(iPtr,PixelValues,0,iBytes); Source.UnlockBits(bmpData); //注意这个地方图像的两维方向与数组两维的方向是转置的关系 R=newint[iHeight,iWidth]; G=newint[iHeight,iWidth]; B=newint[iHeight,iWidth]; intiPoint=0; for(inti=0;i
由于C#托管代码中不能使用指针(后来经过我的验证,即使是在unsafe代码中用指针操作,速度仍然很慢),因此我们就不能像C++里面一样直接利用指针在内存中完成读写操作。好在.NETFramework提供了托管内存与非托管内存之间的读写功能,一个强大的Marshal类,使得我们快速读写图像的像素信息成为可能。 在.NETFramework2.0中,Bitmap类多了两个有关内存操作的新方法:LockBits与UnlockBits,其具体含义请参见MSDN,我在这里就直接给出利用它们以及Marshal类进行内存读写的代码。上面的GetRGB方法经过改进之后: publicstaticboolGetRGB(BitmapSource,outint[,]R,outint[,]G,outint[,]B) { try { intiWidth=Source.Width; intiHeight=Source.Height; Rectanglerect=newRectangle(0,0,iWidth,iHeight); System.Drawing.Imaging.BitmapDatabmpData=Source.LockBits(rect,System.Drawing.Imaging.ImageLockMode.ReadWrite,Source.PixelFormat); IntPtriPtr=bmpData.Scan0; intiBytes=iWidth*iHeight*3; byte[]PixelValues=newbyte[iBytes]; System.Runtime.InteropServices.Marshal.Copy(iPtr,PixelValues,0,iBytes); Source.UnlockBits(bmpData); //注意这个地方图像的两维方向与数组两维的方向是转置的关系 R=newint[iHeight,iWidth]; G=newint[iHeight,iWidth]; B=newint[iHeight,iWidth]; intiPoint=0; for(inti=0;i