⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bmpdemoview.cpp

📁 主要是应用VC进行傅立叶变换和反变换的程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// bmpDemoView.cpp : implementation of the CBmpDemoView class
//

#include "stdafx.h"
#include "bmpDemo.h"

#include "bmpDemoDoc.h"
#include "bmpDemoView.h"
#include "memBitmap.h"
#include "mmsystem.h"

#include "stdio.h"
#include "MainFrm.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif


/////////////////////////////////////////////////////////////////////////////
// CBmpDemoView

IMPLEMENT_DYNCREATE(CBmpDemoView, CScrollView)

BEGIN_MESSAGE_MAP(CBmpDemoView, CScrollView)
	//{{AFX_MSG_MAP(CBmpDemoView)
	ON_COMMAND(ID_HCHANGE, OnHchange)
	ON_WM_SIZE()
	ON_COMMAND(ID_LARGEN, OnLargen)
	ON_COMMAND(ID_LESSEN, OnLessen)
	ON_COMMAND(ID_REVERT, OnRevert)
	ON_COMMAND(ID_VCHANGE, OnVchange)
	ON_COMMAND(ID_CW, OnCw)
	ON_COMMAND(ID_CCW, OnCcw)
	ON_COMMAND(ID_MODULE, OnModule)
	ON_COMMAND(ID_GRAYIZE, OnGrayize)
	ON_COMMAND(ID_HISTOGRAM, OnHistogram)
	ON_COMMAND(ID_ZFTJHS, OnZftjhs)
	ON_COMMAND(ID_BRIGHTEN, OnBrighten)
	ON_COMMAND(ID_DARKEN, OnDarken)
	ON_COMMAND(ID_DFT, OnDft)
	ON_COMMAND(ID_NDFT, OnNdft)
	ON_COMMAND(ID_FFT, OnFft)
	ON_COMMAND(ID_NFFT, OnNfft)
	ON_COMMAND(ID_HPFILTER, OnHpfilter)
	ON_COMMAND(ID_LPFILTER, OnLpfilter)
	ON_COMMAND(ID_BPFILTER, OnBpfilter)
	ON_UPDATE_COMMAND_UI(ID_EDIT_UNDO, OnUpdateEditUndo)
	ON_COMMAND(ID_EDIT_UNDO, OnEditUndo)
	ON_WM_MOUSEMOVE()
	ON_COMMAND(ID_THPFILTER, OnThpfilter)
	ON_COMMAND(ID_TLPFILTER, OnTlpfilter)
	ON_COMMAND(ID_EXPHPFILTER, OnExphpfilter)
	ON_COMMAND(ID_EXPLPFILTER, OnExplpfilter)
	ON_COMMAND(ID_ENLARGE, OnEnlarge)
	ON_UPDATE_COMMAND_UI(ID_NFFT, OnUpdateNfft)
	ON_UPDATE_COMMAND_UI(ID_NDFT, OnUpdateNdft)
	ON_WM_DESTROY()
	ON_COMMAND(ID_IMAGEPROPERTY, OnImageproperty)
	ON_COMMAND(ID_NEGATIVE, OnNegative)
	ON_COMMAND(ID_SinNoise, OnSinNoise)
	ON_COMMAND(ID_SlowChange, OnSlowChange)
	ON_COMMAND(ID_ZhongZhiFilter, OnZhongZhiFilter)
	ON_COMMAND(ID_GreyDuiShuBianHuan, OnGreyDuiShuBianHuan)
	ON_COMMAND(ID_ROTATE, OnRotate)
	ON_COMMAND(ID_RandomShow, OnRandomShow)
	ON_WM_KEYDOWN()
	ON_COMMAND(ID_TestFunction, OnTestFunction)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CScrollView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CBmpDemoView construction/destruction

CBmpDemoView::CBmpDemoView()
{
	// TODO: add construction code here
	flag=FALSE;
	ToolStatus=ARROW;
}

CBmpDemoView::~CBmpDemoView()
{
}

