【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

You may also like...