mainfrm.cpp

来自「一个非常全的vc编程的原程序代码是关于图像处理的!」· C++ 代码 · 共 2,610 行 · 第 1/5 页

CPP
2,610
字号
// MainFrm.cpp : implementation of the CMainFrame class
//

#include "stdafx.h"
#include "ViewDIB.h"

#include "MainFrm.h"
#include "ViewDIBDoc.h"
#include "ViewDIBView.h"
#include "math.h"
#include "DibAPI.h"


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

/////////////////////////////////////////////////////////////////////////////
// CMainFrame

IMPLEMENT_DYNAMIC(CMainFrame, CMDIFrameWnd)

BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
	//{{AFX_MSG_MAP(CMainFrame)
	ON_WM_CREATE()
	ON_COMMAND(ID_MENU_HISTOGRAM, OnMenuHistogram)
	ON_COMMAND(ID_MENU_REDCHANNEL, OnMenuRedChannel)
	ON_COMMAND(ID_MENU_GREENCHANNEL, OnMenuGreenChannel)
	ON_COMMAND(ID_MENU_BLUECHANNEL, OnMenuBlueChannel)
	ON_COMMAND(ID_MENU_UNDO, OnMenuUndo)
	ON_COMMAND(ID_MENU_THRESHOLD, OnMenuThreshold)
	ON_COMMAND(ID_MENU_ATTRIBUTE, OnMenuAttribute)
	ON_COMMAND(ID_MENU_ROTATE180, OnMenuRotate180)
	ON_COMMAND(ID_MENU_ROTATE90, OnMenuRotate90)
	ON_COMMAND(ID_MENU_ROTATE270, OnMenuRotate270)
	ON_COMMAND(ID_MENU_FLIPHOR, OnMenuFlipHor)
	ON_COMMAND(ID_MENU_FLIPVERT, OnMenuFlipVert)
	ON_COMMAND(ID_MENU_SELFDIFF, OnMenuSelfDiff)
	ON_COMMAND(ID_MENU_REVERTCOLOR, OnMenuRevertColor)
	ON_COMMAND(ID_MENU_COLOR2GRAY, OnMenuColor2Gray)
	ON_COMMAND(ID_MENU_ROTATECERTAINANGLE, OnMenuRotateCertainAngle)
	ON_COMMAND(ID_MENU_AUTOBINARY, OnMenuAutoBinary)
	ON_COMMAND(ID_MENU_HISTOEQUIVALIZE, OnMenuHistoEquivalize)
	ON_COMMAND(ID_MENU_PSEUDOCOLOR, OnMenuPseudoColor)
	ON_COMMAND(ID_MENU_BRIGHTNESSANDCONTRAST, OnMenuBrightnessAndContrast)
	ON_COMMAND(ID_MENU_LNTRANS, OnMenuLnTrans)
	ON_COMMAND(ID_MENU_LOGTRANS, OnMenuLogTrans)
	ON_COMMAND(ID_MENU_QUARTIC, OnMenuQuartic)
	ON_COMMAND(ID_MENU_OCTONARY, OnMenuOctonary)
	ON_COMMAND(ID_MENU_LOWPASS1, OnMenuLowpass1)
	ON_COMMAND(ID_MENU_LOWPASS2, OnMenuLowpass2)
	ON_COMMAND(ID_MENU_LOWPASS3, OnMenuLowpass3)
	ON_COMMAND(ID_MENU_HIGHPASS1, OnMenuHighpass1)
	ON_COMMAND(ID_MENU_HIGHPASS2, OnMenuHighpass2)
	ON_COMMAND(ID_MENU_HIGHPASS3, OnMenuHighpass3)
	ON_COMMAND(ID_MENU_VEREDGE, OnMenuVerEdge)
	ON_COMMAND(ID_MENU_HORZEDGE, OnMenuHorzEdge)
	ON_COMMAND(ID_MENU_VHEDGE, OnMenuVHEdge)
	ON_COMMAND(ID_MENU_NOR, OnMenuNor)
	ON_COMMAND(ID_MENU_EASNOR, OnMenuEasNor)
	ON_COMMAND(ID_MENU_EAS, OnMenuEas)
	ON_COMMAND(ID_MENU_EASSOU, OnMenuEasSou)
	ON_COMMAND(ID_MENU_SOU, OnMenuSou)
	ON_COMMAND(ID_MENU_WESSOU, OnMenuWesSou)
	ON_COMMAND(ID_MENU_WES, OnMenuWes)
	ON_COMMAND(ID_MENU_WESNOR, OnMenuWesNor)
	ON_COMMAND(ID_MENU_LAP1, OnMenuLap1)
	ON_COMMAND(ID_MENU_LAP2, OnMenuLap2)
	ON_COMMAND(ID_MENU_LAP3, OnMenuLap3)
	ON_COMMAND(ID_MENU_SOBEL1, OnMenuSobel1)
	ON_COMMAND(ID_MENU_SOBEL2, OnMenuSobel2)
	ON_COMMAND(ID_MENU_BLUR, OnMenuBlur)
	ON_COMMAND(ID_MENU_AFFINE1, OnMenuAffine)
	ON_COMMAND(ID_MENU_CHANGECANVASSIZE, OnMenuChangeCanvasSize)
	ON_COMMAND(ID_MENU_AFFINE2, OnMenuAffineInterpolation)
	ON_COMMAND(ID_MENU_MEDIANFILTER, OnMenuMedianFilter)
	ON_COMMAND(ID_MENU_SOBEL3, OnMenuSobel3)
	ON_COMMAND(ID_MENU_EROSION, OnMenuErosion)
	ON_COMMAND(ID_MENU_DILATION, OnMenuDilation)
	ON_COMMAND(ID_MENU_OPEN, OnMenuOpen)
	ON_COMMAND(ID_MENU_CLOS, OnMenuClose)
	ON_COMMAND(ID_MENU_SUSAN, OnMenuSUSANEdge)
	ON_COMMAND(ID_MENU_BOUNDARY, OnMenuEdgeDetect)
	ON_COMMAND(ID_MENU_THINNING, OnMenuThinning)
	ON_COMMAND(ID_MENU_SKELETONIZE, OnMenuSkeletonize)
	ON_COMMAND(ID_MENU_DIFF, OnMenuDiff)
	ON_COMMAND(ID_MENU_ADD, OnMenuAdddib)
	ON_COMMAND(ID_MENU_OR, OnMenuOr)
	ON_COMMAND(ID_MENU_ZOOMIN, OnMenuZoomIn)
	ON_COMMAND(ID_MENU_ZOOMOUT, OnMenuZoomOut)
	ON_COMMAND(ID_MENU_CANNY, OnMenuCanny)
	ON_COMMAND(ID_MENU_PERSPECTIVE, OnMenuPerspectiveTrans)
	ON_COMMAND(ID_MENU_MASKRED, OnMenuMaskRed)
	ON_COMMAND(ID_MENU_MASKBLUE, OnMenuMaskBlue)
	ON_COMMAND(ID_MENU_MASKGREEN, OnMenuMaskGreen)
	ON_COMMAND(ID_MENU_SELECTPOLY, OnMenuSelectPoly)
	ON_COMMAND(ID_MENU_GEOMETRICCORRECT, OnMenuGeometricCorrect)
	ON_COMMAND(ID_MENU_DFTMAGNITUDE, OnMenuDFTMagnitude)
	ON_COMMAND(ID_MENU_DFTPHASE, OnMenuDFTPhase)
	ON_COMMAND(ID_MENU_MODIFYWH, OnMenuModifyWH)
	ON_COMMAND(ID_MENU_DCT, OnMenuDCT)
	ON_COMMAND(ID_MENU_IDCT, OnMenuIDCT)
	ON_COMMAND(ID_MENU_HOUGHLINE, OnMenuHoughLineDetect)
	ON_COMMAND(ID_MENU_HOUGHCIRCLE, OnMenuHoughCircleDetect)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