BOOL CBmpDemoView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs
	return CScrollView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CBmpDemoView drawing

void CBmpDemoView::OnDraw(CDC* pDC)
{
	CBmpDemoDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	CRect r;
	GetClientRect(&r);
	CPoint p=GetScrollPosition();
	r.right+=p.x;
	r.bottom+=p.y;
	CBrush brush(RGB(0,0,0));
	pDC->FillRect(&r,&brush);
	int width=r.right-r.left;
	int height=r.bottom-r.top;
	OriX=width-pDoc->m_mViewBmp.GetWidth();
	OriY=height-pDoc->m_mViewBmp.GetHeight();
	OriX/=2;
	OriY/=2;
	OriX=OriX>0?OriX:0;
	OriY=OriY>0?OriY:0;
	pDoc->m_mViewBmp.Display(OriX,OriY,pDC); 

/*	OriX=width-pDoc->m_mBmp.GetDispWidth();
	OriY=height-pDoc->m_mBmp.GetDispHeight();
	OriX/=2;
	OriY/=2;
	OriX=OriX>0?OriX:0;
	OriY=OriY>0?OriY:0;
	pDoc->m_mBmp.Display(OriX,OriY,pDoc->m_mBmp.GetDispWidth(),pDoc->m_mBmp.GetDispHeight(),pDC); 
*/
	// TODO: add draw code for native data here
}

/////////////////////////////////////////////////////////////////////////////
// CBmpDemoView printing

BOOL CBmpDemoView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CBmpDemoView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CBmpDemoView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CBmpDemoView diagnostics

#ifdef _DEBUG
void CBmpDemoView::AssertValid() const
{
	CScrollView::AssertValid();
}

void CBmpDemoView::Dump(CDumpContext& dc) const
{
	CScrollView::Dump(dc);
}

CBmpDemoDoc* CBmpDemoView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CBmpDemoDoc)));
	return (CBmpDemoDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CBmpDemoView message handlers

BOOL CBmpDemoView::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext) 
{
	// TODO: Add your specialized code here and/or call the base class
	
	if(!CWnd::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext))
		return FALSE;
	return TRUE;
}

void CBmpDemoView::OnInitialUpdate() 
{
	CScrollView::OnInitialUpdate();
	// TODO: Add your specialized code here and/or call the base class
	CBmpDemoDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if(pDoc->GetPathName()=="\0")return;
	int cx=pDoc->m_mBmp.GetDispWidth();
	int cy=pDoc->m_mBmp.GetDispHeight();
	CWnd *pwnd=GetParent();
	CRect r1;
	r1.left=0;	r1.right=cx;
	r1.top=0;	r1.bottom=cy;
	pwnd->CalcWindowRect(&r1,1);
	int x1,y1;
	x1=r1.right-r1.left+4;
	y1=r1.bottom-r1.top+4;
	CWnd *frame=pwnd->GetParent();
	frame->GetClientRect(&r1);
	x1=min(x1,(r1.right-r1.left)*2/3);
	y1=min(y1,(r1.bottom-r1.top)*5/6);
	pwnd->SetWindowPos(&wndTop,0,0,x1,y1,SWP_NOMOVE);
	CSize size;
	size.cx=cx-1;
	size.cy=cy-1;
	SetScrollSizes(MM_TEXT,size);
}

void CBmpDemoView::SetScroll() 
{
	CBmpDemoDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if(pDoc->GetPathName()=="\0")return;
	int cx=pDoc->m_mBmp.GetDispWidth();
	int cy=pDoc->m_mBmp.GetDispHeight();
	CSize size;
	size.cx=cx-1;
	size.cy=cy-1;
	SetScrollSizes(MM_TEXT,size);
}

void CBmpDemoView::OnHchange() 
{
	// TODO: Add your command handler code here
	CBmpDemoDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	pDoc->OnHchange();
	CRect r;
	GetClientRect(&r);
	SetScroll();
	InvalidateRect(&r,TRUE);
	UpdateWindow(); 	
}

