这是基于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;
}