www.pudn.com > VQ_Final.rar > Step3.cpp


// Step3.cpp : implementation file 
// 
 
#include "afxwin.h" 
#include "afxctl.h" 
#include "resource.h" 
#include "Step3.h" 
#include "math.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
UINT OutPut(LPVOID ptr); 
///////////////////////////////////////////////////////////////////////////// 
// CStep3 property page 
 
IMPLEMENT_DYNCREATE(CStep3, CPropertyPage) 
 
CStep3::CStep3() : CPropertyPage(CStep3::IDD) 
{ 
	//{{AFX_DATA_INIT(CStep3) 
		// NOTE: the ClassWizard will add member initialization here 
	//}}AFX_DATA_INIT 
} 
 
CStep3::~CStep3() 
{ 
} 
 
void CStep3::DoDataExchange(CDataExchange* pDX) 
{ 
	CPropertyPage::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CStep3) 
	DDX_Control(pDX, IDC_SNR, m_sSNR); 
	DDX_Control(pDX, IDC_PRGOUT, m_prgOut); 
	DDX_Control(pDX, IDC_OUTINFO, m_sOutInfo); 
	//}}AFX_DATA_MAP 
} 
 
 
BEGIN_MESSAGE_MAP(CStep3, CPropertyPage) 
	//{{AFX_MSG_MAP(CStep3) 
	ON_BN_CLICKED(IDC_OUT, OnOut) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CStep3 message handlers 
 
BOOL CStep3::OnSetActive()  
{ 
 
	m_pSheet->SetWizardButtons(0);	 
	return CPropertyPage::OnSetActive(); 
} 
 
