ArcGIS栅格处理总结 联系客服

发布时间 : 星期三 文章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#一

维数组的相互转换。