zoukankan      html  css  js  c++  java
  • 【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;
    }

    原始图像:

    结果图像:



  • 相关阅读:
    二分查找改遍
    条件运算符?:
    k倍区间
    分巧克力
    mm
    素数
    递归return
    确定一个域名使用的邮箱服务商
    mysql 存储过程一实例
    使用vmware 共享 windows下的文件夹 到 centos
  • 原文地址:https://www.cnblogs.com/shanchuan/p/8150362.html
Copyright © 2011-2022 走看看