void CBmpDemoView::OnSize(UINT nType, int cx, int cy) 
{
	ViewWidth=cx;
	ViewHeight=cy;
	CScrollView::OnSize(nType, cx, cy);
	// TODO: Add your message handler code here
}

void CBmpDemoView::OnLargen() 
{
	// TODO: Add your command handler code here
	CBmpDemoDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	BeginWaitCursor();
	pDoc->m_mBmp.SetScale(1);
	pDoc->m_mBmp.DataToView(pDoc->m_mViewBmp);
	CRect r;
	GetClientRect(&r);
	SetScroll();
	InvalidateRect(&r,TRUE);
	UpdateWindow(); 	

    CStatusBar* pStatus=(CStatusBar*)
	      AfxGetApp()->m_pMainWnd->GetDescendantWindow(AFX_IDW_STATUS_BAR);
	if(pStatus)
	{
		CString str;
		int x=(int)(pDoc->m_mBmp.GetScale()*100);
		str.Format("%i%%",x);
        pStatus->SetPaneText(3,str);
	}
	EndWaitCursor();
}

void CBmpDemoView::OnLessen() 
{
	// TODO: Add your command handler code here
	CBmpDemoDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);	
	BeginWaitCursor();
	pDoc->m_mBmp.SetScale(-1);
	pDoc->m_mBmp.DataToView(pDoc->m_mViewBmp);
	CRect r;
	GetClientRect(&r);
	SetScroll();
	InvalidateRect(&r,TRUE);
	UpdateWindow(); 	
    CStatusBar* pStatus=(CStatusBar*)
	      AfxGetApp()->m_pMainWnd->GetDescendantWindow(AFX_IDW_STATUS_BAR);
	if(pStatus)
	{
		CString str;
		int x=(int)(pDoc->m_mBmp.GetScale()*100);
		str.Format("%i%%",x);
        pStatus->SetPaneText(3,str);
	}
	EndWaitCursor();
}

void CBmpDemoView::OnRevert() 
{
	// TODO: Add your command handler code here
	BeginWaitCursor();
	CBmpDemoDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	float s=pDoc->m_mBmp.GetScale();
	pDoc->OnRevert();
	pDoc->m_mBmp.SetScale(s);
	CRect r;
	GetClientRect(&r);
	SetScroll();
	InvalidateRect(&r,TRUE);
	UpdateWindow(); 		
	EndWaitCursor();
}

void CBmpDemoView::OnVchange() 
{
	// TODO: Add your command handler code here
	CBmpDemoDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	pDoc->OnVchange();
	CRect r;
	GetClientRect(&r);
	SetScroll();
	InvalidateRect(&r,TRUE);
	UpdateWindow(); 		
}

void CBmpDemoView::OnCw() 
{
	// TODO: Add your command handler code here
	CBmpDemoDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	pDoc->OnCw();
	CRect r;
	GetClientRect(&r);
	SetScroll();
	InvalidateRect(&r,TRUE);
	UpdateWindow(); 	
	PlaySound("bounce.wav",NULL,SND_FILENAME);
}

void CBmpDemoView::OnCcw() 
{
	// TODO: Add your command handler code here
	CBmpDemoDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	pDoc->OnCcw();
	CRect r;
	GetClientRect(&r);
	SetScroll();
	InvalidateRect(&r,TRUE);
	UpdateWindow(); 				
}

void CBmpDemoView::OnModule() 
{
	// TODO: Add your command handler code here
	CBmpDemoDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if(pDoc->m_ModuleDialog.DoModal()==IDOK)
	{
		BeginWaitCursor();
		pDoc->OnModule();
		CRect r;
		GetClientRect(&r);
		SetScroll();
		InvalidateRect(&r,TRUE);
		UpdateWindow(); 				
		EndWaitCursor();
	}
}

void CBmpDemoView::OnGrayize() 
{
	// TODO: Add your command handler code here
	CBmpDemoDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	pDoc->OnGrayize();
	CRect r;
	GetClientRect(&r);
	SetScroll();
	InvalidateRect(&r,TRUE);
	UpdateWindow(); 				
}

