📄 photostarview.cpp
字号:
// PhotoStarView.cpp : implementation of the CPhotoStarView class
//
#include "stdafx.h"
#include "PhotoStar.h"
#include "PhotoStarDoc.h"
#include "PhotoStarView.h"
#include "MainFrm.h"
#include "ChildFrm.h"
#include "Filter.h"
#include "MedFiltDlg.h"
//#include "Histogram.h"
//#include "Sgldm.h"
#include "Math.h"
//#include "Sgldmshow.h"
#include "Gray.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CPhotoStarView
IMPLEMENT_DYNCREATE(CPhotoStarView, CScrollView)
BEGIN_MESSAGE_MAP(CPhotoStarView, CScrollView)
//{{AFX_MSG_MAP(CPhotoStarView)
ON_WM_SETFOCUS()
ON_WM_MOUSEMOVE()
ON_COMMAND(ID_EDIT_COPY, OnEditCopy)
ON_WM_LBUTTONDOWN()
ON_COMMAND(ID_VIEW_SHOWHISTOGRAM, OnViewShowhistogram)
ON_COMMAND(ID_ENHANCE_MEDIANFILTER, OnEnhanceMedianfilter)
ON_COMMAND(ID_HISTOGRAM_BLANCE, OnHistogramBlance)
ON_COMMAND(ID_LINERCHANGE_GRAY, OnLinerchangeGray)
ON_COMMAND(ID_HISTOGRAM_SPECIFY, OnHistogramSpecify)
ON_COMMAND(ID_FAKE_COLORS, OnFakeColors)
ON_COMMAND(ID_ENHANCE_MAXFILTER, OnEnhanceMaxfilter)
ON_COMMAND(ID_ENHANCE_MINFILTDIG, OnEnhanceMinfiltdig)
ON_COMMAND(ID_OPERATION_ALGRBRA, OnOperationAlgrbra)
ON_COMMAND(ID_ENHANCE_LOGICOPERATION, OnEnhanceLogicoperation)
ON_COMMAND(ID_ENHANCE_MIRROROPERATION, OnEnhanceMirroroperation)
ON_COMMAND(ID_ZOOMIMAGE, OnZoomimage)
ON_COMMAND(ID_ENHANCE_FFT1, OnEnhanceFft1)
ON_COMMAND(ID_ENHANCE_UNTIFFT, OnEnhanceUntifft)
ON_COMMAND(ID_IDEALLOWFILTER, OnIdeallowfilter)
ON_COMMAND(ID_IDEALHIGHTFILTER, OnIdealhightfilter)
ON_COMMAND(ID_BUTWORTHHIGHTFILTER, OnButworthhightfilter)
ON_COMMAND(ID_BUTWORTHLOWFILTER, OnButworthlowfilter)
ON_COMMAND(ID_HOMOFILTER, OnHomofilter)
ON_COMMAND(ID_PEPPERSALTNOISE, OnPeppersaltnoise)
ON_COMMAND(ID_GUSSNOISE, OnGussnoise)
ON_COMMAND(ID_ENHANCE_LINERFILTERDLG, OnEnhanceLinerfilterdlg)
ON_COMMAND(ID_ENHANCE_DEGENRATION, OnEnhanceDegenration)
ON_COMMAND(ID_ENHANCE_REVERCEFILTER, OnEnhanceRevercefilter)
ON_COMMAND(ID_ENHANCE_VENUSFILTER, OnEnhanceVenusfilter)
ON_COMMAND(ID_EROSION, OnErosion)
ON_COMMAND(ID_DILATION, OnDilation)
ON_COMMAND(ID_OPEN, OnOpen)
ON_COMMAND(ID_CLOSE, OnClose)
ON_COMMAND(ID_THINING, OnThining)
ON_COMMAND(ID_THICKING, OnThicking)
ON_COMMAND(ID_SKELETON, OnSkeleton)
ON_COMMAND(ID_MANUALTHRESHOLD, OnManualthreshold)
ON_COMMAND(ID_AUTOWORTH, OnAutoworth)
ON_COMMAND(ID_REGIONGROWING, OnRegiongrowing)
ON_COMMAND(ID_AREACOMBINE, OnAreacombine)
ON_COMMAND(ID_ENHANCE_SELECTFILTER, OnEnhanceSelectfilter)
ON_WM_LBUTTONUP()
ON_COMMAND(ID_DOWNHILLFILTER, OnDownhillfilter)
ON_COMMAND(ID_CONSTRACTALGORITHMONE, OnConstractAlgorithmOne)
ON_COMMAND(ID_CONSTRACTALGORITHMTWO, OnConstractAlgorithmTwo)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CPhotoStarView construction/destruction
CPhotoStarView::CPhotoStarView()
{
m_pImageObject = NULL;
m_bImageLoaded = FALSE;
m_nangle=0;
m_ndistance=0;
m_nStartX=m_nStartY=0;
m_nEndX=m_nEndY=0;
m_nStep=0;
}
CPhotoStarView::~CPhotoStarView()
{
if( m_pImageObject != NULL ) delete m_pImageObject;
}
BOOL CPhotoStarView::PreCreateWindow(CREATESTRUCT& cs)
{
return CScrollView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CPhotoStarView drawing
void CPhotoStarView::OnDraw(CDC* pDC)
{
OnPrepareDC(pDC);
if( GetFocus() == this ) m_pImageObject->SetPalette(pDC);
m_pImageObject->Draw(pDC);
}
void CPhotoStarView::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();
CPhotoStarDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if( !m_bImageLoaded )
{
CString PathName = pDoc->GetPathName();
BeginWaitCursor ();
m_pImageObject = new CImageObject( PathName.GetBuffer( 3 ) );
EndWaitCursor ();
if( m_pImageObject == NULL )
{
AfxMessageBox( "Could not create picture class!" );
return;
}
CSize sizeTotal;
sizeTotal.cx = m_pImageObject->GetWidth();
sizeTotal.cy = m_pImageObject->GetHeight();
SetScrollSizes (MM_TEXT, sizeTotal);
CChildFrame *pChild = (CChildFrame *) GetParentFrame();
pChild->m_nWidth = m_pImageObject->GetWidth();
pChild->m_nHeight = m_pImageObject->GetHeight();
pChild->SetWindowPos( NULL , 0, 0, 2500, 2500, SWP_NOZORDER | SWP_NOMOVE );
m_bImageLoaded = TRUE;
}
}
/////////////////////////////////////////////////////////////////////////////
// CPhotoStarView diagnostics
#ifdef _DEBUG
void CPhotoStarView::AssertValid() const
{
CScrollView::AssertValid();
}
void CPhotoStarView::Dump(CDumpContext& dc) const
{
CScrollView::Dump(dc);
}
CPhotoStarDoc* CPhotoStarView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CPhotoStarDoc)));
return (CPhotoStarDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CPhotoStarView message handlers
void CPhotoStarView::OnSetFocus(CWnd* pOldWnd)
{
CScrollView::OnSetFocus(pOldWnd);
if( m_pImageObject != NULL )
{
CClientDC ClientDC( this );
OnPrepareDC( &ClientDC );
m_pImageObject->SetPalette( &ClientDC );
m_pImageObject->Draw( &ClientDC );
}
}
void CPhotoStarView::ResizeWindow( void )
{
CSize SizeTotal;
SizeTotal.cx = m_pImageObject->GetWidth();
SizeTotal.cy = m_pImageObject->GetHeight();
SetScrollSizes (MM_TEXT, SizeTotal);
CMainFrame *pFrame = (CMainFrame *) AfxGetMainWnd();
CChildFrame *pChild = (CChildFrame *) pFrame->MDIGetActive();
pChild->m_nWidth = m_pImageObject->GetWidth();
pChild->m_nHeight = m_pImageObject->GetHeight();
pChild->SetWindowPos( NULL, 0, 0, 2500, 2500, SWP_NOZORDER | SWP_NOMOVE );
}
void CPhotoStarView::OnMouseMove(UINT nFlags, CPoint point)
{
CMainFrame* pFrame=(CMainFrame*) AfxGetApp()->m_pMainWnd;
CStatusBar* pStatus=&pFrame->m_wndStatusBar;
CString str;
int nNumBits=m_pImageObject->GetNumBits();
int nWidth=m_pImageObject->GetWidth();
int nHeight=m_pImageObject->GetHeight();
int nColor=m_pImageObject->GetNumColors();
if(pStatus)
{
str.Format("%d×%d×%d位",nWidth,nHeight,nNumBits);
pStatus->SetPaneText(1,str);
str.Format("X=%4d",point.x);
pStatus->SetPaneText(2,str);
str.Format("Y=%4d",point.y);
pStatus->SetPaneText(3,str);
}
if(nNumBits>=8)
{
unsigned char red,green,blue;
m_pImageObject->GetRGBValue(point.x,point.y,red,green,blue);
str.Format("R=%4d",red);
pStatus->SetPaneText(4,str);
str.Format("G=%4d",green);
pStatus->SetPaneText(5,str);
str.Format("B=%4d",blue);
pStatus->SetPaneText(6,str);
}
if (m_nStep==1)
{
CClientDC dc(this);
CPen NewPen1(PS_DOT,1,RGB(0,0,0));
CPen *pOldPen=dc.SelectObject(&NewPen1);
dc.SetROP2(R2_NOTXORPEN);
if (m_nEndX!=0)
{
dc.MoveTo(m_nStartX,m_nStartY);
dc.LineTo(m_nStartX,m_nEndY);
dc.LineTo(m_nEndX,m_nEndY);
dc.LineTo(m_nEndX,m_nStartY);
dc.LineTo(m_nStartX,m_nStartY);
}
m_nEndX=point.x;
m_nEndY=point.y;
dc.MoveTo(m_nStartX,m_nStartY);
dc.LineTo(m_nStartX,m_nEndY);
dc.LineTo(m_nEndX,m_nEndY);
dc.LineTo(m_nEndX,m_nStartY);
dc.LineTo(m_nStartX,m_nStartY);
dc.SelectObject(pOldPen);
}
CScrollView::OnMouseMove(nFlags, point);
}
void CPhotoStarView::OnEditCopy()
{
CBitmap bitmap;
CClientDC dc(this);
CDC memDC;
int nWidth=m_pImageObject->GetWidth();
int nHeight=m_pImageObject->GetHeight();
memDC.CreateCompatibleDC(&dc);
bitmap.CreateCompatibleBitmap(&dc,nWidth,nHeight);
CBitmap* pOldBitmap=memDC.SelectObject(&bitmap);
memDC.BitBlt(0,0,nWidth,nHeight,&dc,0,0,SRCCOPY);
OpenClipboard();
EmptyClipboard();
SetClipboardData(CF_BITMAP, bitmap.GetSafeHandle());
CloseClipboard();
memDC.SelectObject(pOldBitmap);
bitmap.Detach();
}
void CPhotoStarView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if (m_nStep==2)
{
OnLButtonUp(0,m_nmidvalue);
m_nStartX=m_nStartY=0;
}
m_nEndX=m_nEndY=0;
m_nStartX=point.x;
m_nStartY=point.y;
m_nStep=1;
/*CGray gray;
gray.m_pImageObject=m_pImageObject;
gray.m_x=point.x;
gray.m_y=point.y;
gray.DoModal();
//上面是用对话框实现RGB值输出
CString str;
BYTE red,green,blue;
m_pImageObject->GetRGBValue(point.x,point.y,red,green,blue);
str.Format("%d %d %d",red,green,blue);
AfxMessageBox(str,MB_YESNO|MB_ICONQUESTION);
//上面是用消息框实现RGB值输出*/
CScrollView::OnLButtonDown(nFlags, point);
}
void CPhotoStarView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CClientDC dc(this);
CPen NewPen1(PS_DOT,1,RGB(0,0,0));
CPen *pOldPen=dc.SelectObject(&NewPen1);
dc.SetROP2(R2_NOTXORPEN);
if(m_nStep==1)
{/*
dc.MoveTo(m_nStartX,m_nStartY);
dc.LineTo(m_nStartX,point.y);
dc.LineTo(point.x,point.y);
dc.LineTo(point.x,m_nStartY);
dc.LineTo(m_nStartX,m_nStartY);*/
}
else
{
dc.MoveTo(m_nStartX,m_nStartY);
dc.LineTo(m_nStartX,m_nEndY);
dc.LineTo(m_nEndX,m_nEndY);
dc.LineTo(m_nEndX,m_nStartY);
dc.LineTo(m_nStartX,m_nStartY);
}
m_nStep=2;
m_nmidvalue.x=m_nEndX;
m_nmidvalue.y=m_nEndY;
dc.SelectObject(pOldPen);
CScrollView::OnLButtonUp(nFlags, point);
}
void CPhotoStarView::OnViewShowhistogram()
{
CHistogram hist;
hist.m_pImageObject=m_pImageObject;
if(!hist.ShowHistogram())
{
return;
}
}
void CPhotoStarView::OnEnhanceMedianfilter()
{
//Display the parameter dialogue
CMedFiltDlg dlg;
if (dlg.DoModal() != IDOK)
{
return;
}
//Get user inputs from the dialogue object
int iWinSize = dlg.m_iWinSize;
//Make a filter instance
CFilter filt(m_pImageObject, iWinSize);
//Filter operation
filt.MedianFilter();
//Update the window to display the filtered image
InvalidateRect(NULL);
UpdateWindow();
}
void CPhotoStarView::OnLinerchangeGray()
{
CGRAYLINERCHANGE lcgray;
lcgray.m_pImageObject =m_pImageObject;
lcgray.DoModal();
//Update the window to display the filtered image
InvalidateRect(NULL);
UpdateWindow();
}
void CPhotoStarView::OnHistogramBlance()
{
CHistogramBlance histblance;
histblance.m_pImageObject=m_pImageObject;
histblance.OnHistogramBlance();
//Update the window to display the filtered image
InvalidateRect(NULL);
UpdateWindow();
}
void CPhotoStarView::OnHistogramSpecify()
{
CHistogramSpecify histospecify;
histospecify.m_pImageObject=m_pImageObject;
histospecify.OnHistogramSpecify();
//Update the window to display the filtered image
InvalidateRect(NULL);
UpdateWindow();
}
void CPhotoStarView::OnFakeColors()
{
CColorsFake colorfake;
colorfake.m_pImageObject=m_pImageObject;
colorfake.OnColorsFake();
//Update the window to display the filtered image
InvalidateRect(NULL);
UpdateWindow();
}
void CPhotoStarView::OnEnhanceMaxfilter()
{
//Display the parameter dialogue
CMaxFiltDlg dlg;
if (dlg.DoModal() != IDOK)
{
return;
}
//Get user inputs from the dialogue object
int iWinSize = dlg.m_iWinSize;
//Make a filter instance
CFilter filt(m_pImageObject, iWinSize);
//Filter operation
filt.MaxFilter();
//Update the window to display the filtered image
InvalidateRect(NULL);
UpdateWindow();
}
void CPhotoStarView::OnEnhanceMinfiltdig()
{
//Display the parameter dialogue
CMinFiltDlg dlg;
if (dlg.DoModal() != IDOK)
{
return;
}
//Get user inputs from the dialogue object
int iWinSize = dlg.m_iWinSize;
//Make a filter instance
CFilter filt(m_pImageObject, iWinSize);
//Filter operation
filt.MinFilter();
//Update the window to display the filtered image
InvalidateRect(NULL);
UpdateWindow();
}
void CPhotoStarView::OnEnhanceSelectfilter()
{
CFilter filter(m_pImageObject,1);
filter.OnSelectFilter();
//Update the window to display the filtered image
InvalidateRect(NULL);
UpdateWindow();
}
void CPhotoStarView::OnOperationAlgrbra()
{
//Display the parameter dialogue
CAlgebra algebra;
if (algebra.DoModal() != IDOK)
{
return;
}
//Get user inputs from the dialogue object
int iWinSize = algebra.m_iKind;
int imKind=algebra.m_imKind;
//Make a filter instance
CPhotoStarDoc *doc = GetDocument();
CImageOperation operation(iWinSize,imKind);
operation.m_pImageObject1=doc->GetFirstImage();
operation.m_pImageObject2=m_pImageObject;
//Filter operation
operation.OnAlgebraOperation();
//Update the window to display the filtered image
InvalidateRect(NULL);
UpdateWindow();
}
void CPhotoStarView::OnEnhanceLogicoperation()
{
//Display the parameter dialogue
CLogic logic;
if (logic.DoModal() != IDOK)
{
return;
}
//Get user inputs from the dialogue object
int imKind=logic.m_ikind;
//Make a filter instance
CPhotoStarDoc *doc = GetDocument();
CImageOperation operation(1,imKind);
operation.m_pImageObject1=doc->GetFirstImage();
operation.m_pImageObject2=m_pImageObject;
//Filter operation
operation.onLogicOperation();
//Update the window to display the filtered image
InvalidateRect(NULL);
UpdateWindow();
}
void CPhotoStarView::OnEnhanceMirroroperation()
{
CMirror mirror;
if (mirror.DoModal() != IDOK)
{
return;
}
mirror.m_pImageObject=m_pImageObject;
mirror.OnMirrorOperation();
//Update the window to display the filtered image
InvalidateRect(NULL);
UpdateWindow();
}
void CPhotoStarView::OnZoomimage()
{
CZoomImage zoom;
zoom.DoModal();
zoom.m_pImageObject=m_pImageObject;
zoom.OnZoomImage();
m_pImageObject->Height=zoom.iNewHeight;
m_pImageObject->Width=zoom.iNewWidth;
m_pImageObject->OnChangeImageSize();
CSize sizeTotal;
sizeTotal.cx =zoom.iNewWidth;
sizeTotal.cy =zoom.iNewHeight;
SetScrollSizes (MM_TEXT, sizeTotal);
CChildFrame *pChild = (CChildFrame *) GetParentFrame();
pChild->m_nWidth =zoom.iNewWidth;
pChild->m_nHeight =zoom.iNewHeight;
pChild->SetWindowPos( NULL , 0, 0, 2500, 2500, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED);
//Update the window to display the filtered image
InvalidateRect(NULL);
UpdateWindow();
}
void CPhotoStarView::OnEnhanceFft1()
{
CFfuriour furiour;
m_flag=-1;
furiour.m_translatetype=1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -