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

    原始图像:

    结果图像:



  • 相关阅读:
    MongoDB 释放磁盘空间 db.runCommand({repairDatabase: 1 })
    RK 调试笔记
    RK Android7.1 拨号
    RK Android7.1 移植gt9271 TP偏移
    RK Android7.1 定制化 itvbox 盒子Launcher
    RK Android7.1 双屏显示旋转方向
    RK Android7.1 设置 内存条作假
    RK Android7.1 设置 蓝牙 已断开连接
    RK Android7.1 进入Camera2 亮度会增加
    RK 3128 调触摸屏 TP GT9XX
  • 原文地址:https://www.cnblogs.com/shanchuan/p/8150362.html
Copyright © 2011-2022 走看看