void CBmpDemoView::OnHistogram() 
{
	// TODO: Add your command handler code here
	CBmpDemoDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	pDoc->OnHistogram();
	class ZftDialog dlg1;
	dlg1.DoModal();
}

void CBmpDemoView::OnZftjhs() 
{
	// TODO: Add your command handler code here
	BeginWaitCursor();
	CBmpDemoDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	pDoc->OnZftjhs();
	CRect r;
	GetClientRect(&r);
	SetScroll();
	InvalidateRect(&r,TRUE);
	UpdateWindow();
	EndWaitCursor();
}

void CBmpDemoView::OnBrighten() 
{
	// TODO: Add your command handler code here
	CBmpDemoDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	pDoc->OnBrighten();
	CRect r;
	GetClientRect(&r);
	SetScroll();
	InvalidateRect(&r,TRUE);
	UpdateWindow();	
}

void CBmpDemoView::OnDarken() 
{
	// TODO: Add your command handler code here
	CBmpDemoDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	pDoc->OnDarken();
	CRect r;
	GetClientRect(&r);
	SetScroll();
	InvalidateRect(&r,TRUE);
	UpdateWindow();		
}

void CBmpDemoView::OnDft() 
{
	// TODO: Add your command handler code here
	BeginWaitCursor();
	CBmpDemoDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	pDoc->OnDft();
	CRect r;
	GetClientRect(&r);
	SetScroll();
	InvalidateRect(&r,TRUE);
	UpdateWindow();			
	EndWaitCursor();

/*	CBmpDemoDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

//直接做DFT,为教学之用
	BeginWaitCursor();
#define WIDTH 123				//定义图象宽度
#define HEIGHT 160				//定义图象高度
	Complex Wn1[WIDTH];			//水平方向的变换核
	Complex Wn2[HEIGHT];		//垂直方向的变换核
	Complex InData[HEIGHT][WIDTH];		//图象
//	Complex OutData[HEIGHT][WIDTH]; 	//变换结果
	int i,j,k;

	for(i=0;i<WIDTH;i++)	//预先计算水平方向的变换核
	{
		Wn1[i].Re =cos(-2.0*PIE*i/WIDTH);
		Wn1[i].Im =sin(-2.0*PIE*i/WIDTH);
	}
	for(i=0;i<HEIGHT;i++)	//预先计算垂直方向的变换核
	{
		Wn2[i].Re =cos(-2.0*PIE*i/HEIGHT);
		Wn2[i].Im =sin(-2.0*PIE*i/HEIGHT);
	}

	for(i=0;i<HEIGHT;i++)	//图象灰度转为数据
		for(j=0;j<WIDTH;j++)
		{
			COLORREF color=pDoc->m_mBmp.GetPixel(j,i);
			double r=(double)GetRValue(color);
			double g=(double)GetGValue(color);
			double b=(double)GetBValue(color);
			InData[i][j].Re =r*0.3+g*0.59+b*0.11;
			InData[i][j].Im =0;
		}

	for(i=0;i<HEIGHT;i++)			//频域移位半个周期
		for(j=0;j<WIDTH;j++)
			if((i+j)%2==1)InData[i][j]*=-1;

	Complex temp1[WIDTH],temp2[WIDTH];	//暂时保存变换数据
	for(k=0;k<HEIGHT;k++)			//在水平方向上做一维DFT
	{
		for(i=0;i<WIDTH;i++)		//取得指定行的数据
			temp1[i]=InData[k][i];
		for(i=0;i<WIDTH;i++)		//对该行做一维DFT
		{
			temp2[i].Re=temp2[i].Im=0;
			for(j=0;j<WIDTH;j++)
				temp2[i]+=temp1[j]*Wn1[(i*j)%WIDTH];
		}		
		for(i=0;i<WIDTH;i++)		//变换结果写回二维矩阵
			InData[k][i]=temp2[i]/sqrt(WIDTH);
	}

	Complex temp3[HEIGHT],temp4[HEIGHT];	//暂时保存变换数据
	for(k=0;k<WIDTH;k++)			//在垂直方向上做一维DFT
	{
		for(i=0;i<HEIGHT;i++)		//取得指定列的数据
			temp3[i]=InData[i][k];
		for(i=0;i<HEIGHT;i++)		//对该列做一维DFT
		{
			temp4[i].Re=temp4[i].Im=0;
			for(j=0;j<HEIGHT;j++)
				temp4[i]+=temp3[j]*Wn2[(i*j)%HEIGHT];
		}		
		for(i=0;i<HEIGHT;i++)		//变换结果写回二维矩阵
			InData[i][k]=temp4[i]/sqrt(HEIGHT);
	}
	
	for(i=0;i<HEIGHT;i++)	//数据化为图象
		for(j=0;j<WIDTH;j++)
		{
			double temp=InData[i][j].abs();
			if(temp>255)temp=255;
			COLORREF c=RGB((BYTE)temp,(BYTE)temp,(BYTE)temp);
			pDoc->m_mBmp.SetPixel(j,i,c);
		}
	CClientDC dc(this);
	pDoc->m_mBmp.Display(0,0,&dc);
	EndWaitCursor();
*/
}

