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;
}
#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;
}
相关文章推荐
- GDAL读取图像文件,建立金字塔
- GDAL读取图像文件,建立金字塔
- 使用gdal对图像建立金字塔
- opencv从文件中批量读取图像
- 图像处理 基于Visual C++编程 学习笔记 (1)建立MFC工程,打开bmp文件
- java读取bmp图像文件
- IE读取并显示本地图像文件的方法
- opencv读取摄像头图像和读取视频文件图像
- python使用h5py读取mat文件数据,并保存图像
- 从二进制数据流中构造GDAL可以读取的图像数据(C#)
- QT中使用GDAL多线程读取遥感图像到QImage
- 利用VC6.0 MFC 建立基本对话框,设计个按钮,按下就读取一个JPEG图像 按钮的响应函数代码咋写呢?求求
- HTML5 FileReader详解与实例---读取并显示图像文件
- Hadoop如何读取复杂格式的文件,例如XML、HTML、图像等,附源码
- 使用GDAL/OGR读取点、线矢量文件
- C# Gdal 读取SHP文件
- Winform中的PictureBox读取图像文件无法释放的问题
- VS2013C++通过GDAL打开遥感图像文件
- OpenCV图像文件批量读取编程实例
- 使用C#版本GDAL读取复数图像