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

📄 demoview.cpp

📁 《数字图像处理与分析》光盘使用说明 本光盘主要包括两部分内容: 1、 作者编制的基于MATLAB和基于VC++实现的数字图像处理软件
💻 CPP
📖 第 1 页 / 共 4 页
字号:
// demoView.cpp : implementation of the CDemoView class
//

#include "stdafx.h"
#include "demo.h"

#include "demoDoc.h"
#include "demoView.h"
#include"math.h"
#include "MainFrm.h"

#include "transform.h"
#include "ZoomTimesDlg.h"
#include "RotateDlg.h"
#include "segment.h"
#include "MaskDlg.h"
#include "DefineMaskDlg.h"
#include "threshDlg.h"
#include "imgGrayTrans.h"
#include "linearStretch.h"
#include "morphologyDlg.h"
#include "morphology.h"

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

/////////////////////////////////////////////////////////////////////////////
// CDemoView

IMPLEMENT_DYNCREATE(CDemoView, CScrollView)

BEGIN_MESSAGE_MAP(CDemoView, CScrollView)
	//{{AFX_MSG_MAP(CDemoView)
	ON_COMMAND(ID_SOBEL, OnSobel)
	ON_COMMAND(id_FFT, OnFft)
	ON_COMMAND(id_IFFT, OnIfft)
	ON_COMMAND(id_Zoom, OnZoom)
	ON_COMMAND(id_RotateTrans, OnRotateTrans)
	ON_COMMAND(ID_Robot, OnRobot)
	ON_COMMAND(id_prewitt, Onprewitt)
	ON_COMMAND(id_Laplacian, OnLaplacian)
	ON_COMMAND(id_MeanFilter, OnMeanFilter)
	ON_COMMAND(id_MidleFilter, OnMidleFilter)
	ON_COMMAND(id_ThreshSegment, OnThreshSegment)
	ON_COMMAND(id_DajinThresh, OnDajinThresh)
	ON_COMMAND(id_ImgReverse, OnImgReverse)
	ON_COMMAND(id_RGBToGray, OnRGBToGray)
	ON_COMMAND(id_linearTrans, OnlinearTrans)
	ON_COMMAND(id_histAver, OnhistAver)
	ON_COMMAND(id_ErosionErzhi, OnErosionErzhi)
	ON_COMMAND(id_ErzhiExpand, OnErzhiExpand)
	ON_COMMAND(id_ErzhiOpen, OnErzhiOpen)
	ON_COMMAND(id_ErzhClose, OnErzhClose)
	ON_COMMAND(id_GrayErose, OnGrayErose)
	ON_COMMAND(id_GrayExpand, OnGrayExpand)
	ON_COMMAND(id_GrayOpen, OnGrayOpen)
	ON_COMMAND(id_GreyClose, OnGreyClose)
	ON_COMMAND(id_MorphologyGrad, OnMorphologyGrad)
	ON_COMMAND(id_TopHatPeak, OnTopHatPeak)
	ON_COMMAND(id_TopHatVally, OnTopHatVally)
	ON_COMMAND(id_TophatPeakVally, OnTophatPeakVally)
	//}}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()

/////////////////////////////////////////////////////////////////////////////
// CDemoView construction/destruction

CDemoView::CDemoView()
{
	// TODO: add construction code here

}

CDemoView::~CDemoView()
{
}

BOOL CDemoView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CScrollView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CDemoView drawing

