https://www.cnblogs.com/Romi/archive/2012/03/14/2396627.html
GDAL库——读取图像并提取基本信息
Posted on 2012-03-14 21:31 romi 阅读(19408) 评论(1) 编辑 收藏
GDAL库是一个跨平台的栅格地理数据格式库,包括读取、写入、转换、处理各种栅格数据格式(有些特定的格式对一些操作如写入等不支持)。它使用了一个单一的抽象数据模型就支持了大多数的栅格数据。这里有GDAL库支持的格式:http://www.gdal.org/formats_list.html
注:本文在Qt开发环境下使用GDAL库。
在Qt中使用GDAL库时,除了要加gdal_priv.h头文件外,还需要在xxx.pro文件内加上LIBS += -lgdal ,文件用可编辑的文档打开。
使用GDAL时首先对文件格式进行注册,这里我们对所有支持的文件安格式进行注册:GDALAllRegister()
注册后用数据集对象指向打开的数据文件,就实现了数据的读取,如下:
GDALAllRegister(); GDALDataset *poDataset; QString filename; filename=QFileDialog::getOpenFileName(this, tr("Choose Images"), tr("All Fles (*.*)")); //Open the image QByteArray ba = filename.toLatin1(); poDataset = (GDALDataset*) GDALOpen( ba.data(),GA_ReadOnly );
注意上面还需要将QString转化为char*类型,以保证函数参数类型一致。
1.获取图像的基本信息
采用GDAL读取图像成功后,可以获取图像的一些基本信息,如下:
描述信息:const char* GDALDataset::GetDriver()->GetDescription(),通常是图像的格式
图像大小: 图像宽度 int GDALDataset::GetRasterXSize()
图像高度 int GDALDataset::GetRasterYSize()
波段数:int GDALDataset::GetRasterCount() 波段数即图像每个像素点所含的颜色种类,物理中的光学中学过颜色就是某频率的光波。波段少则一个,多则很多个,在遥感影象中波段通常有多个。
投影信息:GDALDataset::GetProjectionRef() 有的图像没有投影信息,不如一般的JPG、BMP格式图像。
地理坐标信息:double adfGeoTransform[6]
GDALDataset::GetGeoTransform(adfGeoTransform)
地理坐标信息是一个含6个double型数据的数组,adfGeoTransform[1]和adfGeoTransform[5]表示东西和南北方向一个像素对应的距离,adfGeoTransform[0]和adfGeoTransform[3]表示左上角的坐标。
波段信息:数据集中重要的信息,有波段尺寸、数据类型、颜色信息等。
获取波段的方法: GDALRasterBand *poBand;
poBand = poDataset->GetRasterBand(i) poBand为指向第i个波段的指针
波段尺寸:int poBand->GetXSize()
int poBand->GetYSize()
数据类型:const char* GDALGetDataTypeName(poBand->GetRasterDataType())
颜色信息:const char* GDALGetColorInterpretationName(poBand->GetColorInterpretation())
2. 将读取的图像信息显示出来
上面了解了GDAL获得图像数据信息的方法,接下来就在Qt中对数据信息进行显示
QString strImgInfo; QString strImgFormat = poDataset->GetDriver()->GetDescription(); strImgInfo.append(tr("Descreption: ")+strImgFormat+"\n");
类似上面这样,Qt中的QString类有类似于向量的功能,可以用append函数再字符串后面添加新的字符串
信息获取完后显示:ui->label->setText(strImgInfo);
--------------
https://blog.csdn.net/Leo_csdn_/article/details/99736763
基于GDAL库读取tiff文件的C++代码
Just_like_fire 2019-08-19 16:46:28 1373 已收藏 7
分类专栏: C++ GDAL
版权
这是基于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;
}