static UINT indicators[] =
{
	ID_SEPARATOR,           // status line indicator
	ID_INDICATOR_CAPS,
	ID_INDICATOR_NUM,
	ID_INDICATOR_SCRL,
};

/////////////////////////////////////////////////////////////////////////////
// CMainFrame construction/destruction

CMainFrame::CMainFrame()
{
	// TODO: add member initialization code here
//	m_operFlag=FALSE;
}

CMainFrame::~CMainFrame()
{
}

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
		| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
		!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
	{
		TRACE0("Failed to create toolbar\n");
		return -1;      // fail to create
	}

	if (!m_wndStatusBar.Create(this) ||
		!m_wndStatusBar.SetIndicators(indicators,
		  sizeof(indicators)/sizeof(UINT)))
	{
		TRACE0("Failed to create status bar\n");
		return -1;      // fail to create
	}

	// TODO: Delete these three lines if you don't want the toolbar to
	//  be dockable
	m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
	EnableDocking(CBRS_ALIGN_ANY);
	DockControlBar(&m_wndToolBar);

	return 0;
}

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
	if( !CMDIFrameWnd::PreCreateWindow(cs) )
		return FALSE;
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return TRUE;
}

/////////////////////////////////////////////////////////////////////////////
// CMainFrame diagnostics

