www.pudn.com > 图像处理源代码.rar > Task4.cpp


// Task4.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "tuxiang.h" 
#include "Task4.h" 
#include "image.h" 
#include "imgview.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CTask4 property page 
 
IMPLEMENT_DYNCREATE(CTask4, CPropertyPage) 
 
CTask4::CTask4() : CPropertyPage(CTask4::IDD) 
{ 
	//{{AFX_DATA_INIT(CTask4) 
		// NOTE: the ClassWizard will add member initialization here 
	//}}AFX_DATA_INIT 
} 
 
CTask4::~CTask4() 
{ 
} 
 
void CTask4::DoDataExchange(CDataExchange* pDX) 
{ 
	CPropertyPage::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CTask4) 
		// NOTE: the ClassWizard will add DDX and DDV calls here 
	//}}AFX_DATA_MAP 
} 
 
 
BEGIN_MESSAGE_MAP(CTask4, CPropertyPage) 
	//{{AFX_MSG_MAP(CTask4) 
	ON_BN_CLICKED(IDOPEN, OnOpen) 
	ON_BN_CLICKED(IDCLOSE, OnClose) 
	ON_BN_CLICKED(IDSHARP, OnSharp) 
	ON_BN_CLICKED(IDSMOOTH, OnSmooth) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
extern MYIMAGE* pImage; 
extern CImgView *m_ImgView; 
 
///////////////////////////////////////////////////////////////////////////// 
// CTask4 message handlers 
 
 
void CTask4::OnOpen()  
{ 
	if(m_ImgView!=NULL) m_ImgView->ShowWindow (SW_HIDE); 
	if(pImage!=NULL) 
		delete pImage; 
 
	static char BASED_CODE szFilter[] = "图象文件 (*.bmp)|*.bmp"; 
	CString sFileName; 
 
	//显示一个Open File Dialog 
	CFileDialog	opendlg(TRUE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,szFilter,NULL); 
	int choice=opendlg.DoModal(); 
	if(choice!=IDOK)	//未选择文件,则返回 
		return; 
 
	//读取文件名 
	sFileName=opendlg.GetPathName(); 
	if(opendlg.GetFileExt()=="bmp") 
		pImage=ReadBmp(sFileName,this->m_hWnd); 
	if(m_ImgView==NULL) m_ImgView=new CImgView(pImage,this); 
	else m_ImgView->img = pImage; 
 
	m_ImgView->ShowWindow (SW_SHOWNORMAL); 
	m_ImgView->DisplayImage(); 
} 
 
void CTask4::OnClose()  
{ 
	// TODO: Add your control notification handler code here 
	if(m_ImgView!=NULL) 
	{ 
		m_ImgView->EndDialog(IDOK); 
		m_ImgView=NULL; 
	} 
	if(pImage!=NULL) 
	{ 
		delete pImage; 
		pImage=NULL; 
	}	 
	 
} 
 
void CTask4::OnSharp()  
{ 
	if(pImage==NULL){ 
		MessageBox("当前无图象显示。"); 
		return; 
	} 
	 
	BYTE* old_imgdata;	// 保存原图象数据以供计算时使用 
	unsigned int imgsize;	//图象数据总字节数 
 
	if(pImage->BitCount == 24) 
		imgsize = pImage->Height * pImage->Width * 3; 
	else 
		imgsize = pImage->Height * pImage->Width; 
	 
	old_imgdata=new BYTE[imgsize]; 
	memcpy(old_imgdata,pImage->ImgData,imgsize); 
 
	//利用Laplace算子实现锐化,计算公式为 
	//f(i,j)=5f(i,j)-f(i,j-1)-f(i,j+1)-f(i-1,j)-f(i+1,j) 
	for(int vert=1;vertHeight -1;vert++) 
		for(int hori=1;horiWidth -1;hori++) 
			pImage->ImgData[vert * pImage->Width + hori] = 
					old_imgdata[vert * pImage->Width + hori ] * 5 - 
					old_imgdata[vert * pImage->Width + hori + 1 ] - 
					old_imgdata[vert * pImage->Width + hori - 1 ] - 
					old_imgdata[(vert + 1) * pImage->Width + hori ] - 
					old_imgdata[(vert - 1) * pImage->Width + hori ] ; 
	delete old_imgdata; 
 
	::SendMessage(m_ImgView->m_hWnd,WM_PAINT,0,0); 
} 
 
int compareByte( const void *arg1, const void *arg2 ) 
{ 
	return(*(BYTE*)arg1 - *(BYTE*)arg2); 
} 
 
void CTask4::OnSmooth()  
{ 
	if(pImage==NULL){ 
		MessageBox("当前无图象显示。"); 
		return; 
	} 
 
	BYTE* old_imgdata;	// 保存原图象数据以供计算时使用 
	unsigned int imgsize;	//图象数据总字节数 
 
	if(pImage->BitCount == 24) 
		imgsize = pImage->Height * pImage->Width * 3; 
	else 
		imgsize = pImage->Height * pImage->Width; 
	 
	old_imgdata=new BYTE[imgsize]; 
	memcpy(old_imgdata,pImage->ImgData,imgsize); 
 
	BYTE tmp[5]; 
 
	//利用中值滤波法实现平滑 
	for(int vert=1;vertHeight -1;vert++) 
		for(int hori=1;horiWidth -1;hori++) 
		{ 
			tmp[0] = old_imgdata[vert * pImage->Width + hori ]; 
			tmp[1] = old_imgdata[vert * pImage->Width + hori + 1 ]; 
			tmp[2] = old_imgdata[vert * pImage->Width + hori - 1 ]; 
			tmp[3] = old_imgdata[(vert + 1) * pImage->Width + hori ]; 
			tmp[4] = old_imgdata[(vert - 1) * pImage->Width + hori ]; 
			qsort(tmp,5,1,compareByte); 
			pImage->ImgData[vert * pImage->Width + hori] = tmp[2]; 
			//采用均值代替中值的速度较快。 
/*			pImage->ImgData[vert * pImage->Width + hori] = ( 
					old_imgdata[vert * pImage->Width + hori ]+ 
					old_imgdata[vert * pImage->Width + hori + 1 ]+ 
					old_imgdata[vert * pImage->Width + hori - 1 ]+ 
					old_imgdata[(vert + 1) * pImage->Width + hori ]+ 
					old_imgdata[(vert - 1) * pImage->Width + hori ])/5;*/ 
		} 
	delete old_imgdata; 
 
	::SendMessage(m_ImgView->m_hWnd,WM_PAINT,0,0); 
}