www.pudn.com > wavelet123.rar > WaveletDoc.cpp


// WaveletDoc.cpp : implementation of the CWaveletDoc class 
// 
 
#include "stdafx.h" 
#include "Wavelet.h" 
 
#include "WaveletDoc.h" 
#include "BmpHeader.h" 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
/////////////// 
#include "conio.h" 
#include "string.h" 
#include "dos.h" 
#include "stdio.h" 
#include "stdlib.h" 
#include "math.h" 
#include "malloc.h" 
#include "time.h" 
#include "process.h" 
#include "float.h" 
 
#define DD 23 
const double h[DD]={-0.002,-0.003,0.006,0.006,-0.013,-0.012,0.030,0.023,-0.078,-0.035,0.307,0.542,0.307,-0.035,-0.078,0.023,0.030,-0.012,-0.013,0.006,0.006,-0.003,-0.002}; 
const double g[DD]={0.002,-0.003,-0.006,0.006,0.013,-0.012,-0.030,0.023,0.078,-0.035,-0.307,0.542,-0.307,-0.035,0.078,0.023,-0.030,-0.012,0.013,0.006,-0.006,-0.003,0.002}; 
double hi[DD],gi[DD];  
/////////////// 
///////////////////////////////////////////////////////////////////////////// 
// CWaveletDoc 
 
IMPLEMENT_DYNCREATE(CWaveletDoc, CDocument) 
 
BEGIN_MESSAGE_MAP(CWaveletDoc, CDocument) 
	//{{AFX_MSG_MAP(CWaveletDoc) 
		// NOTE - the ClassWizard will add and remove mapping macros here. 
		//    DO NOT EDIT what you see in these blocks of generated code! 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CWaveletDoc construction/destruction 
 
CWaveletDoc::CWaveletDoc() 
{ 
	// TODO: add one-time construction code here 
	ReadOk=FALSE; 
 
} 
 
CWaveletDoc::~CWaveletDoc() 
{ 
	 
} 
 
BOOL CWaveletDoc::OnNewDocument() 
{ 
	if (!CDocument::OnNewDocument()) 
		return FALSE; 
 
	// TODO: add reinitialization code here 
	// (SDI documents will reuse this document) 
 
	return TRUE; 
} 
 
 
 
///////////////////////////////////////////////////////////////////////////// 
// CWaveletDoc serialization 
 
