📄 demoview.cpp
字号:
// 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 + -