目的:打开一幅图像,读取其中一个波段,存储。
1.打开图像
使用gdal库之前,需要把要用到的头文件包含进来。如本用到 #include <gdal_priv.h>
使用gdal库函数前,需要注册驱动,同样,可以直接注册所用驱动。函数名为”GDALAllRegister“。
打开图像的函数名为”GDALOpen“:
GDALDatasetH GDALOpen | ( | const char * | pszFilename, | |
GDALAccess | eAccess | |||
) |
2.读取一个波段
使用函数”GetRasterBand“获取一个波段。参数为波段数。
使用”RasterIO“从原始图像读取数据到缓存。
3.存储
新建一个GDALDataset,获取相应的驱动,使用函数”create“创建图像。
使用RasterIO存入。
最后释放空间。
说明:相应的函数参数说明可以百度,或者直接到官网看,不过官网的是英文的。
附代码:
#include <gdal_priv.h> #include <iostream> using namespace std; int main() { //打开图像 GDALDataset *poDataset; GDALAllRegister(); poDataset = (GDALDataset *) GDALOpen( "test.bmp", GA_ReadOnly ); if( poDataset == NULL ) { cout<<"nothing"<<endl; } GDALRasterBand *poBand; poBand = poDataset->GetRasterBand( 1 ); //读取原始数据的第一个波段 int nImgSizeX = poDataset->GetRasterXSize(); //获取横向像元个数 int nImgSizeY = poDataset->GetRasterYSize(); //获取纵向像元个数 int bandcount = poDataset->GetRasterCount(); //获取波段数 int *pafScan = new int[nImgSizeX * nImgSizeY ]; //指向存储数据,一个波段 poBand->RasterIO( GF_Read, 0, 0, nImgSizeX, nImgSizeY, pafScan, nImgSizeX, nImgSizeY, GDT_Byte, 0, 0);//将一个波段存入pafScan GDALDataset *poDstDS; const char *pszFormat = "BMP"; GDALDriver *poDriver; poDriver = GetGDALDriverManager()->GetDriverByName(pszFormat); //获取驱动 if( poDriver == NULL ) exit( 1 ); //创建一个波段的图像 poDstDS = poDriver->Create( "res.bmp", nImgSizeX, nImgSizeY, 1, GDT_Byte, NULL); //将缓存pafScan中的数据存入结果图像 poDstDS->GetRasterBand(1)->RasterIO( GF_Write, 0, 0, nImgSizeX, nImgSizeY, pafScan, nImgSizeX, nImgSizeY, GDT_Byte, 0, 0); if( poDstDS != NULL ) delete poDstDS; if(poDataset != NULL ) delete poDataset; }
原始图像:
结果图像: