用 gdal库。
库参考和下载在这:http://www.gdal.org/
下面这个文件瞎写的,你可以修改下。。需要加装库,头文件和lib
//tif.h
enum
{
TOPX = 0,
CELLX,
XXXX,
TOPY,
XXXXX,
CELLY,
GeoTfInfoArrCount
};
template
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& 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& 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
int CTifFileOp::GetGeoTransform(double* gt) const
{
// openDs();
m_pDataset->GetGeoTransform(gt);
return 0;
}
template
CTifFileOp::CTifFileOp(string FilePath)
:m_strFile(FilePath), m_pDataset(nullptr)
{
openDs();
}
template
CTifFileOp::~CTifFileOp()
{
if (m_pDataset)
{
GDALClose(m_pDataset);
m_pDataset = nullptr;
//是这样关闭 数据集 么?
}
}
template
void CTifFileOp::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
int CTifFileOp::ChangeFile(string strPath)
{
m_strFile = strPath;
if (m_pDataset)
{
GDALClose(m_pDataset);
m_pDataset = nullptr;
//是这样关闭 数据集 么?
}
openDs();
return 0;
}
template
void CTifFileOp::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
void CTifFileOp::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);
}
你是要显示还是只要图像有用的数据部分
如果要显示有两种办法
1、安装opencv 使用cvLoadImage函数读图
2、将文件图像数据部分读出,然后自己创建BMP文件头,用windows绘图操作完成
如果只要数据,这个好办
你只需要查询TIFF格式文件头有多大,直接有文件指针偏移对应的空间,再用常规的C++语言文件操作函数就可以将数据读到数组里面