作者:朱金灿
来源:http://blog.csdn.net/clever101
首先是读取遥感图像的R、G、B波段数据的做法。读取R、G、B波段数据的像素值主要通过IRaster接口的Read方法在Raster上读取指定位置的像素块(PixelBlock),然后通过像素块的GetVal方法获取指定Band中位置的像素值。首先我们来看一下IPixelBlock接口的GetVal方法,其语法如下:
public object GetVal( int plane, int X, int Y);
IRaster接口的Read方法具有两个参数,如下:
public void Read (IPnt tlc, IPixelBlock block);
private void ReadImage_Click(object sender, EventArgs e) { ILayer pLayer = axMapControl1.get_Layer(0);//假定第一个图层为Raster数据 IRasterLayer rasterLayer = (IRasterLayer)pLayer; IRaster pRaster = rasterLayer.Raster; IRasterProps pRasterProps = (IRasterProps)pRaster; IPnt pnt = new PntClass(); pnt.SetCoords(10, 5); // 读取第5行第10列的像素 IPnt pntSize = new PntClass(); pntSize.SetCoords(1,1); // 只读取一个像素 IPixelBlock pixelBlock = pRaster.CreatePixelBlock(pntSize); pRaster.Read(pnt, pixelBlock); object obj = pixelBlock.GetVal(0, 0, 0); MessageBox.Show(Convert.ToUInt32(obj).ToString()); }
但是遥感图像一般是波段数量是大于3的图像,假如要读取除R、G、B波段外的波段的像素值,那该怎么办?事实上确实有点费劲。不过经过一番摸索也实现了,具体代码如下:
IWorkspaceFactory pWorkspaceFactory = new RasterWorkspaceFactoryClass(); IWorkspace pWorkspace = pWorkspaceFactory.OpenFromFile(file.DirectoryName, 0); IRasterWorkspace pRasterWorkspace = pWorkspace as IRasterWorkspace; IRasterDataset pRasterDataset = pRasterWorkspace.OpenRasterDataset(file.Name); // 打开遥感图像获取数据集 IRasterBandCollection bandColl = pRasterDataset as IRasterBandCollection; // 获取波段集合 IPixelBlock pPixlBlock; IPnt pntSize = new PntClass(); pntSize.SetCoords(width, height); // 设置像素块的大小 IRasterBand pRasterBand = bandColl.Item(0) as IRasterBand; IRawPixels pRawPixels = pRasterBand as IRawPixels; pPixlBlock = pRawPixels.CreatePixelBlock(pntSize); bandIndex = listBoxBand.SelectedIndices[b]; pRasterBand = bandColl.Item(bandIndex) as IRasterBand; pRawPixels = pRasterBand as IRawPixels; IPnt pnt = new PntClass(); pnt.SetCoords(0, 0); // 从0行0列开始读取 pRawPixels.Read(pnt, pPixlBlock); // 读取数据块 value = pPixlBlock.GetVal(bandIndex, iColumn, iRow); // 获取数据块中指定位置的像素值
IRawPixels接口的Read方法和IRaster接口的Read方法的参数意义是一样的。不过由此我感到ArcGIS的一些接口有歧义的地方,比如pRawPixels.CreatePixelBlock(pntSize);中使用IPnt类型的变量pntSize,这里表示尺寸,而pRawPixels.Read(pnt,pPixlBlock)这里的IPnt类型的变量pnt这里却表示位置。同一种类型的变量却有两种不同的意义,感觉不太好。