void GDAL_MEM_Test() { GDALAllRegister(); // 打开原始图像 GDALDataset *pSrcDS = (GDALDataset*) GDALOpen("D:\\Data\\landsat\\p139r26_5t19900902_nn2.tif", GA_ReadOnly); GDALRasterBand *pBand = pSrcDS->GetRasterBand(1); // 申请512*512大小的内存,用于存放像素值 unsigned char *pData = new unsigned char[512*512]; memset(pData, 0, 512*512); // 从2500,2500开始宽高均读取256个像素 pBand->RasterIO(GF_Read, 2500, 2500, 512, 512, pData, 512, 512, GDT_Byte, 0, 0); //使用读取出来的pData构造一个MEM数据集 //"MEM:::DATAPOINTER=342343408,PIXELS=100,LINES=100,BANDS=3,DATATYPE=Byte,PIXELOFFSET=3,LINEOFFSET=300,BANDOFFSET=1" char aMemString[256] ={0}; //构造MEM的文件名 sprintf_s(aMemString, 256, "MEM:::DATAPOINTER=%d,PIXELS=%d,LINES=%d", pData, 512, 512); //打开MEM文件 GDALDataset *pMemDS = (GDALDataset*) GDALOpen(aMemString, GA_ReadOnly); GDALDriver *pDriver = GetGDALDriverManager()->GetDriverByName("PNG"); GDALDataset *pOutDS = pDriver->CreateCopy("D:\\Data\\landsat\\p139r26_5t19900902_nn2_sub.png", pMemDS, FALSE, NULL, NULL, NULL); GDALClose((GDALDatasetH) pSrcDS); GDALClose((GDALDatasetH) pMemDS); GDALClose((GDALDatasetH) pOutDS); delete []pData; }裁切的原始图像如下图所示,图中的红色区域大致为代码中读取出来的区域,右下角为鹰眼图。
下图是构造的MEM并输出的结果,可以看出图像的区域与上图中的红色区域中的一样。对于需要从图像中裁切一块数据除了使用RasterIO和Cereate方式之外,还可以使用MEM,比较方便,不需要复杂的代码即可完成工作;同时对于某些算法需要将数据做成一个临时文件放到磁盘上,然后再处理的情况,可以考虑使用这种方式,即不将数据写入磁盘,所有的数据都在内存中进行处理,可以很大程度上提高算法的效率。
原文:http://blog.csdn.net/liminlu0314/article/details/19633849