请教在Windows下怎么用C++编程读取TIFF格式文件

如题,我也查过好多网页,上面有说利用各种库来读取,在大概看了TIFF的文件格式之后,我想请教下怎么去利用C++来编写程序读取TIFF(不是太懂怎么去根据TIFF的文件头、... 如题,我也查过好多网页,上面有说利用各种库来读取,在大概看了TIFF的文件格式之后,我想请教下怎么去利用C++来编写程序读取TIFF(不是太懂怎么去根据TIFF的文件头、目录进行编程读取 哎0.0新手求指教。。) 展开
 我来答
xiarl
2015-04-08 · TA获得超过1460个赞
知道小有建树答主
回答量:884
采纳率:85%
帮助的人:252万
展开全部

用 gdal库。

库参考和下载在这:http://www.gdal.org/

下面这个文件瞎写的,你可以修改下。。需要加装库,头文件和lib

//tif.h
enum
{
TOPX = 0,
CELLX,
XXXX,
TOPY,
XXXXX,
CELLY,
GeoTfInfoArrCount
};


 template<typename type, int nBand =1>
 class CTifFileOp
 {
 public:
 CTifFileOp(string FilePath=string(""));
virtual ~CTifFileOp();
double get_nodata_value()
{
return m_pDataset->GetRasterBand(nBand)->GetNoDataValue();
}
int GetGeoTransform(double* gt)const;
int ChangeFile(string strPath);
void ReadTiffDataset(type * DataGet, int begRow = 0, int begCol = 0, int numRows = 1, int numCols = 1)const;
void WriteTiffDataset(type * DataGet, int begRow = 0, int begCol = 0, int numRows = 1, int numCols = 1);

void ReadTiffDataset(vector<type> & DataGet, int begRow = 0, int begCol = 0, int numRows = 1, int numCols = 1)const
{
DataGet.clear();
DataGet.resize(numCols*numRows);

ReadTiffDataset(&*DataGet.begin(), begRow, begCol, numRows, numCols);
}

size_t GetColNum()
{
openDs();
return m_pDataset->GetRasterXSize();
}
size_t GetRowNum()
{
openDs();
return m_pDataset->GetRasterYSize();
}

//获取波段数
int GetRasterCount()
{
openDs();
return m_pDataset->GetRasterCount();
}

//获取坐标系信息
const char * GetProjectionRef()
{
openDs();
return m_pDataset->GetProjectionRef();
}
//获取数据类型
GDALDataType GetDataType(int iRaster = nBand)
{
openDs();
return m_pDataset->GetRasterBand(iRaster)->GetRasterDataType();
}

void GetAllData(vector<type> & DataGet)
{
//   double geoInfo[GeoTfInfoArrCount] = { 0 };
//   GetGeoTransform(geoInfo);
openDs();
ReadTiffDataset(DataGet, 0, 0, GetRowNum(), GetColNum());
}
 private:
 string m_strFile;
 GDALDataset *m_pDataset = nullptr;

 bool m_bWrite = false;

 private:
 void openDs(GDALAccess openMode = GA_ReadOnly);
 bool CanWrite()const
 {
 return m_bWrite;
 }
};
 

 template<typename type, int nBand>
 int CTifFileOp<type, nBand>::GetGeoTransform(double* gt) const
 {
// openDs();
 m_pDataset->GetGeoTransform(gt);

 return 0;
 }


 
 template<typename type, int nBand>
 CTifFileOp<type, nBand>::CTifFileOp(string FilePath)
 :m_strFile(FilePath), m_pDataset(nullptr)
 {
openDs();

 }

 template<typename type, int nBand>
 CTifFileOp<type, nBand>::~CTifFileOp()
 {
if (m_pDataset)
{
GDALClose(m_pDataset);
m_pDataset = nullptr;
//是这样关闭 数据集 么?
}
 }

 template<typename type, int nBand>
 void CTifFileOp<type, nBand>::openDs(GDALAccess openMode)
{
 if (m_pDataset)//当不为nullptr,认为是打开的
 {
 return;
 }

GDALAllRegister();
const char *pszFormat = "GTiff";
GDALDriver *poDriver;
poDriver = GetGDALDriverManager()->GetDriverByName(pszFormat);
if (poDriver == nullptr){
return;
}

if (!m_strFile.empty())
{
m_pDataset = ((GDALDataset *)GDALOpen(m_strFile.c_str(), openMode));
//  if (m_pDataset != NULL)
//  {
//  int ibandCounts = m_pDataset->GetRasterCount();
//  ibandCounts |= (long(1)<<0);
//  }

if (GA_Update == openMode)
{
m_bWrite = true;
}
else
m_bWrite = false;
}

// OGRCleanupAll();
}

template<typename type, int nBand>
int CTifFileOp<type, nBand>::ChangeFile(string strPath)
{
m_strFile = strPath;
if (m_pDataset)
{
GDALClose(m_pDataset);
m_pDataset = nullptr;
//是这样关闭 数据集 么?
}
openDs();
return 0;
}


template<typename type, int nBand>
void CTifFileOp<type, nBand>::ReadTiffDataset(type * DataGet, int begRow, int begCol, int numRows, int numCols)const
{
if (!DataGet || !m_pDataset)
{
return;
}

if (begRow < 0 || begCol < 0 || numRows <= 0 || numCols <= 0)
{
return;
}
GDALDataType datatype = m_pDataset->GetRasterBand(nBand)->GetRasterDataType();
//不知道下面读数据的这个类型参数有什么意义
m_pDataset->RasterIO(GF_Read,begCol,begRow,numCols,numRows,DataGet,numCols,numRows,datatype,1,0,0,0,0);
}

template<typename type,int nBand>
void CTifFileOp<type, nBand>::WriteTiffDataset(type * DataGet, int begRow, int begCol, int numRows, int numCols)
{
if (!DataGet || !m_pDataset)
{
return;
}

if (begRow < 0 || begCol < 0 || numRows <= 0 || numCols <= 0)
{
return;
}

if (!CanWrite())
{
GDALClose(m_pDataset);
m_pDataset = nullptr;

openDs(GA_Update);
}
GDALDataType datatype = m_pDataset->GetRasterBand(nBand)->GetRasterDataType();
//不知道下面读数据的这个类型参数有什么意义
m_pDataset->RasterIO(GF_Write, begCol, begRow, numCols, numRows, DataGet, numCols, numRows, datatype, 1, 0, 0, 0, 0);
}
追问
感谢您的回答。上面的gdal程序是否只能用C#来写呢?网上查的在C++语言环境下配置gdal好像非常少?
追答
我写的就是c++代码。。。
浙江启扬智能科技有限公司
2023-06-12 广告
Linux 嵌入式系统中,USB 启动模式能够烧写 ARM 的 uboot 的原因主要有以下几个方面:1. USB 启动模式相对于传统的 BIOS 启动模式来说,具有更高的兼容性和灵活性,可以支持更多的硬件设备和操作系统。2. USB 启动... 点击进入详情页
本回答由浙江启扬智能科技有限公司提供
墨夷寒垒047
推荐于2016-12-02 · TA获得超过442个赞
知道小有建树答主
回答量:874
采纳率:100%
帮助的人:480万
展开全部
你是要显示还是只要图像有用的数据部分
如果要显示有两种办法
1、安装opencv 使用cvLoadImage函数读图
2、将文件图像数据部分读出,然后自己创建BMP文件头,用windows绘图操作完成
如果只要数据,这个好办
你只需要查询TIFF格式文件头有多大,直接有文件指针偏移对应的空间,再用常规的C++语言文件操作函数就可以将数据读到数组里面
追问
对,我就是想获取数据,不用显示。所以想请教相关的文件指针偏移,将数据读取到数组这类的应用方法,您能指导下怎么入手学习,和在哪找相关的资料吗?。。十分感谢。。
追答
先找到TIFF文件的格式详细说明,文件头包含哪些内容,占多少字节
然后用fopen打开文件
用fseek偏移指针
用fread读取数据
具体函数怎么用自己查
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式