基于GDAL库读取tiff文件的C++代码

本文介绍了一段使用GDAL库的C++代码,用于读取Tiff格式的图像文件。代码展示了如何打开文件、获取图像尺寸、坐标变换系数、波段数,并读取图像数据。此外,还提供了输出tfw文件的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 这是基于GDAL库读取tiff文件的C++代码,算是比较基础的数据读取,更深层次的运用需要自己去熟悉和理解他的类以及提供的相关接口(代码中也提供了一段输出tfw文件的方式)

#include <iostream>
#include <gdal.h>
#include <gdal_priv.h>
#include <streambuf>
#include <fstream>

using namespace std;


#define BYTE short     //方便数据类型的修改 


/* ************************************** TIFF--read ******************************** */
int tiffread(const char* file_path_name)
{
	CPLSetConfigOption("GDAL_FILENAME_IS_UTF8", "NO");	// 支持中文路径

	GDALAllRegister();  //注册所有的驱动 


	BYTE *pafScanblock1;  //开辟缓存区 

	GDALDataset *poDataset;   //GDAL数据集 

	poDataset = (GDALDataset *)GDALOpen(file_path_name, GA_ReadOnly);
	if (poDataset == NULL)
	{
		cout << "fail in open files!!!" << endl;
		return 0;
	}

	//获取图像的尺寸 
	int nImgSizeX = poDataset->GetRasterXSize();
	int nImgSizeY = poDataset->GetRasterYSize();
	cout << nImgSizeX << "  *  " << nImgSizeY << endl;


	//获取坐标变换系数 
	double trans[6];
	CPLErr aaa = poDataset->GetGeoTransform(trans);
	cout << "坐标变换系数:";
	for (auto tran : trans)
		cout << tran << " ";
	cout << endl;


	//获取图像波段 
	GDALRasterBand *poBand, *poBand1, *poBand2;
	int bandcount;
	bandcount = poDataset->GetRasterCount();	// 获取波段数
	cout << "波段数:" << bandcount << endl;
	
	for (int bandind = 1; bandind <= bandcount; bandind++)
	{
		poBand = poDataset->GetRasterBand(bandind);		// 获取对应波段
		
		//读取图像高程数据 
		int num_iamge_size = 0;		//数据计数
		BYTE *pafScanline = new BYTE[nImgSizeX*nImgSizeY];
		poBand->RasterIO(GF_Read, 0, 0, nImgSizeX, nImgSizeY, pafScanline, nImgSizeX, nImgSizeY, GDALDataType(poBand->GetRasterDataType()), 0, 0);
		for (int i = 0; i < nImgSizeX; i++)
		{
			for (int j = 0; j < nImgSizeY; j++)
			{
				num_iamge_size++;
				//if (i<10 && j < 10)
				cout << pafScanline[i*nImgSizeY+j] << endl;
			}
			//cout << i << "---" << pafScanline[i*nImgSizeY] << endl;
		}
		cout << "total:" << num_iamge_size << endl;

		delete[] pafScanline;
	}

	//输出tfw文件
	cout << "准备输出tfw文件:" << endl;
	double gt[6];
	GDALGetGeoTransform(poDataset, gt);
	for (auto value : gt)
		cout << "gt:" << (int)value << " ";
	cout << endl;
	fstream tfw;
	string tmpname = file_path_name;
	tmpname = tmpname.substr(0, tmpname.find_last_of('.') + 1) + "tfw";
	tfw.open(tmpname, ios::out);
	tfw << fixed;
	tfw << setprecision(5);
	tfw << gt[1] << endl;
	tfw << gt[2] << endl;
	tfw << gt[4] << endl;
	tfw << gt[5] << endl;
	tfw << gt[0] << endl;
	tfw << gt[3] << endl;
	tfw.close();


	// 清空资源
	delete poDataset;

	return 0;
}


int main()
{
    tiffread("D:/yourfilename.tiff");
    system("pause");

    return 0;
}

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值