BOOL CRecogniseView::DIBDWTStep(CDib *pDib, int nInv)
{
// 循环变量
int i, j;
// 获取图象的长度和宽度
int nWidth = pDib->m_lpBMIH->biWidth;
int nHeight = pDib->m_lpBMIH->biHeight;
// 获取变换的最大层数
int nMaxWLevel = Log2(nWidth);
int nMaxHLevel = Log2(nHeight);
int nMaxLevel;
if (nWidth == 1<<nMaxWLevel && nHeight == 1<<nMaxHLevel)
nMaxLevel = min(nMaxWLevel, nMaxHLevel);
// 获取图象的存储尺寸
CSize sizeImageSave = pDib->GetDibSaveDim();
// 临时变量
double *pDbTemp;
BYTE *pBits;
// 如果小波变换的存储内存还没有分配,则分配此内存
if(!m_pDbImage){
m_pDbImage = new double[nWidth*nHeight];
if (!m_pDbImage) return FALSE;
// 将图象数据放入 m_pDbImage 中
for (j=0; j<nHeight; j++)
{
pDbTemp = m_pDbImage + j*sizeImageSave.cx;
pBits = pDib->m_lpImage + (nHeight-1-j)*sizeImageSave.cx;
for (i=0; i<nWidth; i++)
pDbTemp[i] = pBits[i];
}
}
// 进行小波变换(或反变换)
if (!DWTStep_2D(m_pDbImage, nMaxWLevel-m_nDWTCurDepth, nMaxHLevel-m_nDWTCurDepth,
nMaxWLevel, nMaxHLevel, nInv, 1, m_nSupp))
return FALSE;
// 如果是反变换,则当前层数减 1
if (nInv)
m_nDWTCurDepth --;
// 否则加 1
else
m_nDWTCurDepth ++;