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;
    }

    原始图像:

    结果图像:



  • 相关阅读:
    unsupported jsonb version number 123
    如何在MPlayer上支持RTSP
    TDengine 时序数据库的 ADO.Net Core 提供程序 Maikebing.EntityFrameworkCore.Taos
    如何使用IoTSharp对接ModBus?
    如何从源码启动和编译IoTSharp
    Asp.Net Core 自动适应Windows服务、Linux服务、手动启动时的内容路径的扩展方法
    MQTTnet 的Asp.Net Core 认证事件的扩展
    Asp.Net Core 中利用QuartzHostedService 实现 Quartz 注入依赖 (DI)
    The remote certificate is invalid according to the validation procedure 远程证书验证无效
    settings插拔式源码
  • 原文地址:https://www.cnblogs.com/shanchuan/p/8150362.html
Copyright © 2011-2022 走看看