www.gusucode.com > VC 实现的二维小波变换用于图像去噪、压缩等源码程序 > 小波变换View.cpp
// 小波变换View.cpp : implementation of the CMyView class // #include "stdafx.h" #include "小波变换.h" #include "小波变换Doc.h" #include "小波变换View.h" #include "dibapi.h" #include "math.h" #include "waveletlevel.h" #include "WaveletCoi.h" #include "QuantizationDlg.h" #include "QuantizeColorDlg.h" #include "HaffmanDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CMyView IMPLEMENT_DYNCREATE(CMyView, CView) BEGIN_MESSAGE_MAP(CMyView, CView) //{{AFX_MSG_MAP(CMyView) ON_COMMAND(ID_COMPRESSION, OnCompression) ON_COMMAND(ID_DISCOMPRESSION, OnDiscompression) ON_COMMAND(ID_QUANTIZATION, OnQuantization) ON_COMMAND(ID_DECODING, OnDecoding) ON_COMMAND(ID_ENCODING, OnEncoding) ON_COMMAND(ID_WAVELETCONSTRUCTION, OnWaveletconstruction) //}}AFX_MSG_MAP // Standard printing commands ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CMyView construction/destruction CMyView::CMyView() { // TODO: add construction code here m_nLevel=1; FWidth=0; wavefunction=-1; } CMyView::~CMyView() { } BOOL CMyView::PreCreateWindow(CREATESTRUCT& cs) { // TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs return CView::PreCreateWindow(cs); } ///////////////////////////////////////////////////////////////////////////// // CMyView drawing void CMyView::OnDraw(CDC* pDC) { BeginWaitCursor(); CMyDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here // 获取DIB HDIB hDIB = pDoc->GetHDIB(); // 判断DIB是否为空 if (hDIB != NULL) { LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) hDIB); // 获取DIB宽度 int cxDIB = (int) ::DIBWidth(lpDIB); // 获取DIB高度 int cyDIB = (int) ::DIBHeight(lpDIB); ::GlobalUnlock((HGLOBAL) hDIB); CRect rcDIB; rcDIB.top = rcDIB.left = 0; rcDIB.right = cxDIB; rcDIB.bottom = cyDIB; // 输出DIB ::PaintDIB(pDC->m_hDC, &rcDIB, pDoc->GetHDIB(), &rcDIB, pDoc->GetDocPalette()); } // 恢复正常光标 CRect rect; GetClientRect(&rect); int x,y; y=rect.bottom; x=rect.right; pDC->TextOut(x-100,y-100,"低低"); pDC->TextOut(x-100,y-50,"低高"); pDC->MoveTo(x-60,y-100); pDC->LineTo(x-60,y-35); pDC->MoveTo(x-100,y-68); pDC->LineTo(x-20,y-68); pDC->TextOut(x-50,y-100,"高低"); pDC->TextOut(x-50,y-50,"高高"); CString str; switch(wavefunction) { case 0: str="Shannon"; break; case 1: str="Daubechies"; break; case 2: str="Morlet"; break; case 3: str="Mexican Hat"; break; case 4: str="Meyer"; break; case 5: str="B_Spline"; break; case 6: str="Symlets"; break; case 7: str="Coiflets"; break; } CString str2; str2.Format("选择的小波是:%s小波",str); pDC->TextOut(rect.left,y-50,str2); str.Format("小波支撑集长度是:%d",FWidth); pDC->TextOut(rect.left,y-25,str); EndWaitCursor(); } ///////////////////////////////////////////////////////////////////////////// // CMyView printing BOOL CMyView::OnPreparePrinting(CPrintInfo* pInfo) { // default preparation return DoPreparePrinting(pInfo); } void CMyView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: add extra initialization before printing } void CMyView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: add cleanup after printing } ///////////////////////////////////////////////////////////////////////////// // CMyView diagnostics #ifdef _DEBUG void CMyView::AssertValid() const { CView::AssertValid(); } void CMyView::Dump(CDumpContext& dc) const { CView::Dump(dc); } CMyDoc* CMyView::GetDocument() // non-debug version is inline { ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMyDoc))); return (CMyDoc*)m_pDocument; } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CMyView message handlers void CMyView::OnWaveletconstruction() { // TODO: Add your command handler code here //所谓的构建,其实是已经将数据存入了数组里。 BeginWaitCursor(); CMyDoc* pDoc = GetDocument(); Ld = new double[20]; //分解尺度函数 Hd = new double[20]; //分解母函数 Lr = new double[20]; //重建尺度函数 Hr = new double[20]; //重建母函数 CWaveletCoi waveletcoi; if(waveletcoi.DoModal()==IDOK) { FWidth=waveletcoi.m_waveletlength; wavefunction=waveletcoi.m_waveletfunction; switch(wavefunction) { case 0://IDC_SHANNON { Ld[0]=1/sqrt(2); Ld[1]=1/sqrt(2); break; } case 1://IDC_DAUBECHIES { switch(FWidth) { case 2: Ld[0]=1/sqrt(2); Ld[1]=1/sqrt(2); m_wavetransform.m_preoffset=0; m_wavetransform.m_aftoffset=1; break; case 4: Ld[0]=0.4829629131445341; Ld[1]=0.8365163037378077; Ld[2]=0.2241438680420134; Ld[3]=-0.1294095225512603; m_wavetransform.m_preoffset=0; m_wavetransform.m_aftoffset=3; break; case 6: Ld[0]=0.3326705529500825; Ld[1]=0.8068915093110924; Ld[2]=0.4598775021184914; Ld[3]=-0.1350110200102546; Ld[4]=-0.0854412738820267; Ld[5]=0.035226218857095; m_wavetransform.m_preoffset=1; m_wavetransform.m_aftoffset=4; break; case 8: Ld[0]=0.230377813309; Ld[1]=0.714846570553; Ld[2]=0.630880767930; Ld[3]=-0.027983769417; Ld[4]=-0.187034811719; Ld[5]=0.030841381836; Ld[6]=0.032883011667; Ld[7]=-0.010597401785; m_wavetransform.m_preoffset=1; m_wavetransform.m_aftoffset=6; break; case 10: Ld[0]=0.160102397974; Ld[1]=0.603829269797; Ld[2]=0.724308528438; Ld[3]=0.138428145901; Ld[4]=-0.242294887066; Ld[5]=-0.032244869585; Ld[6]=0.077571493840; Ld[7]=-0.006241490213; Ld[8]=-0.012580751999; Ld[9]=0.003335725285; m_wavetransform.m_preoffset=1; m_wavetransform.m_aftoffset=8; break; case 12: Ld[0]=0.111540743350; Ld[1]=0.494623890398; Ld[2]=0.751133908021; Ld[3]=0.315250351709; Ld[4]=-0.226264693965; Ld[5]=-0.129766867567; Ld[6]=0.097501605587; Ld[7]=0.027522865530; Ld[8]=-0.031582039318; Ld[9]=0.000553842201; Ld[10]=0.004777257511; Ld[11]=-0.001077301085; m_wavetransform.m_preoffset=1; m_wavetransform.m_aftoffset=10; break; case 14: Ld[0]=0.077852054085; Ld[1]=0.396539319482; Ld[2]=0.729132090846; Ld[3]=0.469782287405; Ld[4]=-0.143906003929; Ld[5]=-0.224036184994; Ld[6]=0.071309219267; Ld[7]=0.080612609151; Ld[8]=-0.038029936935; Ld[9]=-0.016574541631; Ld[10]=0.012550998556; Ld[11]=0.000429577973; Ld[12]=-0.001801640704; Ld[13]=0.000353713800; m_wavetransform.m_preoffset=1; m_wavetransform.m_aftoffset=12; break; case 16: Ld[0]=0.054415842243; Ld[1]=0.312871590914; Ld[2]=0.675630736297; Ld[3]=0.585354683654; Ld[4]=-0.015829105256; Ld[5]=-0.284015542962; Ld[6]=0.000472484574; Ld[7]=0.128747426620; Ld[8]=-0.017369301002; Ld[9]=-0.044088253931; Ld[10]=0.013981027917; Ld[11]=0.008746094047; Ld[12]=-0.004870352993; Ld[13]=-0.000391740373; Ld[14]=0.000675449406; Ld[15]=-0.000117476784; m_wavetransform.m_preoffset=1; m_wavetransform.m_aftoffset=14; break; case 18: Ld[0]=0.038077947364; Ld[1]=0.243834674613; Ld[2]=0.604823123690; Ld[3]=0.657288078051; Ld[4]=0.133197385825; Ld[5]=-0.293273783279; Ld[6]=-0.096840783223; Ld[7]=0.148540749338; Ld[8]=0.030725681479; Ld[9]=-0.067632829061; Ld[10]=0.000250947115; Ld[11]=0.022361662124; Ld[12]=-0.004723204758; Ld[13]=-0.004281503682; Ld[14]=0.001847646883; Ld[15]=0.000230385764; Ld[16]=-0.000251963189; Ld[17]=0.000039347320; m_wavetransform.m_preoffset=2; m_wavetransform.m_aftoffset=15; break; case 20: Ld[0]=0.026670057901; Ld[1]=0.188176800078; Ld[2]=0.527201188932; Ld[3]=0.688459039454; Ld[4]=0.281172343661; Ld[5]=-0.249846424327; Ld[6]=-0.195946274377; Ld[7]=0.127369340336; Ld[8]=0.093057364604; Ld[9]=-0.071394147166; Ld[10]=-0.029457536822; Ld[11]=0.033212674059; Ld[12]=0.003606553567; Ld[13]=-0.010733175483; Ld[14]=0.001395351747; Ld[15]=0.001992405295; Ld[16]=-0.000685856695; Ld[17]=-0.000116466855; Ld[18]=0.000093588670; Ld[19]=-0.000013264203; m_wavetransform.m_preoffset=2; m_wavetransform.m_aftoffset=17; break; } } break; case 2://IDC_MORLET break; case 3://IDC_MEXICANHAT break; case 4://IDC_MEYER break; case 5://IDC_BSPLINE break; case 6://IDC_SYMLETS { switch(FWidth) { case 8: Ld[0]=-0.107148901418/sqrt(2); Ld[1]=-0.041910965126/sqrt(2); Ld[2]=0.703739068656/sqrt(2); Ld[3]=1.136658243409/sqrt(2); Ld[4]=0.421234534204/sqrt(2); Ld[5]=-0.140317624179/sqrt(2); Ld[6]=-0.017824701442/sqrt(2); Ld[7]=0.045570345896/sqrt(2); m_wavetransform.m_preoffset=3; m_wavetransform.m_aftoffset=4; break; case 10: Ld[0]=0.038654795955/sqrt(2); Ld[1]=0.041746864422/sqrt(2); Ld[2]=-0.055344186117/sqrt(2); Ld[3]=0.281990696854/sqrt(2); Ld[4]=1.023052966894/sqrt(2); Ld[5]=0.896581648380/sqrt(2); Ld[6]=0.023478923136/sqrt(2); Ld[7]=-0.247951362613/sqrt(2); Ld[8]=-0.029842499869/sqrt(2); Ld[9]=0.027632152958/sqrt(2); m_wavetransform.m_preoffset=4; m_wavetransform.m_aftoffset=5; break; case 12: Ld[0]=0.021784700327/sqrt(2); Ld[1]=0.004936612372/sqrt(2); Ld[2]=-0.166863215412/sqrt(2); Ld[3]=-0.068323121587/sqrt(2); Ld[4]=0.0694457972958/sqrt(2); Ld[5]=1.113892783926/sqrt(2); Ld[6]=0.477904371333/sqrt(2); Ld[7]=-0.102724969862/sqrt(2); Ld[8]=-0.029783751299/sqrt(2); Ld[9]=0.063250562660/sqrt(2); Ld[10]=0.002499922093/sqrt(2); Ld[11]=-0.011031867509/sqrt(2); m_wavetransform.m_preoffset=5; m_wavetransform.m_aftoffset=6; break; case 14: Ld[0]=0.003792658534/sqrt(2); Ld[1]=-0.001481225915/sqrt(2); Ld[2]=-0.017870431651/sqrt(2); Ld[3]=0.043155452582/sqrt(2); Ld[4]=0.096014767936/sqrt(2); Ld[5]=-0.070078291222/sqrt(2); Ld[6]=0.024665659489/sqrt(2); Ld[7]=0.758162601964/sqrt(2); Ld[8]=1.085782709814/sqrt(2); Ld[9]=0.408183939725/sqrt(2); Ld[10]=-0.198056706807/sqrt(2); Ld[11]=-0.152463872896/sqrt(2); Ld[12]=0.005671342686/sqrt(2); Ld[13]=0.014521394762/sqrt(2); m_wavetransform.m_preoffset=7; m_wavetransform.m_aftoffset=6; break; case 16: Ld[0]=0.002672793393/sqrt(2); Ld[1]=-0.000428394300/sqrt(2); Ld[2]=-0.021145686528/sqrt(2); Ld[3]=0.005386388754/sqrt(2); Ld[4]=0.069490465911/sqrt(2); Ld[5]=-0.038493521263/sqrt(2); Ld[6]=-0.073462508761/sqrt(2); Ld[7]=0.515398670374/sqrt(2); Ld[8]=1.099106630537/sqrt(2); Ld[9]=0.680745347190/sqrt(2); Ld[10]=-0.086653615406/sqrt(2); Ld[11]=-0.202648655286/sqrt(2); Ld[12]=0.010758611751/sqrt(2); Ld[13]=0.044823623042/sqrt(2); Ld[14]=-0.000766690896/sqrt(2); Ld[15]=-0.004783458512/sqrt(2); m_wavetransform.m_preoffset=8; m_wavetransform.m_aftoffset=7; break; case 18: Ld[0]=0.001512487309/sqrt(2); Ld[1]=-0.000669141509/sqrt(2); Ld[2]=-0.014515578553/sqrt(2); Ld[3]=0.012528896242/sqrt(2); Ld[4]=0.087791251554/sqrt(2); Ld[5]=-0.025786445930/sqrt(2); Ld[6]=-0.270893783503/sqrt(2); Ld[7]=0.049882830959/sqrt(2); Ld[8]=0.873048407349/sqrt(2); Ld[9]=1.015259790832/sqrt(2); Ld[10]=0.337658923602/sqrt(2); Ld[11]=-0.077172161097/sqrt(2); Ld[12]=0.000825140929/sqrt(2); Ld[13]=0.042744433602/sqrt(2); Ld[14]=-0.016303351226/sqrt(2); Ld[15]=-0.018769396836/sqrt(2); Ld[16]=0.000876502539/sqrt(2); Ld[17]=0.001981193736/sqrt(2); m_wavetransform.m_preoffset=8; m_wavetransform.m_aftoffset=9; break; case 20: Ld[0]=0.001089170447/sqrt(2); Ld[1]=0.000135245020/sqrt(2); Ld[2]=-0.012220642630/sqrt(2); Ld[3]=-0.002072363923/sqrt(2); Ld[4]=0.064950924579/sqrt(2); Ld[5]=0.016418869426/sqrt(2); Ld[6]=-0.225558972234/sqrt(2); Ld[7]=-0.100240215031/sqrt(2); Ld[8]=0.667071338154/sqrt(2); Ld[9]=1.088251530500/sqrt(2); Ld[10]=0.542813011213/sqrt(2); Ld[11]=-0.050256540092/sqrt(2); Ld[12]=-0.045240772218/sqrt(2); Ld[13]=0.070703567550/sqrt(2); Ld[14]=0.008152816799/sqrt(2); Ld[15]=-0.028786231926/sqrt(2); Ld[16]=-0.001137535314/sqrt(2); Ld[17]=0.006495728375/sqrt(2); Ld[18]=0.000080661204/sqrt(2); Ld[19]=-0.000649589896/sqrt(2); m_wavetransform.m_preoffset=9; m_wavetransform.m_aftoffset=10; break; } } break; case 7://IDC_COIFLETS Ld[0]=-0.0802861503271*sqrt(2); Ld[1]=-0.0243085969067*sqrt(2); Ld[2]=0.362806341593*sqrt(2); Ld[3]=0.550576616156*sqrt(2); Ld[4]=0.229036357075*sqrt(2); Ld[5]=-0.0644368523121*sqrt(2); Ld[6]=-0.0115565483406*sqrt(2); Ld[7]=0.0381688330633*sqrt(2); m_wavetransform.m_preoffset=3; m_wavetransform.m_aftoffset=4; break; } for(int i=0;i<FWidth;i++) { Hd[i]=pow(-1,i+1)*Ld[-i-1+FWidth]; } for(i=0;i<FWidth;i++) { Lr[i]=Ld[-i-1+FWidth]; Hr[i]=Hd[-i-1+FWidth]; } } pDoc->UpdateAllViews(NULL); EndWaitCursor(); } void CMyView::OnCompression() { // TODO: Add your command handler code here BeginWaitCursor(); CMyDoc* pDoc = GetDocument(); LPSTR lpDIB; // 指向DIB象素指针 LPSTR lpDIBBits; // 锁定DIB lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB()); // 找到DIB图像象素起始位置 lpDIBBits = ::FindDIBBits(lpDIB); CWaveletLevel leveldlg; if(leveldlg.DoModal()==IDOK) { m_nLevel=leveldlg.m_nlevel; //分解 m_wavetransform.DIBWavelet(lpDIB,lpDIBBits,Ld,Hd,FWidth,m_nLevel); pDoc->SetModifiedFlag(TRUE); pDoc->UpdateAllViews(NULL); } // 解除锁定 ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); EndWaitCursor(); } void CMyView::OnQuantization() { // TODO: Add your command handler code here CMyDoc* pDoc = GetDocument(); LPSTR lpDIB; // 指向DIB象素指针 LPSTR lpDIBBits; // 锁定DIB lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB()); // 找到DIB图像象素起始位置 lpDIBBits = ::FindDIBBits(lpDIB); //量化 int* m_thredhold; unsigned char* lpSrc;// 指向源图像的指针 double dTemp; LONG lLineBytes; // 图像每行的字节数 LONG lWidth,lHeight; lWidth=::DIBWidth(lpDIB); lHeight=::DIBHeight(lpDIB); LONG i,j;//循环变量 if(::DIBNumColors(lpDIB)==256) { lLineBytes = WIDTHBYTES(lWidth * 8);// 计算图像每行的字节数 CQuantizationDlg dlg; dlg.m_level=new double[256]; for(i=0;i<256;i++) dlg.m_level[i]=0; dlg.m_levelmax=0; // 从源图像中读取数据。 for(i = 0; i < lHeight; i++)// 每列 { for(j = 0; j < lWidth; j++)// 每行 { lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) +j; // 指向DIB第i行,第j个象素的指针 dTemp =*(lpSrc); dlg.m_level[int(dTemp)]++; } } CString str; str.Format("%d",int(m_wavetransform.m_GrayMax)); dlg.m_coifmax=str; str.Format("%d",int(m_wavetransform.m_GrayMin)); dlg.m_coifmin=str; dlg.m_graymin=m_wavetransform.m_GrayMin; dlg.m_graymax=m_wavetransform.m_GrayMax; for(i=0;i<256;i++) { dlg.m_level[i]/=(FLOAT(lWidth*lHeight)); dlg.m_levelmax=dlg.m_levelmax>dlg.m_level[i]?dlg.m_levelmax:dlg.m_level[i]; }//以上为绘制灰度直方图 if(dlg.DoModal()==IDOK) { m_thredhold=new int; *m_thredhold=abs(dlg.m_quantization); m_wavetransform.DIBQuantize(lpDIB,lpDIBBits,m_thredhold); pDoc->SetModifiedFlag(TRUE); pDoc->UpdateAllViews(NULL); delete m_thredhold; } } else { CQuantizeColorDlg dlg; dlg.m_level=new double[256*3]; for(i=0;i<256*3;i++) dlg.m_level[i]=0; dlg.m_levelmax[0]=0; dlg.m_levelmax[1]=0; dlg.m_levelmax[2]=0; int ncolor; for(ncolor=0;ncolor<3;ncolor++) { lLineBytes = WIDTHBYTES(lWidth * 24);// 计算图像每行的字节数 // 从源图像中读取数据。 for(i = 0; i < lHeight; i++)// 每列 { for(j = 0; j < lWidth; j++)// 每行 { lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) +3*j+ncolor; // 指向DIB第i行,第j个象素的指针 dTemp = *(lpSrc); dlg.m_level[256*ncolor+int(dTemp)]++; } } } CString str; str.Format("%d",int(m_wavetransform.m_ColorMax[0])); dlg.m_bluemax=str; str.Format("%d",int(m_wavetransform.m_ColorMin[0])); dlg.m_bluemin=str; str.Format("%d",int(m_wavetransform.m_ColorMax[1])); dlg.m_greenmax=str; str.Format("%d",int(m_wavetransform.m_ColorMin[1])); dlg.m_greenmin=str; str.Format("%d",int(m_wavetransform.m_ColorMax[2])); dlg.m_redmax=str; str.Format("%d",int(m_wavetransform.m_ColorMin[2])); dlg.m_redmin=str; for(i=0;i<3;i++) { dlg.m_colormin[i]=m_wavetransform.m_ColorMin[i]; dlg.m_colormax[i]=m_wavetransform.m_ColorMax[i]; } for(ncolor=0;ncolor<3;ncolor++) { for(i=0;i<256;i++) { dlg.m_level[256*ncolor+i]/=(FLOAT(lWidth*lHeight)); dlg.m_levelmax[ncolor]=dlg.m_levelmax[ncolor]>dlg.m_level[256*ncolor+i]?dlg.m_levelmax[ncolor]:dlg.m_level[256*ncolor+i]; } }//以上为绘制真彩色直方图 if(dlg.DoModal()==IDOK) { m_thredhold=new int[3]; m_thredhold[0]=abs(dlg.m_blue); m_thredhold[1]=abs(dlg.m_green); m_thredhold[2]=abs(dlg.m_red); m_wavetransform.DIBQuantize(lpDIB,lpDIBBits,m_thredhold); pDoc->SetModifiedFlag(TRUE); pDoc->UpdateAllViews(NULL); delete m_thredhold; } } // 解除锁定 ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); } void CMyView::OnEncoding() { // TODO: Add your command handler code here CMyDoc* pDoc = GetDocument(); LPSTR lpDIB; // 指向DIB象素指针 LPSTR lpDIBBits; // 锁定DIB lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB()); // 找到DIB图像象素起始位置 lpDIBBits = ::FindDIBBits(lpDIB); //编码 double *m_level;//保存各个灰度级的频率 double dTemp; unsigned char* lpSrc;// 指向源图像的指针 LONG lLineBytes; // 图像每行的字节数 LONG lWidth,lHeight; lWidth=::DIBWidth(lpDIB); lHeight=::DIBHeight(lpDIB); LONG i,j;//循环变量 BeginWaitCursor(); if(::DIBNumColors(lpDIB)==256) { lLineBytes = WIDTHBYTES(lWidth * 8);// 计算图像每行的字节数 m_level=new double[256]; for(i=0;i<256;i++) m_level[i]=0; // 从源图像中读取数据。 for(i = 0; i < lHeight; i++)// 每列 { for(j = 0; j < lWidth; j++)// 每行 { lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) +j; // 指向DIB第i行,第j个象素的指针 dTemp =*(lpSrc); m_level[int(dTemp)]++; } } for(i=0;i<256;i++) { m_level[i]/=(FLOAT(lWidth*lHeight)); } // 创建对话框 CHaffmanDlg dlgPara; // 初始化变量值 dlgPara.m_fFreq = m_level; dlgPara.m_iColorNum = 256; // 显示对话框 dlgPara.DoModal(); delete m_level; } else { m_level=new double[256*3]; for(i=0;i<256*3;i++) m_level[i]=0; int ncolor; for(ncolor=0;ncolor<3;ncolor++) { lLineBytes = WIDTHBYTES(lWidth * 24);// 计算图像每行的字节数 // 从源图像中读取数据。 for(i = 0; i < lHeight; i++)// 每列 { for(j = 0; j < lWidth; j++)// 每行 { lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) +3*j+ncolor; // 指向DIB第i行,第j个象素的指针 dTemp = *(lpSrc); m_level[256*ncolor+int(dTemp)]++; } } } for(ncolor=0;ncolor<3;ncolor++) { for(i=0;i<256;i++) { m_level[256*ncolor+i]/=(FLOAT(lWidth*lHeight*3)); } } //将具有相同灰度级的红、绿、蓝通道的频率加起来作为这一灰度级的频率进行编码。 for(i=0;i<256;i++) { m_level[i]+=m_level[256+i]; m_level[i]+=m_level[256*2+i]; } // 创建对话框 CHaffmanDlg dlgPara; // 初始化变量值 dlgPara.m_fFreq = m_level; dlgPara.m_iColorNum = 256; // 显示对话框 dlgPara.DoModal(); delete m_level; } EndWaitCursor(); // 解除锁定 ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); } void CMyView::OnDecoding() { // TODO: Add your command handler code here CMyDoc* pDoc = GetDocument(); LPSTR lpDIB; // 指向DIB象素指针 LPSTR lpDIBBits; // 锁定DIB lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB()); // 找到DIB图像象素起始位置 lpDIBBits = ::FindDIBBits(lpDIB); //解码 //实现过程 pDoc->SetModifiedFlag(TRUE); pDoc->UpdateAllViews(NULL); // 解除锁定 ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); } void CMyView::OnDiscompression() { // TODO: Add your command handler code here CMyDoc* pDoc = GetDocument(); LPSTR lpDIB; // 指向DIB象素指针 LPSTR lpDIBBits; // 锁定DIB lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB()); // 找到DIB图像象素起始位置 lpDIBBits = ::FindDIBBits(lpDIB); //重建 m_wavetransform.DIBDisWavelet(lpDIB,lpDIBBits,Lr,Hr,FWidth,m_nLevel); pDoc->SetModifiedFlag(TRUE); pDoc->UpdateAllViews(NULL); // 解除锁定 ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); }