您的位置:首页 > 其它

GDAL读取图像文件,建立金字塔

2009-03-20 15:32 411 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: