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

       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  {
   for(int j=0; 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; 
}

你可能感兴趣的:(C/C++,图像处理)