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();
}