void CDemoView::OnDraw(CDC* pDC)
{
	CDemoDoc* pDoc = GetDocument();

	HDIB hDIB = pDoc->GetHDIB();
	if (hDIB != NULL)
	{
		LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) hDIB);
		int cxDIB = (int) ::DIBWidth(lpDIB);         // Size of DIB - x
		int cyDIB = (int) ::DIBHeight(lpDIB);        // Size of DIB - y
		::GlobalUnlock((HGLOBAL) hDIB);
		CRect rcDIB;
		rcDIB.top = rcDIB.left = 0;
		rcDIB.right = cxDIB;
		rcDIB.bottom = cyDIB;
		CRect rcDest;
		if (pDC->IsPrinting())   // printer DC
		{
			// get size of printer page (in pixels)
			int cxPage = pDC->GetDeviceCaps(HORZRES);
			int cyPage = pDC->GetDeviceCaps(VERTRES);
			// get printer pixels per inch
			int cxInch = pDC->GetDeviceCaps(LOGPIXELSX);
			int cyInch = pDC->GetDeviceCaps(LOGPIXELSY);

			//
			// Best Fit case -- create a rectangle which preserves
			// the DIB's aspect ratio, and fills the page horizontally.
			//
			// The formula in the "->bottom" field below calculates the Y
			// position of the printed bitmap, based on the size of the
			// bitmap, the width of the page, and the relative size of
			// a printed pixel (cyInch / cxInch).
			//
			rcDest.top = rcDest.left = 0;
			rcDest.bottom = (int)(((double)cyDIB * cxPage * cyInch)
					/ ((double)cxDIB * cxInch));
			rcDest.right = cxPage;

      // 计算打印图像位置(垂直居中)
			int temp = cyPage - (rcDest.bottom - rcDest.top);
			rcDest.bottom += temp/2;
			rcDest.top += temp/2;
		}
		else   // not printer DC
		{
			rcDest = rcDIB;
		}
		::PaintDIB(pDC->m_hDC, &rcDest, pDoc->GetHDIB(),
			&rcDIB, pDoc->GetDocPalette());
	}
}

void CDemoView::OnInitialUpdate()
{
	CScrollView::OnInitialUpdate();
	ASSERT(GetDocument() != NULL);
	SetScrollSizes(MM_TEXT, GetDocument()->GetDocSize());

	/*
	CSize sizeTotal;
	sizeTotal.cx = sizeTotal.cy = 100;
	SetScrollSizes(MM_TEXT, sizeTotal);
	*/
}

/////////////////////////////////////////////////////////////////////////////
// CDemoView printing

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CDemoView diagnostics

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CDemoView message handlers

void CDemoView::OnSobel() 
{
  CDemoDoc *pDoc=GetDocument();
  HDIB dib=pDoc->GetHDIB();

  LPSTR	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) dib);
  LPBITMAPINFOHEADER phead=(LPBITMAPINFOHEADER)lpDIB;
  int w = ::DIBWidth(lpDIB);
  int h = phead->biHeight;
  int b = phead->biBitCount/8;

  int lineByte=(w * b+3)/4*4;
  unsigned char *lpDIBBits=(unsigned char *)::FindDIBBits(lpDIB);

  int  i, j, x, y;
  unsigned char *buf=new unsigned char[w*h*b];
  for(i=0;i<h;i++){
	  for(j=0;j<w*b;j++){
		  *(buf+i*w*b+j)=*(lpDIBBits+i*lineByte+j);
	  }
  }
  sobel(buf, w, h, b);
  for(i=0;i<h;i++){
	  for(j=0;j<w*b;j++){
		  *(lpDIBBits+i*lineByte+j)=*(buf+i*w*b+j);
	  }
  }

  ::GlobalUnlock(dib); 
  
  delete []buf;
  Invalidate();
}

void CDemoView::OnFft() 
{
	
CDemoDoc *pDoc=GetDocument();
  HDIB dib=pDoc->GetHDIB();

  LPSTR	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) dib);
  LPBITMAPINFOHEADER phead=(LPBITMAPINFOHEADER)lpDIB;
  int w = phead->biWidth;
  int h = phead->biHeight;
  int b = phead->biBitCount/8;
  if(b==3)
  {
	  ::MessageBox(0,"只处理灰度图象!",NULL,MB_OK);
	  ::GlobalUnlock(dib); 
	  return;
  }
  int lineByte=(w * b+3)/4*4;
  unsigned char *lpDIBBits=(unsigned char *)::FindDIBBits(lpDIB);
  
  int bufLong=w;
  if(h>bufLong)
	  bufLong=h;
  unsigned char *buf=new unsigned char[bufLong*bufLong];
  int i, j;
  for(i=0;i<h;i++){
	  for(j=0;j<w;j++)
		  buf[i*w+j]=*(lpDIBBits+i*lineByte+j);
	  for(j=w;j<bufLong;j++)
		  buf[i*w+j]=0;
  }
  for(i=h;i<bufLong;i++){
	  for(j=w;j<bufLong;j++)
		  buf[i*w+j]=0;
  }

  fft2D(buf, bufLong, bufLong);
  
  for(i=0;i<h;i++){
	  for(j=0;j<w;j++){
		  *(lpDIBBits+i*lineByte+j)=buf[i*bufLong+j];
	  }
  }
  delete []buf;
  
  ::GlobalUnlock(dib); 
  
  Invalidate();
}

