• GDAL库学习


    GDAL库学习

    GDAL是一个操作栅格数据和矢量数据的库,对图像而言,可以进行包括读取、写入、转换、处理各种操作。

    RasterIO()函数

    RasterIO(GDALRWFlag eRWFlag,int nXOff,int nYOff,int nXSize,int nYSize,void *pData,int nBufXSize,int nBufYSize,GDALDataType eBufType,int nPixelSpace,int nLineSpace)
    
    • 1

    (1). 第一个参数eRWFlag 读写标记 :GF_Read or GF_Write,指定是读取影像还是写入影像
    (2). 2345四个参数指定读写图像的范围,从坐标(nXoff,nYOff)开始读入,读取影像行列数为(nXSize,nYSize) 即W,H。
    (3). 678三个参数, pData为用来存储图像的数值的地方,读取则存储在pData中,写入则pData中的数据将被写入图像指定位置去,pData大小不得小于[nBufXSize, nBufYSize]
    (4). nBufType用来标记pData的类型 比如pData是char,那么nBufType就是GDT_Byte,float–GDT_Float32,double–GDT_Float64
    (5). nPixelSpace和nLineSpace一般默认取0,用来控制参数pData中像元的存储顺序,表示当前像素值和下一个像素值之间的间隔;当前行和下一行的间隔

    配置好GDAL环境后,在c++中使用GDAL步骤为

    1. 添加引用

    #include "gdal_priv.h"
    #include "gdalwarper.h"
    
    • 1
    • 2

    2. 读取图像

    	//注册所有的格式驱动
    	GDALAllRegister();
    	//支持中文路径
    	CPLSetConfigOption("GDAL_FILENAME_IS_UTF8", "NO");
    
    	//打开图像
    	const char* filepath = "input.tif";
    	GDALDataset* image = (GDALDataset *)GDALOpen(filepath, GA_ReadOnly);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    以只读方式打开了路径为filepath的图像

    3. 获取图像基本信息

    获取图像size、图像类型、将某个波段读入

     	//定义图像的长宽
    	int W = image->GetRasterXSize();
    	int H = image->GetRasterYSize();
    	int C = image->GetRasterCount();
    	GDALDataType ImgType = image->GetRasterBand(1)->GetRasterDataType();   //数字图像类型
    
    	//将第一个波段的影像读入到数据之中
    	GDALRasterBand *band1 = image->GetRasterBand(1);    
    	unsigned char* bdata = new unsigned char[W*H];  //创建存放数据的内存
    	//将第一波段读入band1中
    	band1->RasterIO(GF_Read, 0, 0, W, H, bdata, W, H, ImgType, 0, 0);   
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在最后一行代码中,读取image第一波段,从像素(0,0)到(W,H)范围的数据,即整张图像。读入的数据大小为(W,H) 类型为ImgType,所以先定义了一个大小为(WH) 的bdata,存放其中。
    需要注意的是,GDAL将二维图像保存在W
    H的一维数组中,则第(i,j)个像元为data[(j)*W + i]

    4. 保存输出图像

    	//创建保存影像数据集
    	GDALDriver* imgDriver = GetGDALDriverManager()->GetDriverByName("GTiff");   //获取驱动
    	const char* outFilename1 = "img2.tif";
    	GDALDataset* outIMG1 = imgDriver->Create(outFilename1, W, H, 1,ImgType, NULL);
    	unsigned char* newdata = new unsigned char[W*H];
    
    	//图像处理子函数MeanFiter(输入影像,输出影像,宽,高)
    	MeanFilter(bdata,newdata, W, H);
    	//将处理过的图像数据写入outImg1中
    	outIMG1->GetRasterBand(1)->RasterIO(GF_Write, 0, 0, W, H, newdata, W, H, ImgType, 0, 0);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    5. 释放

    	GDALClose(outIMG1);
    	delete bdata;
    	delete newdata;
    
    • 1
    • 2
    • 3
  • 相关阅读:
    Layer2 和 ETH2.0 关系
    18.C++之继承
    第八章、python中的序列、迭代器、生成器及可迭代对象------迭代器(iterator)与生成器(generator)
    Nginx下载安装与配置(linux)
    探索数字孪生的潜力:五个最有前景的行业
    HTML标签一
    JS中字符串一些常用的方法
    并发冲突:记一次导致流量放大的生产问题
    【SpringCloud OpenFeign】OpenFeign服务接口调用
    https协议谷歌浏览器使用Jmeter脚本录制
  • 原文地址:https://blog.csdn.net/gsgs1234/article/details/132927117