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 + -
显示快捷键?