void CDemoView::OnIfft() 
{
CDemoDoc *pDoc=GetDocument();
  HDIB dib=pDoc->GetHDIB();

  LPSTR	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) dib);
  LPBITMAPINFOHEADER phead=(LPBITMAPINFOHEADER)lpDIB;
  int w = phead->biWidth;
  int h = phead->biHeight;
  int b = phead->biBitCount/8;
  if(b==3)
  {
	  ::GlobalUnlock(dib); 
	  return;
  }
  int lineByte=(w * b+3)/4*4;
  unsigned char *lpDIBBits=(unsigned char *)::FindDIBBits(lpDIB);
  
  int bufLong=w;
  if(h>bufLong)
	  bufLong=h;
  unsigned char *buf=new unsigned char[bufLong*bufLong];
  int i, j;
  for(i=0;i<h;i++){
	  for(j=0;j<w;j++)
		  buf[i*w+j]=*(lpDIBBits+i*lineByte+j);
	  for(j=w;j<bufLong;j++)
		  buf[i*w+j]=0;
  }
  for(i=h;i<bufLong;i++){
	  for(j=w;j<bufLong;j++)
		  buf[i*w+j]=0;
  }

  ifft2D(buf, bufLong, bufLong);
  
  for(i=0;i<h;i++){
	  for(j=0;j<w;j++){
		  *(lpDIBBits+i*lineByte+j)=buf[i*w+j];
	  }
  }
  delete []buf;
  
  ::GlobalUnlock(dib); 
  
  Invalidate();	
}

void CDemoView::OnZoom() 
{
   ZoomTimesDlg	dlg;
   if(dlg.DoModal()==IDOK){
	   CDemoDoc *pDoc=GetDocument();
	   HDIB dib=pDoc->GetHDIB();
		
		LPSTR	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) dib);
		LPBITMAPINFOHEADER phead=(LPBITMAPINFOHEADER)lpDIB;
		int w = phead->biWidth;
		int h = phead->biHeight;
		int b = phead->biBitCount/8;
		
		int lineByte=(w * b+3)/4*4;
		unsigned char *lpDIBBits=(unsigned char *)::FindDIBBits(lpDIB);
		
		unsigned char *buf=new unsigned char[w*h*b];
		int i, j;
		for(i=0;i<h;i++){
			for(j=0;j<w*b;j++){
				buf[i*w*b+j]=*(lpDIBBits+i*lineByte+j);
			}
		}

		int insertStyle=dlg.m_InsertStyle;
	   float zoomTime;
	   if(dlg.m_InOrOut==0)
		   zoomTime=1.0/dlg.m_ZoomTime;
	   else
		   zoomTime=dlg.m_ZoomTime;

		int zoomW=w*zoomTime, zoomH=h*zoomTime;
		unsigned char *zoomBuf=new unsigned char[zoomW*zoomH*b];
		if(insertStyle==0)//近邻缩放
			zoomNeighbor(buf, w, h, b, zoomTime,zoomBuf, zoomW, zoomH);
		else{//双线性缩放
			if(b==1)
				zoomGray(buf, w, h, zoomTime, zoomBuf, zoomW, zoomH);
			else if(b==3)
				zoomRGB(buf, w, h, zoomTime, zoomBuf, zoomW, zoomH);
		}
		delete []buf;
		
		int newLineByte=(zoomW * b+3)/4*4;
		int palSize=::PaletteSize((LPSTR)lpDIB);
		HANDLE dibNew=::GlobalAlloc(GHND, sizeof(BITMAPINFOHEADER)+ palSize+zoomH*newLineByte);
		LPSTR lpDIBNew = (LPSTR) ::GlobalLock(dibNew);
		
		::memcpy((unsigned char*)lpDIBNew, (unsigned char*)lpDIB, sizeof(BITMAPINFOHEADER)+ palSize);
		BITMAPINFOHEADER *info=(BITMAPINFOHEADER*)lpDIBNew;
		info->biHeight=zoomH;
		info->biWidth=zoomW;
		unsigned char *lpDIBBitsNew=(unsigned char *)::FindDIBBits(lpDIBNew);
		for(i=0;i<zoomH;i++){
			for(j=0;j<zoomW*b;j++){
				*(lpDIBBitsNew+i*newLineByte+j)=zoomBuf[i*zoomW*b+j];
			}
		}
		delete []zoomBuf;
		::GlobalUnlock(dib); 
		::GlobalUnlock(dibNew); 
		
		CMainFrame* pFrame = (CMainFrame *)(AfxGetApp()->m_pMainWnd);
		pFrame->SendMessage(WM_COMMAND, ID_FILE_NEW);
		
		CDemoView* pView=(CDemoView*)pFrame->MDIGetActive()->GetActiveView();
		CDemoDoc* pDocNew=pView->GetDocument();
		
		pDocNew->ReplaceHDIB((HDIB)dibNew);
		pDocNew->InitDIBData();
		pDocNew->UpdateAllViews(pView);
		Invalidate();


   }
}