void CBmpDemoView::OnNdft() 
{
	// TODO: Add your command handler code here
	BeginWaitCursor();
	CBmpDemoDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	pDoc->OnNdft();
	CRect r;
	GetClientRect(&r);
	SetScroll();
	InvalidateRect(&r,TRUE);
	UpdateWindow();				
	EndWaitCursor();
}

void CBmpDemoView::OnFft() 
{
	// TODO: Add your command handler code here
	BeginWaitCursor();
	CBmpDemoDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	pDoc->OnFft();
	CRect r;
	GetClientRect(&r);
	SetScroll();
	InvalidateRect(&r,TRUE);
	UpdateWindow();					
	EndWaitCursor();
}

void CBmpDemoView::OnNfft() 
{
	// TODO: Add your command handler code here
	BeginWaitCursor();
	CBmpDemoDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	pDoc->OnNfft();
	CRect r;
	GetClientRect(&r);
	SetScroll();
	InvalidateRect(&r,TRUE);
	UpdateWindow();						
	EndWaitCursor();
}

void CBmpDemoView::OnHpfilter() 
{
	// TODO: Add your command handler code here
	FilterDialog dlg1;
	dlg1.SetFlag(2);
	if(dlg1.DoModal()==IDOK)
	{
		BeginWaitCursor();
		CBmpDemoDoc* pDoc = GetDocument();
		ASSERT_VALID(pDoc);
		pDoc->OnHpfilter(dlg1.m_min);
		CRect r;
		GetClientRect(&r);
		SetScroll();
		InvalidateRect(&r,TRUE);
		UpdateWindow();						
		EndWaitCursor();
	}	
}

void CBmpDemoView::OnLpfilter() 
{
	// TODO: Add your command handler code here

	FilterDialog dlg1;
	dlg1.SetFlag(1);
	if(dlg1.DoModal()==IDOK)
	{
		BeginWaitCursor();
		CBmpDemoDoc* pDoc = GetDocument();
		ASSERT_VALID(pDoc);
		pDoc->OnLpfilter(dlg1.m_max);
		CRect r;
		GetClientRect(&r);
		SetScroll();
		InvalidateRect(&r,TRUE);
		UpdateWindow();						
		EndWaitCursor();
	}		
}

void CBmpDemoView::OnBpfilter() 
{
	// TODO: Add your command handler code here
	FilterDialog dlg1;
	dlg1.SetFlag(0);
	if(dlg1.DoModal()==IDOK)
	{
		BeginWaitCursor();
		CBmpDemoDoc* pDoc = GetDocument();
		ASSERT_VALID(pDoc);
		pDoc->OnBpfilter(dlg1.m_min,dlg1.m_max);
		CRect r;
		GetClientRect(&r);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -