【GDAL】图像处理二:初级图像读取,操作,存储。
目的:打开一幅图像,读取其中一个波段,存储。
1.打开图像
使用gdal库之前,需要把要用到的头文件包含进来。如本用到 #include <gdal_priv.h>
使用gdal库函数前,需要注册驱动,同样,可以直接注册所用驱动。函数名为”GDALAllRegister“。
打开图像的函数名为”GDALOpen“:
GDALDatasetH GDALOpen | ( | const char * | pszFilename, | |
GDALAccess | eAccess | |||
) |
该函数有两个参数,第一个为文件名,第二个为打开方式,打开方式有两种,GA_ReadOnly和GA_Update,分别为只读和更新。其中,GA_Update不支持jpg格式。
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;
}
原始图像:
结果图像:
转载自:https://blog.csdn.net/shanchuan2012/article/details/24304605