C++ GDAL读取与写入图像

it2023-11-01  61

初学GDAL,根据老师所给的学习代码在本文进行记录和总结

读取与写入代码

#include <gdal_priv.h> int main() { //在main函数中注册所有的格式驱动 GDALAllRegister(); //设置支持中文路径 CPLSetConfigOption("GDAL_FILENAME_IS_UTF8", "NO"); const char* Filepath = "./data/test.tif"; //使用GDALDataset类创建GDAL栅格数据集,以“只读”的方式打开栅格图像 GDALDataset* poDataset = (GDALDataset*)GDALOpen(Filepath, GA_ReadOnly); //获取影像的基本信息 int width = poDataset->GetRasterXSize(); //影像的列宽数 int height = poDataset->GetRasterYSize(); //影像的行高数 int nCount = poDataset->GetRasterCount(); //影像的波段数 const char* Projection = poDataset->GetProjectionRef(); //影像的投影信息 double adfGeo[6]; poDataset->GetGeoTransform(adfGeo); //获取影像六参数信息 //读取影像 GDALDataType gdal_datatype = poDataset->GetRasterBand(1)->GetRasterDataType();//获取影像数据类型 unsigned char* Data = new unsigned char[width * height * nCount];//创建存放数据的内存 int pBandMap[3] = { 1,2,3 };//定义波段排序顺序 poDataset->RasterIO(GF_Read, 0, 0, width, height, Data, width, height, gdal_datatype, nCount, pBandMap, 0, 0, 0);//读取影像到Data中 //读取单波段 GDALRasterBand* poBand = poDataset->GetRasterBand(1); unsigned char* pData = new unsigned char[width * height]; poBand->RasterIO(GF_Read, 0, 0, width, height, pData, width, height, gdal_datatype, 0, 0, 0); //创建保存影像数据集 GDALDriver* poDriver = GetGDALDriverManager()->GetDriverByName("GTiff"); const char* pszDstFilename = "./data/out.tif"; GDALDataset* poDstDS = poDriver->Create(pszDstFilename, width, height, nCount, gdal_datatype, NULL); //保存影像 poDstDS->RasterIO(GF_Write, 0, 0, width, height, Data, width, height, gdal_datatype,nCount, pBandMap, 0, 0, 0); //保存单波段 poDstDS->GetRasterBand(1)->RasterIO(GF_Write, 0, 0, width, height, pdata, width, height, gdal_datatype,0, 0); //释放内存 GDALClose(poDataset); GDALClose(poDstDS); delete[] Data; delete[] pData; }

图像所在位置

代码中采用相对路径 ,针对工程文件(*.vcxproj),用反斜杠表示:"./"代表源文件目前所在的目录,"../"代表上级目录。

影像六参数

即影像的左上角的地理坐标adfGeo[0],adfGeo[3],影像的行列号分辨率adfGeo[1],adfGeo[5],以及影像相对于正北方向的旋转角度,可通过影像六参数将影像坐标(x,y)转换到地理坐标(X,Y) X=adfGeo[0]+adfGeo[1]*x+adfGeo[2]*y; Y=adfGeo[3]+adfGeo[4]*x+adfGeo[5]*y;

RasterIO函数参数说明

第一个参数用来指定是读取数据还是写入数据,其值只能为GF_Read或GF_Write. 第二个和第三个表示读取或写入的影像的起始点坐标,影像的左上角坐标为(0,0) 第四个和第五个分别为读取或写入影像数据的窗口大小 第六个参数pData是指向存储数据的指针 第七个和第八个参数指定缓冲区的大小,即pData的大小为两者的积,默认等于第四个参数和第五个参数 第九个参数为影像的数据类型 第十个参数为影像的波段数 第十一个参数为影像的排列顺序

GDALDataType

代码中测试影像数据类型为GDT_Byte,对应C++中unsigned char类型,除此外还有如下数据类型: GDT_UInt16 : 16bit正整型 (C++中对应 unsigned short) GDT_Int16 : 16bit整型 (C++中对应 short 或 short int) GDT_CInt16 : 16bit复整型 (C++中对应Complex Int16) GDT_UInt32 : 32bit 正整型 (C++中对应unsigned long) GDT_Int32 : 32bit整型 (C++中对应int 或 long 或 long int) GDT_CInt32 : 32bit复整型 (C++中对应Complex Int32) GDT_Float32 : 32bit 浮点型 (C++中对应float) GDT_CFloat32 : 32bit复浮点型 (C++中对应Complex Float32) GDT_Float64 : 64bit 浮点型 (C++中对应double) GDT_CFloat64 : 64bit复浮点型 (C++中对应Complex Float64)

最新回复(0)