ImageViewView.cpp
上传用户:alisonmail
上传日期:2013-02-28
资源大小:500k
文件大小:25k
源码类别:

图片显示

开发平台:

Visual C++

  1. // ImageViewView.cpp : implementation of the CImageViewView class
  2. //
  3. #include "stdafx.h"
  4. #include "ImageView.h"
  5. #include "ImageViewDoc.h"
  6. #include "ImageViewView.h"
  7. #include "MainFrm.h"
  8. #include "ChildFrm.h"
  9. #include "NewImageSize.h"
  10. #include "RotateImage.h"
  11. #include "PaletteCreationType.h"
  12. #include "NewColorDepth.h"
  13. #include "Brightness.h"
  14. #include "ViewHistogram.h"
  15. #include "ImagePointProcesses.h"
  16. #include "ImageAreaProcesses.h"
  17. #include "DlgEdgeDetect.h"
  18. #include "DlgAddNoise.h"
  19. #ifdef _DEBUG
  20. #define new DEBUG_NEW
  21. #undef THIS_FILE
  22. static char THIS_FILE[] = __FILE__;
  23. #endif
  24. /////////////////////////////////////////////////////////////////////////////
  25. // CImageViewView
  26. IMPLEMENT_DYNCREATE(CImageViewView, CScrollView)
  27. BEGIN_MESSAGE_MAP(CImageViewView, CScrollView)
  28. //{{AFX_MSG_MAP(CImageViewView)
  29. ON_WM_SETFOCUS()
  30. ON_COMMAND(ID_OPERATIONS_SHOWCROPBOX, OnOperationsShowcropbox)
  31. ON_UPDATE_COMMAND_UI(ID_OPERATIONS_SHOWCROPBOX, OnUpdateOperationsShowcropbox)
  32. ON_WM_LBUTTONDOWN()
  33. ON_WM_SETCURSOR()
  34. ON_COMMAND(ID_OPERATIONS_CROP, OnOperationsCrop)
  35. ON_COMMAND(ID_OPERATIONS_STRETCH, OnOperationsStretch)
  36. ON_COMMAND(ID_OPERATIONS_FLIP, OnOperationsFlip)
  37. ON_COMMAND(ID_OPERATIONS_INVERT, OnOperationsInvert)
  38. ON_COMMAND(ID_OPERATIONS_ROTATE, OnOperationsRotate)
  39. ON_COMMAND(ID_OPERATIONS_SETPALETTECREATIONTYPE, OnOperationsSetpalettecreationtype)
  40. ON_COMMAND(ID_OPERATIONS_CHANGEIMAGECOLORDEPTH, OnOperationsChangeimagecolordepth)
  41. ON_COMMAND(ID_POINTPROCESSES_CHANGEBRIGHTNESS, OnPointprocessesChangebrightness)
  42. ON_COMMAND(ID_POINTPROCESSES_COLORIZE, OnPointprocessesColorize)
  43. ON_COMMAND(ID_POINTPROCESSES_MAKEGRAY, OnPointprocessesMakegray)
  44. ON_COMMAND(ID_POINTPROCESSES_REVERSECOLORS, OnPointprocessesReversecolors)
  45. ON_COMMAND(ID_POINTPROCESSES_VIEWHISTOGRAM, OnPointprocessesViewhistogram)
  46. ON_COMMAND(ID_AREAPROCESSES_CHANGECONTRACT, OnAreaprocessesChangecontract)
  47. ON_COMMAND(ID_AREAPROCESSES_EDGEENHANCE, OnAreaprocessesEdgeenhance)
  48. ON_COMMAND(ID_AREAPROCESSES_EQUALIZECONTRAST, OnAreaprocessesEqualizecontrast)
  49. ON_COMMAND(ID_AREAPROCESSES_HIGHPASSFILTER, OnAreaprocessesHighpassfilter)
  50. ON_COMMAND(ID_AREAPROCESSES_LOWPASSFILTER, OnAreaprocessesLowpassfilter)
  51. ON_COMMAND(ID_AREAPROCESSES_MEDIANFILTER, OnAreaprocessesMedianfilter)
  52. ON_COMMAND(ID_POINTPROCESSES_FFT, OnPointprocessesFft)
  53. ON_COMMAND(ID_POINTPROCESSES_IFFT, OnPointprocessesIfft)
  54. ON_COMMAND(ID_POINTPROCESSES_DCT, OnPointprocessesDct)
  55. ON_COMMAND(ID_EDGEDETECT, OnEdgedetect)
  56. ON_WM_RBUTTONUP()
  57. ON_COMMAND(ID_RELOAD, OnReload)
  58. ON_COMMAND(ID_ADDNOISE, OnAddnoise)
  59. ON_COMMAND(ID_RIVER_EXTRACT, OnRiverExtract)
  60. //}}AFX_MSG_MAP
  61. END_MESSAGE_MAP()
  62. /////////////////////////////////////////////////////////////////////////////
  63. // CImageViewView construction/destruction
  64. CImageViewView::CImageViewView()
  65. {
  66. m_pImageObject = NULL;
  67. m_bImageLoaded = FALSE;
  68. m_bCropBoxShowing = FALSE;
  69. CRect Rect( 10, 10, 200, 100 );
  70. m_pTracker = new CRectTracker( &Rect, CRectTracker::solidLine | CRectTracker::resizeOutside );
  71. }
  72. CImageViewView::~CImageViewView()
  73. {
  74. if( m_pImageObject != NULL ) delete m_pImageObject;
  75. if( m_pTracker ) delete m_pTracker;
  76. }
  77. BOOL CImageViewView::PreCreateWindow(CREATESTRUCT& cs)
  78. {
  79. // TODO: Modify the Window class or styles here by modifying
  80. //  the CREATESTRUCT cs
  81. return CScrollView::PreCreateWindow(cs);
  82. }
  83. /////////////////////////////////////////////////////////////////////////////
  84. // CImageViewView drawing
  85. void CImageViewView::OnDraw(CDC* pDC)
  86. {
  87. CImageViewDoc* pDoc = GetDocument();
  88. ASSERT_VALID(pDoc);
  89. if( !m_bImageLoaded ){
  90. CString PathName = pDoc->GetPathName ();
  91. BeginWaitCursor ();
  92. m_pImageObject = new CImageObject( PathName.GetBuffer( 3 ), pDC );
  93. EndWaitCursor ();
  94. if( m_pImageObject == NULL ){
  95. AfxMessageBox( "Could not create picture class!" );
  96. return;
  97. }
  98. CSize SizeTotal;
  99. SizeTotal.cx = m_pImageObject->GetWidth();
  100. SizeTotal.cy = m_pImageObject->GetHeight();
  101. SetScrollSizes (MM_TEXT, SizeTotal);
  102. CMainFrame *pFrame = (CMainFrame *) AfxGetMainWnd();
  103. CChildFrame *pChild = (CChildFrame *) pFrame->MDIGetActive();
  104. pChild->m_nWidth = m_pImageObject->GetWidth(); 
  105. pChild->m_nHeight = m_pImageObject->GetHeight(); 
  106. pChild->SetWindowPos( NULL, 0, 0, 2500, 2500, SWP_NOZORDER | SWP_NOMOVE );
  107. m_bImageLoaded = TRUE;
  108. }
  109. OnPrepareDC (pDC);
  110. if( GetFocus() == this ) m_pImageObject->SetPalette( pDC );
  111. m_pImageObject->Draw( pDC );
  112. if( m_pTracker != NULL && m_bCropBoxShowing )
  113. m_pTracker->Draw( pDC );
  114. }
  115. void CImageViewView::OnInitialUpdate()
  116. {
  117. CScrollView::OnInitialUpdate();
  118. CSize sizeTotal;
  119. // TODO: calculate the total size of this view
  120. sizeTotal.cx = sizeTotal.cy = 100;
  121. SetScrollSizes(MM_TEXT, sizeTotal);
  122. }
  123. /////////////////////////////////////////////////////////////////////////////
  124. // CImageViewView diagnostics
  125. #ifdef _DEBUG
  126. void CImageViewView::AssertValid() const
  127. {
  128. CScrollView::AssertValid();
  129. }
  130. void CImageViewView::Dump(CDumpContext& dc) const
  131. {
  132. CScrollView::Dump(dc);
  133. }
  134. CImageViewDoc* CImageViewView::GetDocument() // non-debug version is inline
  135. {
  136. ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CImageViewDoc)));
  137. return (CImageViewDoc*)m_pDocument;
  138. }
  139. #endif //_DEBUG
  140. /////////////////////////////////////////////////////////////////////////////
  141. // CImageViewView message handlers
  142. void CImageViewView::OnSetFocus(CWnd* pOldWnd) 
  143. {
  144. CScrollView::OnSetFocus(pOldWnd);
  145. if( m_pImageObject != NULL ){
  146. CClientDC ClientDC( this );
  147. OnPrepareDC( &ClientDC );
  148. m_pImageObject->SetPalette( &ClientDC );
  149. m_pImageObject->Draw( &ClientDC );
  150. }
  151. }
  152. void CImageViewView::OnOperationsShowcropbox() 
  153. {
  154. if( m_pTracker != NULL ){
  155. m_bCropBoxShowing = !m_bCropBoxShowing;
  156. InvalidateRect( NULL, FALSE );
  157. UpdateWindow();
  158. }
  159. }
  160. void CImageViewView::OnUpdateOperationsShowcropbox(CCmdUI* pCmdUI) 
  161. {
  162. if( !m_pTracker ) pCmdUI->Enable( FALSE );
  163. else{
  164. if( m_bCropBoxShowing ) pCmdUI->SetCheck( TRUE );
  165. else pCmdUI->SetCheck( FALSE );
  166. }
  167. }
  168. void CImageViewView::OnLButtonDown(UINT nFlags, CPoint point) 
  169. {
  170. if( m_pTracker != NULL && m_bCropBoxShowing && m_pTracker->Track( this, point, FALSE ) ){
  171. InvalidateRect( NULL, FALSE );
  172. UpdateWindow();
  173. }
  174. CScrollView::OnLButtonDown(nFlags, point);
  175. }
  176. BOOL CImageViewView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) 
  177. {
  178. if( m_pTracker != NULL && m_bCropBoxShowing && pWnd == this && m_pTracker->SetCursor( this, nHitTest ) )
  179. return( TRUE );
  180. return CScrollView::OnSetCursor(pWnd, nHitTest, message);
  181. }
  182. void CImageViewView::OnOperationsCrop() 
  183. {
  184. if( m_pTracker == NULL || m_pImageObject == NULL ) return;
  185. int nX1 = m_pTracker->m_rect.left;
  186. int nY1 = m_pTracker->m_rect.top;
  187. int nX2 = m_pTracker->m_rect.right;
  188. int nY2 = m_pTracker->m_rect.bottom;
  189. if( nX1 < 0 ) nX1 = 0;
  190. if( nX1 > m_pImageObject->GetWidth() - 1 ) nX1 = m_pImageObject->GetWidth() - 1;
  191. if( nY1 < 0 ) nY1 = 0;
  192. if( nY1 > m_pImageObject->GetHeight() - 1 ) nY1 = m_pImageObject->GetHeight() - 1;
  193. if( nX2 < 0 ) nX2 = 0;
  194. if( nX2 > m_pImageObject->GetWidth() - 1 ) nX2 = m_pImageObject->GetWidth() - 1;
  195. if( nY2 < 0 ) nY2 = 0;
  196. if( nY2 > m_pImageObject->GetHeight() - 1 ) nY2 = m_pImageObject->GetHeight() - 1;
  197. m_pImageObject->Crop( nX1, nY1, nX2, nY2 );
  198. if( m_pTracker->m_rect.right > m_pImageObject->GetWidth() - 1 ) m_pTracker->m_rect.right = m_pImageObject->GetWidth() - 1;
  199. if( m_pTracker->m_rect.bottom > m_pImageObject->GetHeight() - 1 ) m_pTracker->m_rect.bottom = m_pImageObject->GetHeight() - 1;
  200. if( m_pTracker->m_rect.left > m_pImageObject->GetWidth() - 40 ) m_pTracker->m_rect.left = m_pImageObject->GetWidth() - 40;
  201. if( m_pTracker->m_rect.left < 0 ) m_pTracker->m_rect.left = 0;
  202. if( m_pTracker->m_rect.top > m_pImageObject->GetHeight() - 40 ) m_pTracker->m_rect.top = m_pImageObject->GetHeight() - 40;
  203. if( m_pTracker->m_rect.top < 0 ) m_pTracker->m_rect.top = 0;
  204. m_bCropBoxShowing = FALSE;
  205. ResizeWindow();
  206. }
  207. void CImageViewView::OnOperationsStretch() 
  208. {
  209. if( m_pImageObject == NULL ) return;
  210. CNewImageSize NewImageSize;
  211. NewImageSize.m_nWidth = m_pImageObject->GetWidth();
  212. NewImageSize.m_nHeight = m_pImageObject->GetHeight();
  213. char junk[200];
  214. wsprintf( junk, "The current size is %d by %d", NewImageSize.m_nWidth, NewImageSize.m_nHeight );
  215. NewImageSize.m_CurrentSize = junk;
  216. if( NewImageSize.DoModal() == IDOK ){
  217. m_pImageObject->Stretch( NewImageSize.m_nWidth, NewImageSize.m_nHeight );
  218. if( m_pTracker != NULL ){
  219. if( m_pTracker->m_rect.right > m_pImageObject->GetWidth() - 1 ) m_pTracker->m_rect.right = m_pImageObject->GetWidth() - 1;
  220. if( m_pTracker->m_rect.bottom > m_pImageObject->GetHeight() - 1 ) m_pTracker->m_rect.bottom = m_pImageObject->GetHeight() - 1;
  221. if( m_pTracker->m_rect.left > m_pImageObject->GetWidth() - 40 ) m_pTracker->m_rect.left = m_pImageObject->GetWidth() - 40;
  222. if( m_pTracker->m_rect.left < 0 ) m_pTracker->m_rect.left = 0;
  223. if( m_pTracker->m_rect.top > m_pImageObject->GetHeight() - 40 ) m_pTracker->m_rect.top = m_pImageObject->GetHeight() - 40;
  224. if( m_pTracker->m_rect.top < 0 ) m_pTracker->m_rect.top = 0;
  225. }
  226. m_bCropBoxShowing = FALSE;
  227. ResizeWindow();
  228. }
  229. }
  230. void CImageViewView::OnOperationsFlip() 
  231. {
  232. if( m_pImageObject == NULL ) return;
  233. m_pImageObject->Reverse();
  234. InvalidateRect( NULL, FALSE );
  235. UpdateWindow();
  236. }
  237. void CImageViewView::OnOperationsInvert() 
  238. {
  239. if( m_pImageObject == NULL ) return;
  240. m_pImageObject->Invert();
  241. InvalidateRect( NULL, FALSE );
  242. UpdateWindow();
  243. }
  244. void CImageViewView::OnOperationsRotate() 
  245. {
  246. if( m_pImageObject == NULL ) return;
  247. CRotateImage RotateImage;
  248. RotateImage.m_Rotate = 0;
  249. if( RotateImage.DoModal() == IDOK ){
  250. m_pImageObject->Rotate( 90 + RotateImage.m_Rotate * 90 );
  251. if( RotateImage.m_Rotate == 1 ){
  252. InvalidateRect( NULL, FALSE );
  253. UpdateWindow();
  254. }
  255. else ResizeWindow();
  256. }
  257. }
  258. void CImageViewView::ResizeWindow( void )
  259. {
  260. CSize SizeTotal;
  261. SizeTotal.cx = m_pImageObject->GetWidth();
  262. SizeTotal.cy = m_pImageObject->GetHeight();
  263. SetScrollSizes (MM_TEXT, SizeTotal);
  264. CMainFrame *pFrame = (CMainFrame *) AfxGetMainWnd();
  265. CChildFrame *pChild = (CChildFrame *) pFrame->MDIGetActive();
  266. pChild->m_nWidth = m_pImageObject->GetWidth(); 
  267. pChild->m_nHeight = m_pImageObject->GetHeight(); 
  268. pChild->SetWindowPos( NULL, 0, 0, 2500, 2500, SWP_NOZORDER | SWP_NOMOVE );
  269. }
  270. void CImageViewView::OnOperationsSetpalettecreationtype() 
  271. {
  272. if( m_pImageObject == NULL ) return;
  273. CPaletteCreationType PaletteCreationType;
  274. PaletteCreationType.m_PaletteCreationType = m_pImageObject->GetPaletteCreationType();
  275. if( PaletteCreationType.DoModal() == IDOK ){
  276. m_pImageObject->SetPaletteCreationType( PaletteCreationType.m_PaletteCreationType );
  277. }
  278. }
  279. void CImageViewView::OnOperationsChangeimagecolordepth() 
  280. {
  281. if( m_pImageObject == NULL ) return;
  282. CNewColorDepth NewColorDepth;
  283. switch( m_pImageObject->GetNumBits() ){
  284. case 1:
  285. case 4:
  286. NewColorDepth.m_nCurrentColorDepth = -1;
  287. NewColorDepth.m_nNewColorDepth = 0;
  288. break;
  289. case 8:
  290. NewColorDepth.m_nCurrentColorDepth = 0;
  291. NewColorDepth.m_nNewColorDepth = 2;
  292. break;
  293. case 16:
  294. NewColorDepth.m_nCurrentColorDepth = 1;
  295. NewColorDepth.m_nNewColorDepth = 2;
  296. break;
  297. case 24:
  298. NewColorDepth.m_nCurrentColorDepth = 2;
  299. NewColorDepth.m_nNewColorDepth = 1;
  300. break;
  301. case 32:
  302. NewColorDepth.m_nCurrentColorDepth = 3;
  303. NewColorDepth.m_nNewColorDepth = 2;
  304. break;
  305. }
  306. if( NewColorDepth.DoModal() == IDOK ){
  307. BeginWaitCursor();
  308. m_pImageObject->ChangeFormat( 8 + NewColorDepth.m_nNewColorDepth * 8 );
  309. EndWaitCursor();
  310. InvalidateRect( NULL, FALSE );
  311. UpdateWindow();
  312. }
  313. }
  314. void CImageViewView::OnPointprocessesChangebrightness() 
  315. {
  316. if( m_pTracker == NULL || m_pImageObject == NULL ) return;
  317. int nX1 = m_pTracker->m_rect.left;
  318. int nY1 = m_pTracker->m_rect.top;
  319. int nX2 = m_pTracker->m_rect.right;
  320. int nY2 = m_pTracker->m_rect.bottom;
  321. if( nX1 < 0 ) nX1 = 0;
  322. if( nX1 > m_pImageObject->GetWidth() - 1 ) nX1 = m_pImageObject->GetWidth() - 1;
  323. if( nY1 < 0 ) nY1 = 0;
  324. if( nY1 > m_pImageObject->GetHeight() - 1 ) nY1 = m_pImageObject->GetHeight() - 1;
  325. if( nX2 < 0 ) nX2 = 0;
  326. if( nX2 > m_pImageObject->GetWidth() - 1 ) nX2 = m_pImageObject->GetWidth() - 1;
  327. if( nY2 < 0 ) nY2 = 0;
  328. if( nY2 > m_pImageObject->GetHeight() - 1 ) nY2 = m_pImageObject->GetHeight() - 1;
  329. if( !m_bCropBoxShowing ){
  330. nX1 = nY1 = 0;
  331. nX2 = m_pImageObject->GetWidth() - 1;
  332. nY2 = m_pImageObject->GetHeight() - 1;
  333. }
  334. CBrightness Brightness;
  335. if( Brightness.DoModal() != IDOK ) return;
  336. CImagePointProcesses PointProcesses( m_pImageObject );
  337. BeginWaitCursor();
  338. PointProcesses.ChangeBrightness( Brightness.m_nBrightness, nX1, nY1, nX2, nY2 );
  339. EndWaitCursor();
  340. InvalidateRect( NULL, FALSE );
  341. UpdateWindow();
  342. }
  343. void CImageViewView::OnPointprocessesColorize() 
  344. {
  345. if( m_pTracker == NULL || m_pImageObject == NULL ) return;
  346. int nX1 = m_pTracker->m_rect.left;
  347. int nY1 = m_pTracker->m_rect.top;
  348. int nX2 = m_pTracker->m_rect.right;
  349. int nY2 = m_pTracker->m_rect.bottom;
  350. if( nX1 < 0 ) nX1 = 0;
  351. if( nX1 > m_pImageObject->GetWidth() - 1 ) nX1 = m_pImageObject->GetWidth() - 1;
  352. if( nY1 < 0 ) nY1 = 0;
  353. if( nY1 > m_pImageObject->GetHeight() - 1 ) nY1 = m_pImageObject->GetHeight() - 1;
  354. if( nX2 < 0 ) nX2 = 0;
  355. if( nX2 > m_pImageObject->GetWidth() - 1 ) nX2 = m_pImageObject->GetWidth() - 1;
  356. if( nY2 < 0 ) nY2 = 0;
  357. if( nY2 > m_pImageObject->GetHeight() - 1 ) nY2 = m_pImageObject->GetHeight() - 1;
  358. if( !m_bCropBoxShowing ){
  359. nX1 = nY1 = 0;
  360. nX2 = m_pImageObject->GetWidth() - 1;
  361. nY2 = m_pImageObject->GetHeight() - 1;
  362. }
  363. CColorDialog ColorDialog;
  364. if( ColorDialog.DoModal() != IDOK ) return;
  365. CImagePointProcesses PointProcesses( m_pImageObject );
  366. BeginWaitCursor();
  367. PointProcesses.Colorize( nX1, nY1, nX2, nY2, ColorDialog.GetColor() );
  368. EndWaitCursor();
  369. InvalidateRect( NULL, FALSE );
  370. UpdateWindow();
  371. }
  372. void CImageViewView::OnPointprocessesMakegray() 
  373. {
  374. if( m_pImageObject == NULL ) return;
  375. CImagePointProcesses PointProcesses( m_pImageObject );
  376. PointProcesses.MakeGray( TRUE );
  377. InvalidateRect( NULL, FALSE );
  378. UpdateWindow();
  379. }
  380. void CImageViewView::OnPointprocessesReversecolors() 
  381. {
  382. if( m_pTracker == NULL || m_pImageObject == NULL ) return;
  383. int nX1 = m_pTracker->m_rect.left;
  384. int nY1 = m_pTracker->m_rect.top;
  385. int nX2 = m_pTracker->m_rect.right;
  386. int nY2 = m_pTracker->m_rect.bottom;
  387. if( nX1 < 0 ) nX1 = 0;
  388. if( nX1 > m_pImageObject->GetWidth() - 1 ) nX1 = m_pImageObject->GetWidth() - 1;
  389. if( nY1 < 0 ) nY1 = 0;
  390. if( nY1 > m_pImageObject->GetHeight() - 1 ) nY1 = m_pImageObject->GetHeight() - 1;
  391. if( nX2 < 0 ) nX2 = 0;
  392. if( nX2 > m_pImageObject->GetWidth() - 1 ) nX2 = m_pImageObject->GetWidth() - 1;
  393. if( nY2 < 0 ) nY2 = 0;
  394. if( nY2 > m_pImageObject->GetHeight() - 1 ) nY2 = m_pImageObject->GetHeight() - 1;
  395. if( !m_bCropBoxShowing ){
  396. nX1 = nY1 = 0;
  397. nX2 = m_pImageObject->GetWidth() - 1;
  398. nY2 = m_pImageObject->GetHeight() - 1;
  399. }
  400. CImagePointProcesses PointProcesses( m_pImageObject );
  401. BeginWaitCursor();
  402. PointProcesses.ReverseColors( nX1, nY1, nX2, nY2 );
  403. EndWaitCursor();
  404. InvalidateRect( NULL, FALSE );
  405. UpdateWindow();
  406. }
  407. void CImageViewView::OnPointprocessesViewhistogram() 
  408. {
  409. if( m_pImageObject == NULL ) return;
  410. HGLOBAL hDib = m_pImageObject->GetDib();
  411. if( hDib == NULL ) return;
  412. unsigned char *pBits, *pPalette;
  413. pBits = (unsigned char *) ::GlobalLock( hDib );
  414. pBits += ( sizeof( BITMAPFILEHEADER ) + sizeof( BITMAPINFOHEADER ) );
  415. pPalette = pBits;
  416. pBits += m_pImageObject->GetPaletteBytes();
  417. CImagePointProcesses ImagePointProcesses( m_pImageObject );
  418. int *pHistogram = ImagePointProcesses.CreateHistogram( 0, 0,
  419. m_pImageObject->GetWidth() - 1,
  420. m_pImageObject->GetHeight() - 1,
  421. pBits, (RGBQUAD *) pPalette,
  422. m_pImageObject->WidthBytes( m_pImageObject->GetNumBits(),
  423. m_pImageObject->GetWidth() ) );
  424. if( pHistogram != NULL ){
  425. CViewHistogram ViewHistogram;
  426. ViewHistogram.m_pnHistogram = pHistogram;
  427. ViewHistogram.DoModal();
  428. delete [] pHistogram;
  429. }
  430. }
  431. void CImageViewView::OnAreaprocessesChangecontract() 
  432. {
  433. if( m_pTracker == NULL || m_pImageObject == NULL ) return;
  434. int nX1 = m_pTracker->m_rect.left;
  435. int nY1 = m_pTracker->m_rect.top;
  436. int nX2 = m_pTracker->m_rect.right;
  437. int nY2 = m_pTracker->m_rect.bottom;
  438. if( nX1 < 0 ) nX1 = 0;
  439. if( nX1 > m_pImageObject->GetWidth() - 1 ) nX1 = m_pImageObject->GetWidth() - 1;
  440. if( nY1 < 0 ) nY1 = 0;
  441. if( nY1 > m_pImageObject->GetHeight() - 1 ) nY1 = m_pImageObject->GetHeight() - 1;
  442. if( nX2 < 0 ) nX2 = 0;
  443. if( nX2 > m_pImageObject->GetWidth() - 1 ) nX2 = m_pImageObject->GetWidth() - 1;
  444. if( nY2 < 0 ) nY2 = 0;
  445. if( nY2 > m_pImageObject->GetHeight() - 1 ) nY2 = m_pImageObject->GetHeight() - 1;
  446. if( !m_bCropBoxShowing ){
  447. nX1 = nY1 = 0;
  448. nX2 = m_pImageObject->GetWidth() - 1;
  449. nY2 = m_pImageObject->GetHeight() - 1;
  450. }
  451. CBrightness Brightness;
  452. strcpy( Brightness.m_szTitle, "Set Contrast" );
  453. strcpy( Brightness.m_szLabel, "Contrast" );
  454. if( Brightness.DoModal() != IDOK ) return;
  455. CImageAreaProcesses AreaProcesses( m_pImageObject );
  456. BeginWaitCursor();
  457. AreaProcesses.ChangeContrast( Brightness.m_nBrightness, nX1, nY1, nX2, nY2 );
  458. EndWaitCursor();
  459. InvalidateRect( NULL, FALSE );
  460. UpdateWindow();
  461. }
  462. void CImageViewView::OnAreaprocessesEdgeenhance() 
  463. {
  464. if( m_pTracker == NULL || m_pImageObject == NULL ) return;
  465. int nX1 = m_pTracker->m_rect.left;
  466. int nY1 = m_pTracker->m_rect.top;
  467. int nX2 = m_pTracker->m_rect.right;
  468. int nY2 = m_pTracker->m_rect.bottom;
  469. if( nX1 < 0 ) nX1 = 0;
  470. if( nX1 > m_pImageObject->GetWidth() - 1 ) nX1 = m_pImageObject->GetWidth() - 1;
  471. if( nY1 < 0 ) nY1 = 0;
  472. if( nY1 > m_pImageObject->GetHeight() - 1 ) nY1 = m_pImageObject->GetHeight() - 1;
  473. if( nX2 < 0 ) nX2 = 0;
  474. if( nX2 > m_pImageObject->GetWidth() - 1 ) nX2 = m_pImageObject->GetWidth() - 1;
  475. if( nY2 < 0 ) nY2 = 0;
  476. if( nY2 > m_pImageObject->GetHeight() - 1 ) nY2 = m_pImageObject->GetHeight() - 1;
  477. if( !m_bCropBoxShowing ){
  478. nX1 = nY1 = 0;
  479. nX2 = m_pImageObject->GetWidth() - 1;
  480. nY2 = m_pImageObject->GetHeight() - 1;
  481. }
  482. CImageAreaProcesses AreaProcesses( m_pImageObject );
  483. BeginWaitCursor();
  484. AreaProcesses.EdgeEnhance( nX1, nY1, nX2, nY2 );
  485. EndWaitCursor();
  486. InvalidateRect( NULL, FALSE );
  487. UpdateWindow();
  488. }
  489. void CImageViewView::OnAreaprocessesEqualizecontrast() 
  490. {
  491. if( m_pTracker == NULL || m_pImageObject == NULL ) return;
  492. int nX1 = m_pTracker->m_rect.left;
  493. int nY1 = m_pTracker->m_rect.top;
  494. int nX2 = m_pTracker->m_rect.right;
  495. int nY2 = m_pTracker->m_rect.bottom;
  496. if( nX1 < 0 ) nX1 = 0;
  497. if( nX1 > m_pImageObject->GetWidth() - 1 ) nX1 = m_pImageObject->GetWidth() - 1;
  498. if( nY1 < 0 ) nY1 = 0;
  499. if( nY1 > m_pImageObject->GetHeight() - 1 ) nY1 = m_pImageObject->GetHeight() - 1;
  500. if( nX2 < 0 ) nX2 = 0;
  501. if( nX2 > m_pImageObject->GetWidth() - 1 ) nX2 = m_pImageObject->GetWidth() - 1;
  502. if( nY2 < 0 ) nY2 = 0;
  503. if( nY2 > m_pImageObject->GetHeight() - 1 ) nY2 = m_pImageObject->GetHeight() - 1;
  504. if( !m_bCropBoxShowing ){
  505. nX1 = nY1 = 0;
  506. nX2 = m_pImageObject->GetWidth() - 1;
  507. nY2 = m_pImageObject->GetHeight() - 1;
  508. }
  509. CImageAreaProcesses AreaProcesses( m_pImageObject );
  510. BeginWaitCursor();
  511. AreaProcesses.EqualizeContrast( nX1, nY1, nX2, nY2 );
  512. EndWaitCursor();
  513. InvalidateRect( NULL, FALSE );
  514. UpdateWindow();
  515. }
  516. void CImageViewView::OnAreaprocessesHighpassfilter() 
  517. {
  518. if( m_pTracker == NULL || m_pImageObject == NULL ) return;
  519. int nX1 = m_pTracker->m_rect.left;
  520. int nY1 = m_pTracker->m_rect.top;
  521. int nX2 = m_pTracker->m_rect.right;
  522. int nY2 = m_pTracker->m_rect.bottom;
  523. if( nX1 < 0 ) nX1 = 0;
  524. if( nX1 > m_pImageObject->GetWidth() - 1 ) nX1 = m_pImageObject->GetWidth() - 1;
  525. if( nY1 < 0 ) nY1 = 0;
  526. if( nY1 > m_pImageObject->GetHeight() - 1 ) nY1 = m_pImageObject->GetHeight() - 1;
  527. if( nX2 < 0 ) nX2 = 0;
  528. if( nX2 > m_pImageObject->GetWidth() - 1 ) nX2 = m_pImageObject->GetWidth() - 1;
  529. if( nY2 < 0 ) nY2 = 0;
  530. if( nY2 > m_pImageObject->GetHeight() - 1 ) nY2 = m_pImageObject->GetHeight() - 1;
  531. if( !m_bCropBoxShowing ){
  532. nX1 = nY1 = 0;
  533. nX2 = m_pImageObject->GetWidth() - 1;
  534. nY2 = m_pImageObject->GetHeight() - 1;
  535. }
  536. CImageAreaProcesses AreaProcesses( m_pImageObject );
  537. BeginWaitCursor();
  538. AreaProcesses.HighpassFilter( nX1, nY1, nX2, nY2 );
  539. EndWaitCursor();
  540. InvalidateRect( NULL, FALSE );
  541. UpdateWindow();
  542. }
  543. void CImageViewView::OnAreaprocessesLowpassfilter() 
  544. {
  545. if( m_pTracker == NULL || m_pImageObject == NULL ) return;
  546. int nX1 = m_pTracker->m_rect.left;
  547. int nY1 = m_pTracker->m_rect.top;
  548. int nX2 = m_pTracker->m_rect.right;
  549. int nY2 = m_pTracker->m_rect.bottom;
  550. if( nX1 < 0 ) nX1 = 0;
  551. if( nX1 > m_pImageObject->GetWidth() - 1 ) nX1 = m_pImageObject->GetWidth() - 1;
  552. if( nY1 < 0 ) nY1 = 0;
  553. if( nY1 > m_pImageObject->GetHeight() - 1 ) nY1 = m_pImageObject->GetHeight() - 1;
  554. if( nX2 < 0 ) nX2 = 0;
  555. if( nX2 > m_pImageObject->GetWidth() - 1 ) nX2 = m_pImageObject->GetWidth() - 1;
  556. if( nY2 < 0 ) nY2 = 0;
  557. if( nY2 > m_pImageObject->GetHeight() - 1 ) nY2 = m_pImageObject->GetHeight() - 1;
  558. if( !m_bCropBoxShowing ){
  559. nX1 = nY1 = 0;
  560. nX2 = m_pImageObject->GetWidth() - 1;
  561. nY2 = m_pImageObject->GetHeight() - 1;
  562. }
  563. CImageAreaProcesses AreaProcesses( m_pImageObject );
  564. BeginWaitCursor();
  565. AreaProcesses.LowpassFilter( nX1, nY1, nX2, nY2 );
  566. EndWaitCursor();
  567. InvalidateRect( NULL, FALSE );
  568. UpdateWindow();
  569. }
  570. void CImageViewView::OnAreaprocessesMedianfilter() 
  571. {
  572. if( m_pTracker == NULL || m_pImageObject == NULL ) return;
  573. int nX1 = m_pTracker->m_rect.left;
  574. int nY1 = m_pTracker->m_rect.top;
  575. int nX2 = m_pTracker->m_rect.right;
  576. int nY2 = m_pTracker->m_rect.bottom;
  577. if( nX1 < 0 ) nX1 = 0;
  578. if( nX1 > m_pImageObject->GetWidth() - 1 ) nX1 = m_pImageObject->GetWidth() - 1;
  579. if( nY1 < 0 ) nY1 = 0;
  580. if( nY1 > m_pImageObject->GetHeight() - 1 ) nY1 = m_pImageObject->GetHeight() - 1;
  581. if( nX2 < 0 ) nX2 = 0;
  582. if( nX2 > m_pImageObject->GetWidth() - 1 ) nX2 = m_pImageObject->GetWidth() - 1;
  583. if( nY2 < 0 ) nY2 = 0;
  584. if( nY2 > m_pImageObject->GetHeight() - 1 ) nY2 = m_pImageObject->GetHeight() - 1;
  585. if( !m_bCropBoxShowing ){
  586. nX1 = nY1 = 0;
  587. nX2 = m_pImageObject->GetWidth() - 1;
  588. nY2 = m_pImageObject->GetHeight() - 1;
  589. }
  590. CImageAreaProcesses AreaProcesses( m_pImageObject );
  591. BeginWaitCursor();
  592. AreaProcesses.MedianFilter( nX1, nY1, nX2, nY2 );
  593. EndWaitCursor();
  594. InvalidateRect( NULL, FALSE );
  595. UpdateWindow();
  596. }
  597. void CImageViewView::OnPointprocessesFft() 
  598. {
  599. if( m_pTracker == NULL || m_pImageObject == NULL ) return;
  600. /*
  601. int nX1 = m_pTracker->m_rect.left;
  602. int nY1 = m_pTracker->m_rect.top;
  603. int nX2 = m_pTracker->m_rect.right;
  604. int nY2 = m_pTracker->m_rect.bottom;
  605. if( nX1 < 0 ) nX1 = 0;
  606. if( nX1 > m_pImageObject->GetWidth() - 1 ) nX1 = m_pImageObject->GetWidth() - 1;
  607. if( nY1 < 0 ) nY1 = 0;
  608. if( nY1 > m_pImageObject->GetHeight() - 1 ) nY1 = m_pImageObject->GetHeight() - 1;
  609. if( nX2 < 0 ) nX2 = 0;
  610. if( nX2 > m_pImageObject->GetWidth() - 1 ) nX2 = m_pImageObject->GetWidth() - 1;
  611. if( nY2 < 0 ) nY2 = 0;
  612. if( nY2 > m_pImageObject->GetHeight() - 1 ) nY2 = m_pImageObject->GetHeight() - 1;
  613. if( !m_bCropBoxShowing ){
  614. nX1 = nY1 = 0;
  615. nX2 = m_pImageObject->GetWidth() - 1;
  616. nY2 = m_pImageObject->GetHeight() - 1;
  617. }
  618. */
  619. CImagePointProcesses PointProcesses( m_pImageObject );
  620. BeginWaitCursor();
  621. PointProcesses.FFTTrans(m_pImageObject);
  622. EndWaitCursor();
  623. InvalidateRect( NULL, FALSE );
  624. UpdateWindow();
  625. }
  626. void CImageViewView::OnPointprocessesIfft() 
  627. {
  628. // OnPointp
  629. }
  630. void CImageViewView::OnPointprocessesDct() 
  631. {
  632. if( m_pTracker == NULL || m_pImageObject == NULL ) return;
  633. CImagePointProcesses PointProcesses( m_pImageObject );
  634. BeginWaitCursor();
  635. PointProcesses.DCTTrans(m_pImageObject);
  636. EndWaitCursor();
  637. InvalidateRect( NULL, FALSE );
  638. UpdateWindow();
  639. }
  640. void CImageViewView::OnEdgedetect() 
  641. {
  642. if( m_pTracker == NULL || m_pImageObject == NULL ) return;
  643. CDlgEdgeDetect setupDlg;
  644. if(setupDlg.DoModal() == IDOK)
  645. {
  646. CImagePointProcesses PointProcesses( m_pImageObject );
  647. PointProcesses.EdgeDetectType = setupDlg.m_nEdgeDetectType;
  648. PointProcesses.Embossed = setupDlg.m_bEmbossed;
  649. BeginWaitCursor();
  650. PointProcesses.EdgeDetect(m_pImageObject);
  651. EndWaitCursor();
  652. }
  653. InvalidateRect( NULL, FALSE );
  654. UpdateWindow();
  655. }
  656. void CImageViewView::OnRButtonUp(UINT nFlags, CPoint point) 
  657. {
  658. CMenu popupMenu;
  659. popupMenu.LoadMenu(IDR_POPUPMENU);
  660. ClientToScreen(&point);
  661. popupMenu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON, point.x, point.y, this);
  662. CScrollView::OnRButtonUp(nFlags, point);
  663. }
  664. void CImageViewView::OnReload() 
  665. {
  666. m_bImageLoaded = FALSE;
  667. InvalidateRect( NULL, FALSE );
  668. UpdateWindow();
  669. }
  670. void CImageViewView::OnAddnoise() 
  671. {
  672. if( m_pTracker == NULL || m_pImageObject == NULL ) return;
  673. CImagePointProcesses PointProcesses( m_pImageObject );
  674. CDlgAddNoise dlg;
  675. if(dlg.DoModal() == IDOK)
  676. {
  677. BeginWaitCursor();
  678. PointProcesses.AddNoise(m_pImageObject, dlg.m_nNoiseRatio);
  679. EndWaitCursor();
  680. }
  681. InvalidateRect( NULL, FALSE );
  682. UpdateWindow();
  683. }
  684. void CImageViewView::OnRiverExtract() 
  685. {
  686. if( m_pTracker == NULL || m_pImageObject == NULL ) return;
  687. CImagePointProcesses PointProcesses( m_pImageObject );
  688. BeginWaitCursor();
  689. PointProcesses.ExtractRiver(NULL, m_pImageObject);
  690. EndWaitCursor();
  691. InvalidateRect( NULL, FALSE );
  692. UpdateWindow();
  693. }