#ifdef _DEBUG
void CMainFrame::AssertValid() const
{
	CMDIFrameWnd::AssertValid();
}

void CMainFrame::Dump(CDumpContext& dc) const
{
	CMDIFrameWnd::Dump(dc);
}

#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CMainFrame message handlers


void CMainFrame::OnMenuHistogram() 
{
	CMDIChildWnd* CWnd=MDIGetActive(NULL);
    if(CWnd!=NULL){
		CViewDIBDoc* pDoc = (CViewDIBDoc*)CWnd->GetActiveDocument();
	
    int i, j;
	long max, max0, max1, max2;
	int width		 = pDoc->m_pDib->GetWidth();
	int height		 = pDoc->m_pDib->GetHeight();
	int bytesPerLine = pDoc->m_pDib->GetWidthBytes();
	int bitUsed		 = pDoc->m_pDib->GetBitCount();
	BYTE curByte, curR, curG, curB;
    LPBYTE lpBits = pDoc->m_pDib->GetBitsPtr();

	for(i=0;i<256;i++){
		m_HistogamDlg.m_L[i] = 0;
		m_HistogamDlg.m_R[i] = 0;
		m_HistogamDlg.m_G[i] = 0;
		m_HistogamDlg.m_B[i] = 0;
	}
	
    if((bitUsed!=8)&&(bitUsed!=24)){
		MessageBox("此操作只能处理灰度图或24位真彩色图!","Attention");
        return;
	}

	max = max0 = max1 = max2 = 0;
	if(bitUsed == 8)
	{
		for(j=0;j<height;j++)
		{
			for( i=0;i<width;i++)
			{
				curByte = *(LPBYTE)(lpBits+j*bytesPerLine+i);
				m_HistogamDlg.m_L[curByte] ++;
				if(m_HistogamDlg.m_L[curByte] > max)
					max = m_HistogamDlg.m_L[curByte];

				m_HistogamDlg.m_R[curByte] ++;
				if(m_HistogamDlg.m_R[curByte] > max0)
					max0 = m_HistogamDlg.m_R[curByte];

				m_HistogamDlg.m_G[curByte] ++;
				if(m_HistogamDlg.m_G[curByte] > max1)
					max1 = m_HistogamDlg.m_G[curByte];

				m_HistogamDlg.m_B[curByte] ++;
				if(m_HistogamDlg.m_B[curByte] > max2)
					max2 = m_HistogamDlg.m_B[curByte];
			}
		}
	}
	else if(bitUsed == 24)
	{
		for(j=0;j<height;j++)
		{
			for(i=0;i<width;i++)
			{
				
				curB = *(BYTE*)(lpBits+j*bytesPerLine+i*3);
				m_HistogamDlg.m_B[curB] ++;
				if(m_HistogamDlg.m_B[curB] > max2)
					max2 = m_HistogamDlg.m_B[curB];
	
				curG = *(BYTE*)(lpBits+j*bytesPerLine+i*3+1);
				m_HistogamDlg.m_G[curG] ++;
				if(m_HistogamDlg.m_G[curG] > max1)
					max1 = m_HistogamDlg.m_G[curG];

				curR = *(BYTE*)(lpBits+j*bytesPerLine+i*3+2);
				m_HistogamDlg.m_R[curR] ++;
				if(m_HistogamDlg.m_R[curR] > max0)
					max0 = m_HistogamDlg.m_R[curR];

				curByte = (BYTE)(curR*0.3+curG*0.59+curB*0.11);
				m_HistogamDlg.m_L[curByte]++;
				if(m_HistogamDlg.m_L[curByte] > max)
					max = m_HistogamDlg.m_L[curByte];

			}
		}
	}
	for(i=0;i<256;i++)
	{
		m_HistogamDlg.m_L[i] = (long)(m_HistogamDlg.m_L[i]*100/max);
		m_HistogamDlg.m_R[i] = (long)(m_HistogamDlg.m_R[i]*100/max0);
		m_HistogamDlg.m_G[i] = (long)(m_HistogamDlg.m_G[i]*100/max1);
		m_HistogamDlg.m_B[i] = (long)(m_HistogamDlg.m_B[i]*100/max2);
	}
	
	m_HistogamDlg.m_max  = max;
	m_HistogamDlg.m_max0 = max0;
	m_HistogamDlg.m_max1 = max1;
	m_HistogamDlg.m_max2 = max2;
	
	m_HistogamDlg.m_width  = width;
	m_HistogamDlg.m_height = height;

	m_HistogamDlg.DoModal();
	return;

	}else{
		MessageBox("请先打开一个BMP文件!","Error");
		return;
	}
}

