使用gdal对图像建立金字塔
对图像建立金字塔,参考了李民录的博客,给出了一个可以直接粘贴就能运行的代码
// CreatePyramids.cpp : 定义控制台应用程序的入口点。
#define _AFXDLL
#pragma
#include "stdafx.h"
#include "gdal.h"
#include "gdal_priv.h"
#include "afx.h"
#pragma comment(lib,"gdal_i.lib")
using namespace std;
#pragma warning(disable: 4996)/*
* @brief 进度条基类
*
* 提供进度条基类接口,来反映当前算法的进度值
*/
classCProcessBase
{public:
/**
* @brief 构造函数
*/
CProcessBase()
{
m_dPosition = 0.0;
m_iStepCount = 100;
m_iCurStep = 0;
m_bIsContinue = true;
} /**
* @brief 析构函数
*/
virtual ~CProcessBase() {} /**
* @brief 设置进度信息
* @param pszMsg进度信息
*/
virtual void SetMessage(const char* pszMsg) = 0;
/**
* @brief 设置进度值
* @param dPosition进度值
* @return 返回是否取消的状态,true为不取消,false为取消
*/
virtual bool SetPosition(double dPosition) = 0;
/**
* @brief 进度条前进一步,返回true表示继续,false表示取消
* @return 返回是否取消的状态,true为不取消,false为取消
*/
virtual bool StepIt() = 0;
/**
* @brief 设置进度个数
* @param iStepCount进度个数
*/
virtual void SetStepCount(int iStepCount)
{
ReSetProcess();
m_iStepCount = iStepCount;
} /**
* @brief 获取进度信息
* @return 返回当前进度信息
*/
string GetMessage()
{
return m_strMessage;
} /**
* @brief 获取进度值
* @return 返回当前进度值
*/
double GetPosition()
{
return m_dPosition;
} /**
* @brief 重置进度条
*/
void ReSetProcess()
{
m_dPosition = 0.0;
m_iStepCount = 100;
m_iCurStep = 0;
m_bIsContinue = true;
} /*! 进度信息 */
string m_strMessage;
/*! 进度值 */
double m_dPosition;
/*! 进度个数 */
int m_iStepCount;
/*! 进度当前个数 */
int m_iCurStep;
/*! 是否取消,值为false时表示计算取消 */
bool m_bIsContinue;
};
/**
* @brief 控制台进度条类
*
* 提供控制台程序的进度条类接口,来反映当前算法的进度值
*/
class CConsoleProcess : public CProcessBase
{
public:
/**
* @brief 构造函数
*/
CConsoleProcess()
{
m_dPosition = 0.0;
m_iStepCount = 100;
m_iCurStep = 0;
};
/**
* @brief 析构函数
*/
~CConsoleProcess()
{
//remove(m_pszFile);
};
/**
* @brief 设置进度信息
* @param pszMsg进度信息
*/
void SetMessage(const char* pszMsg)
{
m_strMessage = pszMsg;
printf("%s\n", pszMsg);
} /**
* @brief 设置进度值
* @param dPosition进度值
* @return 返回是否取消的状态,true为不取消,false为取消
*/
bool SetPosition(double dPosition)
{
m_dPosition = dPosition;
TermProgress(m_dPosition);
m_bIsContinue = true;
return true;
} /**
* @brief 进度条前进一步
* @return 返回是否取消的状态,true为不取消,false为取消
*/
bool StepIt()
{
m_iCurStep ++;
m_dPosition = m_iCurStep*1.0 / m_iStepCount;
TermProgress(m_dPosition);
m_bIsContinue = true;
return true;
}private:
void TermProgress(double dfComplete)
{
static int nLastTick = -1;
int nThisTick = (int) (dfComplete * 40.0);
nThisTick = MIN(40,MAX(0,nThisTick));
// Have we started a new progress run?
if( nThisTick < nLastTick && nLastTick >= 39 )
nLastTick = -1;
if( nThisTick <= nLastTick )
return ;
while( nThisTick > nLastTick )
{
nLastTick++;
if( nLastTick % 4 == 0 )
fprintf( stdout, "%d", (nLastTick / 4) * 10 );
else
fprintf( stdout, "." );
}if( nThisTick == 40 )
fprintf( stdout, " - done.\n" );
else
fflush( stdout );
}
};
bool CreatePyramids(const char* pszFileName, CProcessBase *pProgress)
{
if (pProgress != NULL)
{
pProgress->SetMessage("创建金字塔");
}GDALAllRegister();
CPLSetConfigOption("USE_RRD","YES");
//创建Erdas格式的字塔文件/* -------------------------------------------------------------------- */
/*Open data file.*/
/* -------------------------------------------------------------------- */
GDALDatasetHhDataset;
hDataset = GDALOpen( pszFileName, GA_ReadOnly );
GDALDriverH hDriver = GDALGetDatasetDriver(hDataset);
const char* pszDriver = GDALGetDriverShortName(hDriver);
if (EQUAL(pszDriver, "HFA") || EQUAL(pszDriver, "PCIDSK"))
{
GDALClose(hDataset);
//如果文件是Erdas的img或者PCI的pix格式,创建内金字塔,其他的创建外金字塔
hDataset = GDALOpen( pszFileName, GA_Update );
}if( hDataset == NULL )
{
if (pProgress != NULL)
pProgress->SetMessage("打开图像失败,请检查图像是否存在或文件是否是图像文件!");
return false ;
}/* -------------------------------------------------------------------- */
/*Get File basic infomation*/
/* -------------------------------------------------------------------- */
int iWidth = GDALGetRasterXSize(hDataset);
int iHeigh = GDALGetRasterYSize(hDataset);
int iPixelNum = iWidth * iHeigh;
//图像中的总像元个数
int iTopNum = 4096;
//顶层金字塔大小,64*64
int iCurNum = iPixelNum / 4;
int anLevels[1024] = { 0 };
int nLevelCount = 0;
//金字塔级数do//计算金字塔级数,从第二级到顶层
{
anLevels[nLevelCount] = static_cast(pow(2.0, nLevelCount+2));
nLevelCount ++;
iCurNum /= 4;
} while (iCurNum > iTopNum);
const char*pszResampling = "nearest";
//采样方式
GDALProgressFunc pfnProgress = GDALTermProgress;
//进度条/* -------------------------------------------------------------------- */
/*Generate overviews.*/
/* -------------------------------------------------------------------- */
if (nLevelCount > 0 &&
GDALBuildOverviews( hDataset,pszResampling, nLevelCount, anLevels,
0, NULL, pfnProgress, pProgress ) != CE_None )
{
if (pProgress != NULL)return true ;
}/* -------------------------------------------------------------------- */
/*Cleanup*/
/* -------------------------------------------------------------------- */
GDALClose(hDataset);
GDALDestroyDriverManager();
if (pProgress != NULL)
pProgress->SetMessage("创建金字塔完成!");
return true;
}int _tmain(int argc, _TCHAR* argv[])
{ CConsoleProcess *pProgress = new CConsoleProcess();
bool f = CreatePyramids("C:\\tiff\\111.tif", pProgress);
if (f == true)
printf("计算成功/n");
else
printf("计算失败/n");
delete pProgress;
return 0;
}
【使用gdal对图像建立金字塔】
推荐阅读
- 布丽吉特,人生绝对的赢家
- 进必趋|进必趋 退必迟,问起对 视勿移
- 对称加密和非对称加密的区别
- 由浅入深理解AOP
- 【译】20个更有效地使用谷歌搜索的技巧
- mybatisplus如何在xml的连表查询中使用queryWrapper
- MybatisPlus|MybatisPlus LambdaQueryWrapper使用int默认值的坑及解决
- MybatisPlus使用queryWrapper如何实现复杂查询
- 对抗抑郁最好的方法
- 装聋作哑,关系融洽