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