void CMainFrame::OnMenuRedChannel() 
{
	CMDIChildWnd* CWnd = MDIGetActive(NULL);
	
	if(CWnd == NULL){
		MessageBox("请先打开一个BMP文件!", "Error");
		return;
	}

    CViewDIBDoc* pDoc = (CViewDIBDoc*)CWnd->GetActiveDocument();

	if(pDoc->m_operFlag == TRUE){
        m_AttentionDlg.DoModal();	
		if(pDoc->m_operFlag == TRUE)
			return;
	}
	
    //save old DIB
	pDoc->m_operFlag = TRUE;
	pDoc->m_pDibTmp = (CDib*)(new CDib());
	pDoc->m_pDibTmp->Create(pDoc->m_pDib->m_hBitmap);
	
	int width		 = pDoc->m_pDib->GetWidth();
	int height		 = pDoc->m_pDib->GetHeight();
	int bytesPerLine = pDoc->m_pDib->GetWidthBytes();
	int bitUsed		 = pDoc->m_pDib->GetBitCount();
	LPBYTE curG, curB;
    LPBYTE lpBits = pDoc->m_pDib->GetBitsPtr();
   	
	if(bitUsed != 24){
		MessageBox("请打开一个24色真彩文件!", "Error");
		pDoc->m_operFlag = FALSE;
		return;
	}

	for(int j=0;j<height;j++)
	{
		for(int i=0;i<width;i++)
		{
	   		curB  = (LPBYTE)(lpBits+j*bytesPerLine+i*3);
		    *curB = 0;
        	curG  = (LPBYTE)(lpBits+j*bytesPerLine+i*3+1);
			*curG = 0;	
		}
	}
    pDoc->m_pDib->BuildBitmap();


	CDC* pDC=CWnd->GetDC();
    CViewDIBView* pView = (CViewDIBView*)CWnd->GetActiveView();
    CWnd->Invalidate();

	return;
}

void CMainFrame::OnMenuGreenChannel() 
{
	CMDIChildWnd* CWnd = MDIGetActive(NULL);
	
	if(CWnd == NULL){
		MessageBox("请先打开一个BMP文件!", "Error");
		return;
	}

    CViewDIBDoc* pDoc = (CViewDIBDoc*)CWnd->GetActiveDocument();
	
	if(pDoc->m_operFlag == TRUE){
        m_AttentionDlg.DoModal();	
		if(pDoc->m_operFlag == TRUE)
			return;
	}
	
    
    //save old DIB
	pDoc->m_operFlag = TRUE;
	pDoc->m_pDibTmp = (CDib*)(new CDib());
	pDoc->m_pDibTmp->Create(pDoc->m_pDib->m_hBitmap);
	
	int width		 = pDoc->m_pDib->GetWidth();
	int height		 = pDoc->m_pDib->GetHeight();
	int bytesPerLine = pDoc->m_pDib->GetWidthBytes();
	int bitUsed		 = pDoc->m_pDib->GetBitCount();
	LPBYTE curR, curB;
    LPBYTE lpBits = pDoc->m_pDib->GetBitsPtr();
   	
	if(bitUsed != 24){
		MessageBox("请打开一个24色真彩文件!", "Error");
		pDoc->m_operFlag = FALSE;
		return;
	}

	for(int j=0;j<height;j++)
	{
		for(int i=0;i<width;i++)
		{
	   		curB  = (LPBYTE)(lpBits+j*bytesPerLine+i*3);
		    *curB = 0;
        	curR  = (LPBYTE)(lpBits+j*bytesPerLine+i*3+2);
	     	*curR = 0;	
		}
	}
    pDoc->m_pDib->BuildBitmap();

	CDC* pDC=CWnd->GetDC();
    CViewDIBView* pView = (CViewDIBView*)CWnd->GetActiveView();
    CWnd->Invalidate();

	return;
}

