当前位置:首页 > ArcGIS栅格处理总结
C# 处理bitmap位图总结。
位图的像素大小就是一个屏幕像素,不是ArcGIS中说的每个像素代表多少米的距离。
如果用到进度条,有时候会很慢,很慢
Dpi指的是
对于电脑,一般显示器设置的都是96dpi,好象是指每英寸可以显示96个象素吧。这个96,在何时会用到呢?显示的分辨率有专门的设置呀,比如设置为:1280*1024,即横向有1280象素,纵向有1024个象素。1280除以屏的宽度,就是dpi吧。我试了一下,屏的宽度为13.3465英寸,1280/13.3465,确实等于95.9,可以认为是96吧。这与dpi设置中的”96“是一致的。 修改像素值,很慢,用到的是SetPixel方法。
Bitmap pBmap = Bitmap.FromFile(@\栅格数据处理集\\Temp\\data\\chuli.bmp\) asBitmap;
Bitmap pBmap2 = newBitmap(pBmap.Width,
pBmap.Height,PixelFormat.Format24bppRgb ); for (int pW = 0; pW for (int pH = 0; pH < pBmap.Height; pH++) { pBmap2.SetPixel(pW, pH, pBmap.GetPixel(pW, pH));//修改像素值 } } pBmap2.Save(@\栅格数据处理集 \\Temp\\data\\Newbmp1.bmp\,System.Drawing.Imaging.ImageFormat.Bmp );//保存 修改栅格像素值,这个方法是在内存中处理,很快。 Bitmap pBitmap = Bitmap.FromFile(@\栅格数据处理集\\Temp\\data\\chuli.bmp\) asBitmap; int pW = pBitmap.Width; int pH = pBitmap.Height; Bitmap pNewbmap = newBitmap(pBitmap.Width,pBitmap.Height,PixelFormat.Format24bppRgb ); Rectangle pRect = newRectangle(0, 0, pW, pH); //将bitmap锁定到系统内,获得bitmapdata,using System.Drawing.Imaging来引用Bitmapdata BitmapData pBmdata = pBitmap.LockBits(pRect, System.Drawing.Imaging.ImageLockMode.ReadWrite , System.Drawing.Imaging.PixelFormat.Format24bppRgb ); BitmapData pNewbmdata = pNewbmap.LockBits(pRect, System.Drawing.Imaging.ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format24bppRgb ); //位图中第一个像素的位置 System.IntPtr pbmptr = pBmdata.Scan0; System.IntPtr pNewptr = pNewbmdata.Scan0; //扫描宽度:pBmdata.Stride解释,如果pBitmap.Width可以被4整除,那么pBitmap.Width和pBmdata.Stride值是相同的,如果pBitmap.Width不能被4整除,那么pBmdata.Stride就取大于pBitmap.Width,并且可以被4整数的最小整数 int pBte = pBmdata.Stride * pH; byte[] pByte = newbyte[pBte]; int pNbte = pNewbmdata.Stride * pH; byte [] pNewbyte = newbyte [pNbte ] ; //复制RGB信息,将bitmapdata数据复制到数组中 System.Runtime.InteropServices.Marshal.Copy(pbmptr, pByte, 0, pBte);//将数据拷贝到数组中,是按照左上角顺序开始拷贝的,而不像MemoryStream那样,是从左下角开始 pBitmap.UnlockBits(pBmdata); System.Runtime.InteropServices.Marshal.Copy(pNewptr, pNewbyte, 0, pNbte); for (int pT = 0; pT < pByte.Length; pT++) { pNewbyte[pT] = pByte[pT]; } //将数组内容复制到内存中 System.Runtime.InteropServices.Marshal.Copy(pNewbyte, 0, pNewptr, pNbte); pNewbmap.UnlockBits(pNewbmdata); pNewbmap.Save(@\栅格数据处理集\\Temp\\data\\Newbmp2.bmp\, ImageFormat.Bmp); 图片旋转: //旋转Image图片 Image pImage = Image.FromFile(@\栅格数据处理集\\Temp\\data\\chuli.bmp\); pImage.RotateFlip(RotateFlipType.Rotate270FlipNone);//将图片旋转270°,此方法只能旋转固定的角度,即90,180,270 ,不能随意的旋转。 if (File.Exists(@\栅格数据处理集\\Temp\\data\\chuli.bmp\)) {//设置文件属性 File.SetAttributes(@\栅格数据处理集\\Temp\\data\\chuli.bmp\, FileAttributes.Hidden);//将图片设置为隐藏,FileAttributes是设置文件的属性,可以是只读,好多属性 } pImage.Save(@\栅格数据处理集\\Temp\\data\\chuli2.bmp\, ImageFormat.Bmp);//将图像存储为bmp格式 pImage.Dispose();//释放由pImage使用的所有资源 //旋转Image图片 //旋转Bitmap图片 Bitmap pBitmap = newBitmap(@\栅格数据处理集\\Temp\\data\\chuli.bmp\);//bmp也可以进行旋转 pBitmap.RotateFlip(RotateFlipType.Rotate270FlipNone); pBitmap.Save(@\栅格数据处理集\\Temp\\data\\chuli0.bmp\,ImageFormat.Bmp ); //旋转Bitmap图片 图片缩放: 原理:栅格数据重采样。 Bitmap pBm = newBitmap (@\栅格数据处理集\\Temp\\data\\chuli.bmp\) ; //也可以用Bitmap srcBitmap = Bitmap.FromFile(@\栅格数据处理集\\Temp\\data\\chuli.bmp\ Bitmap pSavebm = newBitmap( pBm,pBm.Width /2,pBm.Height /2 );//图片缩放 pSavebm.Save(@\栅格数据处理集\\Temp\\data\\chuli00.bmp\,ImageFormat.Bmp ); 图片旋转: Bitmap pBm = newBitmap(@\栅格数据处理集\\Temp\\data\\chuli.bmp\); GraphicsPath pGrapath = newGraphicsPath();//引用using System.Drawing.Drawing2D; pGrapath.AddRectangle(newRectangleF (0,0,pBm.Width ,pBm.Height ) );//添加一个矩阵 Matrix pMatrix = newMatrix();//定义3×3放射矩阵,//引用using System.Drawing.Drawing2D; pMatrix.Rotate (45) ;//按照指定的角度对矩阵进行顺时针旋转 RectangleF pRectf = pGrapath.GetBounds(pMatrix );//旋转后的矩阵,高和宽不是整数 Bitmap pNewbm = newBitmap((int )pRectf.Width ,(int )pRectf.Height,PixelFormat.Format24bppRgb ); Graphics pGra = Graphics.FromImage(pNewbm); pGra.Clear(System.Drawing.Color.White );//将背景色填充为白色 pGra.TranslateTransform(-pRectf.X ,-pRectf.Y );//定义转换后的左上角坐标 pGra.RotateTransform(45);//新的图像转换45° pGra.InterpolationMode = InterpolationMode.HighQualityBilinear ;//内插算法 pGra.DrawImageUnscaled(pBm , 0, 0);//在指定的位置使用图像的原始物理大小绘制指定 的图像 pNewbm.Save(@\栅格数据处理集\\Temp\\data\\chuliFF3.bmp\,ImageFormat.Bmp );//保存图像 图片保存Image与Byte数组的转换: 可以将图片保存到数组中,这样可以就操作数组了。 //Image与Byte数组的转换 Bitmap pBm = newBitmap(@\栅格数据处理集\\Temp\\data\\chuli.bmp\MemoryStream pMs = newMemoryStream(); pBm.Save( pMs ,ImageFormat.Bmp );//保存时,将图像保存到内存流中。其中数据流的存储是从左下角的坐标开始的,而不是从左上角坐标开始 byte[] pBmdata = pMs.GetBuffer();//将内存流中的数据放到数组中,这样就可以操作数组了。 MemoryStream pM = newMemoryStream(pBmdata);//从数组中获得内存流 Bitmap pb = Bitmap.FromStream(pM ) asBitmap ;//从内存流中获得位图 pb.Save(@\栅格数据处理集\\Temp\\data\\temp2.bmp\ C/C++与C#数据类型对应 C/C++ C# ---------------------------------------- charsbyte / Sbyte unsigned char byte / Byte shortshort / Int16 unsigned short ushort / UInt16 intint / Int32 unsignedintuint / UInt32 longint / Int32 longuint / UInt32 floatfloat / Single doubledouble / Double char* (字符串) string / String void* (数组) IntPtr 注意:c#中的char是2字节,表达UNICODE字符,long是8字节整数。 数组操作: ? C#中使用IntPtr来对用C/C++中分配的内存空间。 ? 使用System.Runtime.InteropServices.Marshal类中的Copy方法可实现IntPtr与C#一 维数组的相互转换。
共分享92篇相关文档