GDAL是遥感数据的IO处理库,可以读写erdas
img、GeoTiff等多种文件格式。本文通过建立金字塔读取大数据量的文件(测试数据1.45GB,文件格式 img)。
#include "gdal_priv.h"
#include "math.h"
unsigned char
*uc_gray; //灰度数组
int
iwidth; //图像宽度
int
iheight; //图像高度
int CImageObject::GetSmpStep(float size)
{
//一副图内存中加载最大32MB
if (size <= 32)
return 1;
else
return
(int(sqrt(size/32)));
}
bool CImageObject::ReadGdalFile(CString
strfile)
{
GDALDataset *poDataset;
GDALAllRegister();
poDataset =
(GDALDataset *) GDALOpen(strfile , GA_ReadOnly);
if(
!poDataset == NULL )
{
//Fetching a Raster Band
GDALRasterBand
*poBand;
poBand = poDataset->GetRasterBand( 1 );
//Reading Raster Data
long nXSize =
poBand->GetXSize();
long
nYSize = poBand->GetYSize();
//计算图像大小
float fsize;
fsize = (nXSize / 1024) *
(nYSize / 1024) * 8 ;
//获得金字塔压缩比率
iSmpStep =
GetSmpStep(fsize);
//图像较小时直接读取灰度值
if(iSmpStep == 1)
{
uc_gray =
(BYTE *) CPLMalloc(sizeof(unsigned int)*nXSize*nYSize);
int
width=nXSize;
int
savewidth=width%4;
if(savewidth!=0)
savewidth=4-savewidth;
savewidth+=width;
iwidth=savewidth;
iheight=nYSize;
poBand->RasterIO(
GF_Read, 0, 0, nXSize, nYSize,
uc_gray, iwidth, iheight, GDT_Byte,
0, 0 );
}
//图像较大时根据压缩比率建立相应的金字塔
else
{
int
OverviewList[1]={iSmpStep};
poBand->BuildOverviews("NEAREST",
1, OverviewList, GDALDummyProgress, NULL
);
int index =
0;
iSmpStep =
4;
nXSize /=
iSmpStep;
nYSize /=
iSmpStep;
uc_gray =
(BYTE *) CPLMalloc(sizeof(unsigned int)*nXSize*nYSize);
int
width=nXSize;
int
savewidth=width%4;
if(savewidth!=0)
savewidth=4-savewidth;
savewidth+=width;
iwidth=savewidth;
iheight=nYSize;
GDALRasterBand
*poBand2;
poBand2 =
poBand->GetOverview(index);
poBand2->RasterIO(
GF_Read, 0, 0, nXSize, nYSize,
uc_gray, iwidth, iheight, GDT_Byte,
0, 0 );
}
//转置图像使(0,0)坐标由左上角转换为左下角
int i;
BYTE temp;
for(i=0;
i<int(iheight/2); i++)
{
for(int j=0;
j<iwidth; j++)
{
temp
= uc_gray[i*iwidth+j];
uc_gray[i*iwidth+j]
= uc_gray[(iheight-i-1)*iwidth+j];
uc_gray[(iheight-i-1)*iwidth+j]
= temp;
}
}
GDALClose(poDataset);
return true;
}
return false;
}