void CStep3::OnOut()  
{ 
	char szFilters[]="位图文件 (*.bmp)|*.bmp|"; 
	CString t; 
	t=m_pSheet->m_sTitle+"的VQ结果.bmp"; 
	CFileDialog dlg(FALSE,"bmp",t,OFN_HIDEREADONLY,szFilters,this); 
	if( dlg.DoModal()==IDOK) 
	{ 
		m_pSheet->m_sOut = dlg.GetPathName(); 
 
		m_prgOut.SetRange(0,100); 
		m_prgOut.SetPos(0); 
		 
		GetDlgItem(IDC_OUT)->EnableWindow(FALSE); 
		//启动输出结果线程 
		m_pThread=AfxBeginThread(OutPut,(LPVOID)this,THREAD_PRIORITY_NORMAL,0,0,NULL);	 
 
    } 
} 
UINT OutPut(LPVOID ptr)	//输出结果 
{ 
	CStep3 *pDlg=(CStep3 *)ptr; 
	CFile fOut,fBmp; 
	ULONG lOffset,lWidth,lWidth1,lHeight,lHeight1,lReal,lReal1; 
	UINT i,j,m,k,l,nStart; 
	BYTE bTemp,bZero=(BYTE)0; 
	ULONG nMSE=0;	//均方误差	 
	//先读文件头 
	CFileException e; 
	if (!fBmp.Open(pDlg->m_pSheet->m_sFile,CFile::modeRead,&e)) 
	{ 
		e.ReportError(); 
		return 1; 
	} 
	fBmp.Seek(0x0a,CFile::begin); 
	fBmp.Read(&lOffset,sizeof(ULONG)); 
	fBmp.Seek(0x12,CFile::begin); 
	fBmp.Read(&lWidth1,sizeof(ULONG)); 
	fBmp.Seek(0x16,CFile::begin); 
	fBmp.Read(&lHeight1,sizeof(ULONG)); 
	lReal1=lWidth1*lHeight1*3; 
 
	//以下输出文件  
	pDlg->m_sOutInfo.SetWindowText("正在输出文件..."); 
	 
	if (!fOut.Open(pDlg->m_pSheet->m_sOut,CFile::modeCreate|CFile::modeWrite,&e)) 
	{ 
		e.ReportError(); 
		return 1; 
	} 
	fBmp.SeekToBegin(); 
	for (i=0;im_pSheet->m_nNum,nPoints=pDlg->m_pSheet->m_nPoints,nPoints1=pDlg->m_pSheet->m_nPoints1; 
	UINT nReal=pDlg->m_pSheet->m_nReal,nVectors=pDlg->m_pSheet->m_nVectors; 
	BYTE *pBook=pDlg->m_pSheet->m_pBook,*pData=pDlg->m_pSheet->m_pData,b1,b2,b3,d1,d2,d3; 
	WORD *pVQ=pDlg->m_pSheet->m_pVQ,nIndex; 
 
	lWidth=lWidth1+(lWidth1%nPoints1==0 ? 0 : nPoints1-lWidth1%nPoints1);	 
	lHeight=lHeight1+(lHeight1%nPoints1==0 ? 0  : nPoints1-lHeight1%nPoints1); 
	lReal=lWidth*lHeight*3; 
	//以下写输出文件的数据部分 
 
	BYTE *pTemp=new BYTE[nNum*nPoints*3]; 
	for (i=0,k=0;im_bStopThread)	//若终止线程 
				return 1; 
		} 
		pDlg->m_prgOut.SetPos(i*10/nNum);		 
	} 
	nMSE/=nReal;	//再对误差取平均,平均到每个字节 
 
	for(i=0,m=0;im_pSheet->m_pOrgData[i*lWidth*nPoints1*3+j*nPoints1*3+k*lWidth*3+l] 
						=pTemp[m]; 
					m++; 
					pDlg->m_prgOut.SetPos(10+m*40/(nNum*nPoints*3)); 
					if (pDlg->m_bStopThread)	//若终止线程 
						return 1; 
				} 
			} 
		} 
	} 
	 
	delete[] pTemp; 
 
	for (j=0;jm_pSheet->m_pData[j*lWidth1*3+i*3+k]=pDlg->m_pSheet->m_pOrgData[j*lWidth*3+i*3+k]; 
					if (pDlg->m_bStopThread)	//若终止线程 
						return 1; 
				} 
 
	for (i=0,nStart=0;im_pSheet->m_pData+i,sizeof(BYTE)); 
		pDlg->m_prgOut.SetPos(50+i*50/lReal); 
		nStart++; 
		if (nStart==lWidth*3)	//同样要把每行的字节数补成4的倍数 
		{ 
			UINT k; 
			for (k=0;km_pSheet->m_nSkip;k++) 
			{ 
				fOut.Write(&bZero,sizeof(BYTE)); 
			} 
			nStart=0; 
		} 
		if (pDlg->m_bStopThread)	//若终止线程 
			return 1; 
	} 
	fOut.Close(); 
			 
	//以下输出量化信噪比 
	CString t; 
	if (nMSE==0) 
		t.Format("量化过程中无失真,故信噪比无穷大。"); 
	else 
		t.Format("量化信噪比:%4.2fdB",10*log10((double)255*255/nMSE)); 
	pDlg->m_sSNR.SetWindowText(t); 
 
	//完了 
	pDlg->m_sOutInfo.SetWindowText("VQ结果已经输出。"); 
	pDlg->m_prgOut.SetPos(100); 
	(CButton *)(pDlg->GetDlgItem(IDC_OUT))->EnableWindow(FALSE); 
	pDlg->m_pSheet->SetWizardButtons(PSWIZB_FINISH);	 
	return 0; 
} 
 
BOOL CStep3::OnQueryCancel()  
{ 
	if (m_pThread) 
	{ 
		m_bStopThread=TRUE; 
		m_sOutInfo.SetWindowText("正在结束线程......"); 
		 
		WaitForSingleObject(m_pThread->m_hThread,1); 
	}	 
	return CPropertyPage::OnQueryCancel(); 
} 
 
BOOL CStep3::OnWizardFinish()  
{ 
	//若用户点“完成”,则说明量化已经完全成功 
	m_pSheet->m_bSucceed=TRUE;	 
	return CPropertyPage::OnWizardFinish(); 
}