void CWaveletDoc::Serialize(CArchive& ar) 
{ 
	CString s; 
	int i,j; 
	//double fBmp[256][256]; 
	Byte** ppbImage=(Byte**)malloc(256*sizeof(Byte*)); 
    double** ppfImage=(double**)malloc(256*sizeof(double*)); 
    for(i=0;i<256;i++) 
	{ 
		ppfImage[i]=(double*)malloc(256*sizeof(double)); 
		ppbImage[i]=(Byte*)malloc(256*sizeof(Byte)); 
	} 
 
	int iWidth=256; 
	int iHeight=256; 
    int J=3;    //level numbers 
//    int iHeightNew; 
	//////// 
	if (ar.IsStoring()) 
	{ 
		// TODO: add storing code here 
	} 
	else 
	{ 
	    ar.Read(&(MyBmp.Header),sizeof(BmpHeader)); 
		//s.Format("%d",CmpHeader()); 
        //s.Format("0x%x",MyBmp.Header.HeaderSize); 
		//AfxMessageBox(s); 
		if(CmpHeader()==0) 
		{ 
			ar.Read(&(MyBmp.Palettes),sizeof(DWORD)*256); 
            ar.Read(&(MyBmp.Pix),sizeof(unsigned char)*256*256); 
			ReadOk=TRUE; 
 
            for(i=0;i<256;i++) 
				for(j=0;j<256;j++) 
				{	 
					ppfImage[i][j]=(double)MyBmp.Pix[i][j]; 
				} 
  
             for(i=0;i<256;i++) 
			 for(j=0;j<256;j++) 
			 { 
		     	 ppbImage[i][j]=MyBmp.Pix[i][j]; 
			 } 
///////////////////////// 
        GetMultiWT(ppbImage,iWidth,iHeight,ppfImage,J); 
		for(i=0;i<256;i++) 
			for(j=0;j<256;j++) 
			{ 
		     	 MyfBmp[i][j]=(Byte)ppfImage[i][j]; 
			} 
        coef(); 
        GetMultiIWT(iWidth,iHeight,ppfImage,J); 
        fImageTObImage(ppfImage,iWidth,iHeight,ppbImage); 
		for(i=0;i<256;i++) 
			 for(j=0;j<256;j++) 
			 { 
		     	 MyBmp.Pix[i][j]=ppbImage[i][j]; 
				  
			 } 
	//OutPicData (iWidth,iHeight,ppbImage,EncodeImage); 
//    OutData(iWidth,iHeight,ppbImage,EncodeImage); 
//    GetFree(iWidth,(void**)ppbImage); 
  //  GetFree(iWidth,(void**)ppfImage); 
///////////////////////// 
		} 
		else 
		{ 
			AfxMessageBox("It's not BMP Gray file with size 256*256!"); 
			return; 
		} 
	} 
	free(ppbImage); 
	free(ppfImage); 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CWaveletDoc diagnostics 
 
#ifdef _DEBUG 
void CWaveletDoc::AssertValid() const 
{ 
	CDocument::AssertValid(); 
} 
 
void CWaveletDoc::Dump(CDumpContext& dc) const 
{ 
	CDocument::Dump(dc); 
} 
#endif //_DEBUG 
 
///////////////////////////////////////////////////////////////////////////// 
// CWaveletDoc commands 
 
int CWaveletDoc::CmpHeader() 
{ 
BmpHeader* p=&(MyBmp.Header); 
if(p->Identi[0]!='B')  return 1; 
if(p->Identi[1]!='M')  return 1; 
if(p->DataOffset!=0x436) return 2; 
if(p->HeaderSize!=40) return 3; 
if(p->Width!=256) return 4; 
if(p->Height!=256) return 5; 
if(p->BitsPerPix!=8) return 6; 
if(p->Compression!=0) return 7; 
if(p->Colors!=0&&p->Colors!=256) return 8; 
return 0; 
} 
 
 
void CWaveletDoc::GetMultiWT(Byte **ppbImage, int iWidth, int iHeight, double** ppfImage, int J) 
{ 
	int iRow,iCol; 
//    int i,j; 
	int k; 
    wt(0,0,iWidth,iHeight,iWidth,iHeight,ppbImage,ppfImage); 
    iRow=iWidth;  
	iCol=iHeight; 
    for(k=2;k<=J;k++) 
     { 
       iRow/=2;  
	   iCol/=2; 
       fwt(0,0,iRow,iCol,iRow,iCol,ppfImage,ppfImage); 
     }  
 
} 
 
void CWaveletDoc::wt(int startx, int starty, int xs, int ys, long xsize, long ysize, Byte** image, double** ppfImage) 
{ 
	int i,j,k,n; 
    double temp1,temp2; 
    double* bufferx; 
    double* buffery; 
    if((bufferx=(double*)malloc(xs*sizeof(double)))==(double*)NULL) 
	{ 
	     AfxMessageBox("No memory!"); 
         return; 
    } 
    if((buffery=(double*)malloc(ys*sizeof(double)))==(double*)NULL) 
    {                
	     AfxMessageBox("No memory!"); 
         return; 
	} 
//to filter in the horizonal direction 
   for(n=starty;n=xsize) x=xsize*2-x-2; 
    return(x); 
 
} 
 
void CWaveletDoc::coef() 
{ 
	 
	int i; 
    for(i=0;i255)  fTemp=255; 
         ppbImage[i][j]=(int)fTemp; 
         } 
 
} 
 
void CWaveletDoc::GetMultiIWT(int iWidth, int iHeight, double **ppfImage, int J) 
{ 
	int iRow,iCol,k; 
    //int i,j; 
    iRow=(int)(iWidth/pow(2,J));  
	iCol=(int)(iHeight/pow(2,J)); 
    for(k=1;k<=J;k++) 
      { 
       iRow*=2;  
	   iCol*=2; 
       iwt(iRow,iCol,iRow,iCol,ppfImage); 
     }  
 
} 
 
void CWaveletDoc::iwt(int xs, int ys, long xsize, long ysize, double **image) 
{ 
   	 int i,j,k,n; 
     double temp1,temp2; 
     double* buffer1; 
     double* buffer2; 
     if((buffer1=(double*)malloc(ysize*sizeof(double)))==(double*)NULL) 
     {               
			printf("1: no memery\n"); 
            exit(1); 
     } 
     if((buffer2=(double*)malloc(ysize*sizeof(double)))==(double*)NULL) 
     {               
		printf("2: no memery\n"); 
        exit(1); 
	 } 
	//to filter in the vertical direction 
     for(n=0;n