void CMainFrame::OnMenuBlueChannel() 
{
	CMDIChildWnd* CWnd = MDIGetActive(NULL);
	
	if(CWnd == NULL){
		MessageBox("请先打开一个BMP文件!", "Error");
		return;
	}
 
	CViewDIBDoc* pDoc = (CViewDIBDoc*)CWnd->GetActiveDocument();
   
	if(pDoc->m_operFlag == TRUE){
        m_AttentionDlg.DoModal();	
		if(pDoc->m_operFlag == TRUE)
			return;
	}
	
    
	//save old DIB
    pDoc->m_operFlag = TRUE;
	pDoc->m_pDibTmp = (CDib*)(new CDib());
	pDoc->m_pDibTmp->Create(pDoc->m_pDib->m_hBitmap);
	
	int width		 = pDoc->m_pDib->GetWidth();
	int height		 = pDoc->m_pDib->GetHeight();
	int bytesPerLine = pDoc->m_pDib->GetWidthBytes();
	int bitUsed		 = pDoc->m_pDib->GetBitCount();
	LPBYTE curR, curG;
    LPBYTE lpBits = pDoc->m_pDib->GetBitsPtr();
   	
	if(bitUsed!=24){
		MessageBox("请打开一个24色真彩文件!", "Error");
		pDoc->m_operFlag = FALSE;
		return;
	}

	for(int j=0;j<height;j++)
	{
		for(int i=0;i<width;i++)
		{
        	curG  = (LPBYTE)(lpBits+j*bytesPerLine+i*3+1);
			*curG = 0;	
         	curR  = (LPBYTE)(lpBits+j*bytesPerLine+i*3+2);
	    	*curR = 0;	
		}
	}
    pDoc->m_pDib->BuildBitmap();

	CDC* pDC=CWnd->GetDC();
    CViewDIBView* pView = (CViewDIBView*)CWnd->GetActiveView();
    CWnd->Invalidate();

	return;
}

void CMainFrame::OnMenuUndo() 
{
	// TODO: Add your command handler code here
	CMDIChildWnd* CWnd = MDIGetActive(NULL);
	if(CWnd == NULL){
		MessageBox("你还没有打开任何文件!", "Error");
		return;
	}

	CViewDIBDoc* pDoc = (CViewDIBDoc*)CWnd->GetActiveDocument();
	if(pDoc == NULL){
		MessageBox("你还没有打开任何文件!", "Error");
		return;
	}

    if(pDoc->m_operFlag == FALSE){
		MessageBox("你还没有做任何操作!", "Error");
		return;
	}

    pDoc->m_operFlag = FALSE;
    
	//reset old DIB
	pDoc->m_pDib->Destroy();
	pDoc->m_pDib->Create(pDoc->m_pDibTmp->m_hBitmap);
	delete pDoc->m_pDibTmp;
	// pDoc->m_pDib->BuildBitmap();

	
    CViewDIBView* pView = (CViewDIBView*)CWnd->GetActiveView();
	CSize sizeTotal(pDoc->m_pDib->GetWidth(), pDoc->m_pDib->GetHeight());
	pView->SetScrollSizes(MM_TEXT, sizeTotal);
    CDC* pDC = CWnd->GetDC();
    CWnd->Invalidate();
	
	return;
}

void CMainFrame::OnMenuThreshold() 
{
	CMDIChildWnd* CWnd = MDIGetActive(NULL);
    if(CWnd!=NULL){
		CViewDIBDoc* pDoc = (CViewDIBDoc*)CWnd->GetActiveDocument();

	if(pDoc->m_operFlag == TRUE){
        m_AttentionDlg.DoModal();	
		if(pDoc->m_operFlag == TRUE)
			return;
	}

	pDoc->m_operFlag = TRUE;
	int  i, j;
	long max, max0, max1, max2;
	int width		 = pDoc->m_pDib->GetWidth();
	int height		 = pDoc->m_pDib->GetHeight();
	int bytesPerLine = pDoc->m_pDib->GetWidthBytes();
	int bitUsed		 = pDoc->m_pDib->GetBitCount();
	BYTE curByte, curR, curG, curB;
    LPBYTE lpBits = pDoc->m_pDib->GetBitsPtr();

⌨️ 快捷键说明

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