void CDemoView::OnRotateTrans() 
{
	RotateDlg dlg;
	if(dlg.DoModal()==IDOK){
		int angle=dlg.m_RotateAngle;
		CDemoDoc *pDoc=GetDocument();
		HDIB dib=pDoc->GetHDIB();
		
		LPSTR	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) dib);
		LPBITMAPINFOHEADER phead=(LPBITMAPINFOHEADER)lpDIB;
		int w = phead->biWidth;
		int h = phead->biHeight;
		int b = phead->biBitCount/8;
		
		int lineByte=(w * b+3)/4*4;
		unsigned char *lpDIBBits=(unsigned char *)::FindDIBBits(lpDIB);
		
		unsigned char *buf=new unsigned char[w*h*b];
		int i, j;
		for(i=0;i<h;i++){
			for(j=0;j<w*b;j++){
				buf[i*w*b+j]=*(lpDIBBits+i*lineByte+j);
			}
		}
		float slope=angle/180.0*3.1415926;
		int outImgW=w+h*fabs(sin(slope)), outImgH=h+w*fabs(sin(slope));
		if(outImgW<sqrt(w*w+h*h))   outImgW=sqrt(w*w+h*h);
		if(outImgH<sqrt(w*w+h*h))   outImgH=sqrt(w*w+h*h);
		float skew=tan(slope);
		unsigned char *rotateBuf=new unsigned char[outImgW*outImgH*b];
		if(b==1)
			rotateGrey(buf, w, h, 0,skew, 0, 0, rotateBuf,outImgW, outImgH);
		else if(b==3)
			rotateRGB(buf, w, h, 0,skew, 0, 0, rotateBuf,outImgW, outImgH);
		delete []buf;
		
		int newLineByte=(outImgW * b+3)/4*4;
		int palSize=::PaletteSize((LPSTR)lpDIB);
		HANDLE dibNew=::GlobalAlloc(GHND, sizeof(BITMAPINFOHEADER)+ palSize+outImgH*newLineByte);
		LPSTR lpDIBNew = (LPSTR) ::GlobalLock(dibNew);
		
		::memcpy((unsigned char*)lpDIBNew, (unsigned char*)lpDIB, sizeof(BITMAPINFOHEADER)+ palSize);
		BITMAPINFOHEADER *info=(BITMAPINFOHEADER*)lpDIBNew;
		info->biHeight=outImgH;
		info->biWidth=outImgW;
		unsigned char *lpDIBBitsNew=(unsigned char *)::FindDIBBits(lpDIBNew);
		for(i=0;i<outImgH;i++){
			for(j=0;j<outImgW*b;j++){
				*(lpDIBBitsNew+i*newLineByte+j)=rotateBuf[i*outImgW*b+j];
			}
		}
		delete []rotateBuf;
		::GlobalUnlock(dib); 
		::GlobalUnlock(dibNew); 
		
		CMainFrame* pFrame = (CMainFrame *)(AfxGetApp()->m_pMainWnd);
		pFrame->SendMessage(WM_COMMAND, ID_FILE_NEW);
		
		CDemoView* pView=(CDemoView*)pFrame->MDIGetActive()->GetActiveView();
		CDemoDoc* pDocNew=pView->GetDocument();
		
		pDocNew->ReplaceHDIB((HDIB)dibNew);
		pDocNew->InitDIBData();

⌨️ 快捷键说明

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