DIBDoc.cpp
上传用户:gzboli
上传日期:2013-04-10
资源大小:471k
文件大小:19k
源码类别:

图片显示

开发平台:

Visual C++

  1. // DIBDoc.cpp : implementation of the CDIBDoc class
  2. //
  3. #include "stdafx.h"
  4. #include "QuickImage.h"
  5. #include "DIBDoc.h"
  6. #include "DlgHistogram.h"
  7. #include "raw.h"
  8. #include "importsjpegfile.h"
  9. #include "mainfrm.h"
  10. #include "ConvoluteDlg.h"
  11. #include "ImgProcess.h"
  12. #include "importsgifapi.h"
  13. #include "Global.h"
  14. #ifdef _DEBUG
  15. #define new DEBUG_NEW
  16. #undef THIS_FILE
  17. static char THIS_FILE[] = __FILE__;
  18. #endif
  19. /////////////////////////////////////////////////////////////////////////////
  20. // CDIBDoc
  21. extern CString g_strCurrentDir;
  22. IMPLEMENT_DYNCREATE(CDIBDoc, CDocument)
  23. BEGIN_MESSAGE_MAP(CDIBDoc, CDocument)
  24. //{{AFX_MSG_MAP(CDIBDoc)
  25. //}}AFX_MSG_MAP
  26. ON_MESSAGE(WM_REALIZEPAL, OnRealizePal)
  27. ON_COMMAND_RANGE(ID_IMAGE_HISTOGRAM, ID_IMAGE_THIN, OnImageProcess)
  28. ON_UPDATE_COMMAND_UI_RANGE(ID_IMAGE_HISTOGRAM, ID_IMAGE_THIN, OnUpdateImageProcess)
  29. END_MESSAGE_MAP()
  30. /////////////////////////////////////////////////////////////////////////////
  31. // CDIBDoc construction/destruction
  32. CDIBDoc::CDIBDoc()
  33. {
  34. m_hDIB = NULL;
  35. m_palDIB = NULL;
  36. m_sizeDoc = CSize(1,1);     // dummy value to make CScrollView happy
  37. // m_hRightDIB = NULL;
  38. // *m_strRightFile = '';
  39. }
  40. CDIBDoc::~CDIBDoc()
  41. {
  42. if (m_hDIB != NULL)
  43. {
  44. ::GlobalFree((HGLOBAL) m_hDIB);
  45. m_hDIB = NULL;
  46. }
  47. if (m_palDIB != NULL)
  48. {
  49. delete m_palDIB;
  50. m_palDIB = NULL;
  51. }
  52. /* if (m_hRightDIB != NULL)
  53. {
  54. ::GlobalFree((HGLOBAL) m_hRightDIB);
  55. }*/
  56. }
  57. BOOL CDIBDoc::OnNewDocument()
  58. {
  59. if (!CDocument::OnNewDocument())
  60. return FALSE;
  61. // TODO: add reinitialization code here
  62. // (SDI documents will reuse this document)
  63. return TRUE;
  64. }
  65. void CDIBDoc::InitDIBData()
  66. {
  67. if (m_palDIB != NULL)
  68. {
  69. delete m_palDIB;
  70. m_palDIB = NULL;
  71. }
  72. if (m_hDIB == NULL)
  73. {
  74. return;
  75. }
  76. // Set up document size
  77. LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) m_hDIB);
  78. if (::DIBWidth(lpDIB) > INT_MAX ||abs(::DIBHeight(lpDIB)) > INT_MAX)
  79. {
  80. ::GlobalUnlock((HGLOBAL) m_hDIB);
  81. ::GlobalFree((HGLOBAL) m_hDIB);
  82. m_hDIB = NULL;
  83. CString strMsg;
  84. strMsg.LoadString(IDS_DIB_TOO_BIG);
  85. MessageBox(NULL, strMsg, NULL, MB_ICONINFORMATION | MB_OK);
  86. return;
  87. }
  88. m_sizeDoc = CSize((int) ::DIBWidth(lpDIB), (int) abs(::DIBHeight(lpDIB)));
  89. ::GlobalUnlock((HGLOBAL) m_hDIB);
  90. // Create copy of palette
  91. if(::DIBBitCount(lpDIB) < 24)
  92. {
  93. m_palDIB = new CPalette;
  94. if (m_palDIB == NULL)
  95. {
  96. // we must be really low on memory
  97. ::GlobalFree((HGLOBAL) m_hDIB);
  98. m_hDIB = NULL;
  99. return;
  100. }
  101. if (::CreateDIBPalette(m_hDIB, m_palDIB) == NULL)
  102. {
  103. // DIB may not have a palette
  104. delete m_palDIB;
  105. m_palDIB = NULL;
  106. return;
  107. }
  108. }
  109. }
  110. void CDIBDoc::ReplaceHDIB(HDIB hDIB)
  111. {
  112. if (m_hDIB != NULL)
  113. {
  114. ::GlobalFree((HGLOBAL) m_hDIB);
  115. }
  116. m_hDIB = hDIB;
  117. }
  118. /////////////////////////////////////////////////////////////////////////////
  119. // CDIBDoc serialization
  120. void CDIBDoc::Serialize(CArchive& ar)
  121. {
  122. if (ar.IsStoring())
  123. {
  124. // TODO: add storing code here
  125. }
  126. else
  127. {
  128. // TODO: add loading code here
  129. }
  130. }
  131. /////////////////////////////////////////////////////////////////////////////
  132. // CDIBDoc diagnostics
  133. #ifdef _DEBUG
  134. void CDIBDoc::AssertValid() const
  135. {
  136. CDocument::AssertValid();
  137. }
  138. void CDIBDoc::Dump(CDumpContext& dc) const
  139. {
  140. CDocument::Dump(dc);
  141. }
  142. #endif //_DEBUG
  143. /////////////////////////////////////////////////////////////////////////////
  144. // CDIBDoc commands
  145. BOOL CDIBDoc::OnOpenDocument(LPCTSTR lpszPathName) 
  146. {
  147. BeginWaitCursor();
  148. CMultiDocTemplate * pDocTemplate = ((CQuickImageApp*)AfxGetApp())->m_pImageTemplate;
  149. POSITION pos = pDocTemplate->GetFirstDocPosition();
  150. CDIBDoc* pDoc = (CDIBDoc*)pDocTemplate->GetNextDoc(pos);
  151. if(NULL != pDoc && pDoc != this)
  152. {
  153. if(pDoc->IsModified())
  154. {
  155. CString strMsg = _T("Save change to") + pDoc->GetTitle() + _T("?");
  156. if(AfxMessageBox(strMsg, MB_ICONWARNING | MB_YESNO) == IDYES)
  157. {
  158. pDoc->SaveModified();//>OnSaveDocument(pDoc->GetPathName());
  159. }
  160. }
  161. pDoc->OnCloseDocument();
  162. }
  163. char *pExt=strrchr(lpszPathName,'.');
  164. char cExt[4];
  165. strcpy(cExt,++pExt);
  166. _strlwr(cExt);
  167. DeleteContents();
  168. if (strcmp(cExt,"raw")==0)
  169. {
  170. CRaw raw;
  171. if(!raw.ReadFromFile(lpszPathName))
  172. {
  173. return FALSE;
  174. }
  175. m_hDIB = raw.Show();
  176. }
  177. else if(strcmp(cExt,"bmp")==0
  178. || strcmp(cExt,"dib")==0
  179. || strcmp(cExt,"ddb")==0)
  180. {
  181. CFile file;
  182. CFileException fe;
  183. if (!file.Open(lpszPathName, CFile::modeRead | CFile::shareDenyWrite, &fe))
  184. {
  185. fe.ReportError();
  186. return NULL;
  187. }
  188. // replace calls to Serialize with ReadDIBFile function
  189. TRY
  190. {
  191. m_hDIB = ::ReadDIBFile(file);
  192. }
  193. CATCH (CFileException, eLoad)
  194. {
  195. file.Abort(); // will not throw an exception
  196. eLoad->ReportError();
  197. m_hDIB = NULL;
  198. return NULL;
  199. }
  200. END_CATCH
  201. if (m_hDIB == NULL)
  202. {
  203. // may not be DIB format
  204. CString strMsg;
  205. strMsg.LoadString(IDS_CANNOT_LOAD_DIB);
  206. MessageBox(NULL, strMsg, NULL, MB_ICONINFORMATION | MB_OK);
  207. return NULL;
  208. }
  209. }
  210. else if(strcmp(cExt,"jpg")==0 || strcmp(cExt,"jpeg")==0)
  211. {
  212. UINT height,width;
  213. BYTE *pData = NULL;
  214. pData = JpegFile::JpegFileToRGB(lpszPathName, &width, &height);
  215. if(NULL == pData)return NULL;
  216. JpegFile::BGRFromRGB(pData, width, height);
  217. JpegFile::VertFlipBuf(pData, width * 3, height);
  218. UINT widthDW;
  219. BYTE *pDIB = JpegFile::MakeDwordAlignedBuf(pData, width, height, &widthDW);
  220. delete []pData;
  221. if(NULL == pDIB)
  222. {
  223. char strErr[100];
  224. sprintf(strErr, "Error: %d", GetLastError());
  225. MessageBox(AfxGetMainWnd()->GetSafeHwnd(), strErr, "Read File Error",
  226. MB_OK|MB_ICONERROR);
  227. }
  228. m_hDIB = ::ShowJPEG(width, height, pDIB);
  229. delete []pDIB;
  230. }
  231. else if(strcmp(cExt, "gif") == 0)
  232. {
  233. m_hDIB = ReadGIF(lpszPathName);
  234. }
  235. else if(strcmp(cExt,"pcx") == 0)
  236. {
  237. m_hDIB = ::ReadPCX256(lpszPathName);
  238. }
  239. else
  240. {
  241. // CString strMsg;
  242. // strMsg.Format("%sn不是图像文件!", lpszPathName);
  243. AfxMessageBox("不识别的文件格式!");
  244. return FALSE;
  245. }
  246. if(NULL != m_hDIB)
  247. {
  248. InitDIBData();
  249. }
  250. else
  251. {
  252. return FALSE;
  253. }
  254. SetPathName(lpszPathName);
  255. SetModifiedFlag(FALSE);
  256. EndWaitCursor();
  257. // if(g_strCurrentDir.IsEmpty())
  258. {
  259. CString strCurDir = GetPathName();
  260. char *pTitle = strrchr(strCurDir, '\');
  261. pTitle[1] = '';
  262. CGlobal::ChangeDirectory(strCurDir);
  263. }
  264. return TRUE;
  265. }
  266. BOOL CDIBDoc::OnSaveDocument(LPCTSTR lpszPathName) 
  267. {
  268. char *pExt=strrchr(lpszPathName,'.');
  269. char cExt[4];
  270. strcpy(cExt,++pExt);
  271. _strlwr(cExt);
  272. BeginWaitCursor();
  273. BOOL bSuccess = FALSE;
  274. // CTime t_Start = CTime::GetCurrentTime();
  275. if(strcmp(cExt,"bmp")==0
  276. || strcmp(cExt,"dib")==0
  277. || strcmp(cExt,"ddb")==0)
  278. {
  279. CFile file;
  280. CFileException fe;
  281. if (!file.Open(lpszPathName, CFile::modeCreate |
  282. CFile::modeReadWrite | CFile::shareExclusive, &fe))
  283. {
  284. ReportSaveLoadException(lpszPathName, &fe,
  285. TRUE, AFX_IDP_INVALID_FILENAME);
  286. return FALSE;
  287. }
  288. // replace calls to Serialize with SaveDIB function
  289. TRY
  290. {
  291. bSuccess = ::SaveDIB(m_hDIB, file);
  292. file.Close();
  293. }
  294. CATCH (CException, eSave)
  295. {
  296. file.Abort(); // will not throw an exception
  297. EndWaitCursor();
  298. ReportSaveLoadException(lpszPathName, eSave,
  299. TRUE, AFX_IDP_FAILED_TO_SAVE_DOC);
  300. }
  301. END_CATCH
  302. }
  303. else if (strcmp(cExt,"raw")==0)
  304. {
  305. bSuccess = CRaw::SaveRaw(lpszPathName, m_hDIB);
  306. }
  307. else if(strcmp(cExt,"pcx") == 0)
  308. {
  309. LPSTR lpDIB;
  310. LPSTR    lpDIBBits;
  311. lpDIB = (LPSTR) ::GlobalLock(m_hDIB);
  312. lpDIBBits = ::FindDIBBits(lpDIB);
  313. // 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的行程编码)
  314. if (::DIBNumColors(lpDIB) != 256)
  315. {
  316. // 提示用户
  317. AfxMessageBox("目前只支持256色位图的行程编码!", MB_ICONINFORMATION | MB_OK);
  318. ::GlobalUnlock(m_hDIB);
  319. return FALSE;
  320. }
  321. bSuccess = ::DIBToPCX256(lpDIB, lpszPathName);
  322. GlobalUnlock(m_hDIB);
  323. }
  324. else
  325. {
  326. // ASSERT(FALSE);
  327. }
  328. SetPathName(lpszPathName);
  329. SetModifiedFlag(FALSE);
  330. // CTimeSpan t_Span = CTime::GetCurrentTime() - t_Start;
  331. // ((CMainFrame*)AfxGetMainWnd())->SetStatusText(
  332. // t_Span.Format("Elapsed time- %H : %M : %S"));
  333. EndWaitCursor();
  334. return bSuccess;
  335. return CDocument::OnSaveDocument(lpszPathName);
  336. }
  337. void CDIBDoc::OnRealizePal(WPARAM wParam, LPARAM lParam)
  338. {
  339. // ASSERT(wParam != NULL);
  340. if (NULL == m_hDIB)
  341. return;  // must be a new document
  342. if (m_palDIB != NULL)
  343. {
  344. CWnd* pAppFrame = AfxGetApp()->m_pMainWnd;
  345. CClientDC appDC(pAppFrame);
  346. // All views but one should be a background palette.
  347. // wParam contains a handle to the active view, so the SelectPalette
  348. // bForceBackground flag is FALSE only if wParam == m_hWnd (this view)
  349. CPalette* oldPalette = appDC.SelectPalette(m_palDIB, FALSE);
  350. if (oldPalette != NULL)
  351. {
  352. UINT nColorsChanged = appDC.RealizePalette();
  353. if (nColorsChanged > 0)
  354. UpdateAllViews(NULL);
  355. appDC.SelectPalette(oldPalette, TRUE);
  356. }
  357. else
  358. {
  359. TRACE0("tSelectPalette failed!n");
  360. }
  361. }
  362. }
  363. void CDIBDoc::OnImageProcess(UINT uID)
  364. {
  365. CTime t_Start = CTime::GetCurrentTime();
  366. if(ID_IMAGE_HISTOGRAM == uID)
  367. {
  368. CDlgHistogram dlg(m_hDIB);
  369. dlg.DoModal();
  370. }
  371. else if(ID_IMAGE_HISTOGRAM_EQUAL == uID)
  372. {
  373. HDIB hDIB = CImage::HistoEqualize(m_hDIB);
  374. if(NULL != hDIB)
  375. {
  376. ReplaceHDIB(hDIB);
  377. InitDIBData();
  378. SetModifiedFlag();
  379. UpdateAllViews(NULL);
  380. }
  381. }
  382. else if(ID_IMAGE_MEDIANFILTER == uID)
  383. {
  384. if (CImgProcess::MedianFilterDIB(m_hDIB))
  385. {
  386. InitDIBData();
  387. SetModifiedFlag(TRUE);
  388. // OnRealizePal((WPARAM)0,0);  // realize the new palette
  389. UpdateAllViews(NULL);
  390. }
  391. }
  392. else if(ID_IMAGE_SMOTH_LF1 == uID)
  393. {
  394. CConvoluteDlg FD(1, 10, 3);
  395. if (FD.DoModal() == IDOK)
  396. {
  397. if(CImgProcess::LowPassDIB(m_hDIB, FD.m_nStreng, FILTER1))
  398. {
  399. InitDIBData();
  400. SetModifiedFlag(TRUE);
  401. // OnRealizePal((WPARAM)0, 0);  // realize the new palette
  402. UpdateAllViews(NULL);
  403. }
  404. }
  405. }
  406. else if(ID_IMAGE_SMOTH_LF2 == uID)
  407. {
  408. CConvoluteDlg FD(1, 10, 3);
  409. if (FD.DoModal() == IDOK)
  410. {
  411. if(CImgProcess::LowPassDIB(m_hDIB, FD.m_nStreng, FILTER2))
  412. {
  413. InitDIBData();
  414. SetModifiedFlag(TRUE);
  415. // OnRealizePal((WPARAM)0, 0);  // realize the new palette
  416. UpdateAllViews(NULL);
  417. }
  418. }
  419. }
  420. else if(ID_IMAGE_SMOTH_LF3 == uID)
  421. {
  422. CConvoluteDlg FD(1, 10, 3);
  423. if (FD.DoModal() == IDOK)
  424. {
  425. if(CImgProcess::LowPassDIB(m_hDIB, FD.m_nStreng, FILTER3))
  426. {
  427. InitDIBData();
  428. SetModifiedFlag(TRUE);
  429. // OnRealizePal((WPARAM)0, 0);  // realize the new palette
  430. UpdateAllViews(NULL);
  431. }
  432. }
  433. }
  434. else if(ID_IMAGE_SHARP_HF1 == uID)
  435. {
  436. CConvoluteDlg FD(1, 10, 3);
  437. if (FD.DoModal() == IDOK)
  438. {
  439. if(CImgProcess::HighPassDIB(m_hDIB, FD.m_nStreng, FILTER1))
  440. {
  441. InitDIBData();
  442. SetModifiedFlag(TRUE);
  443. // OnRealizePal((WPARAM)0,0);  // realize the new palette
  444. UpdateAllViews(NULL);
  445. }
  446. }
  447. }
  448. else if(ID_IMAGE_SHARP_HF2 == uID)
  449. {
  450. CConvoluteDlg FD(1, 10, 3);
  451. if (FD.DoModal() == IDOK)
  452. {
  453. if(CImgProcess::HighPassDIB(m_hDIB, FD.m_nStreng, FILTER2))
  454. {
  455. InitDIBData();
  456. SetModifiedFlag(TRUE);
  457. // OnRealizePal((WPARAM)0,0);  // realize the new palette
  458. UpdateAllViews(NULL);
  459. }
  460. }
  461. }
  462. else if(ID_IMAGE_SHARP_HF3 == uID)
  463. {
  464. CConvoluteDlg FD(1, 10, 3);
  465. if (FD.DoModal() == IDOK)
  466. {
  467. if(CImgProcess::HighPassDIB(m_hDIB, FD.m_nStreng, FILTER3))
  468. {
  469. InitDIBData();
  470. SetModifiedFlag(TRUE);
  471. // OnRealizePal((WPARAM)0,0);  // realize the new palette
  472. UpdateAllViews(NULL);
  473. }
  474. }
  475. }
  476. else if(ID_IMAGE_EDGE_H == uID)
  477. {
  478. EdgeEnhance(HORZ);
  479. }
  480. else if(ID_IMAGE_EDGE_V == uID)
  481. {
  482. EdgeEnhance(VERT);
  483. }
  484. else if(ID_IMAGE_EDGE_VH == uID)
  485. {
  486. EdgeEnhance(VERTHORZ);
  487. }
  488. else if(ID_IMAGE_EDGE_N == uID)
  489. {
  490. EdgeEnhance(NORTH);
  491. }
  492. else if(ID_IMAGE_EDGE_NE == uID)
  493. {
  494. EdgeEnhance(NORTHEAST);
  495. }
  496. else if(ID_IMAGE_EDGE_E == uID)
  497. {
  498. EdgeEnhance(EAST);
  499. }
  500. else if(ID_IMAGE_EDGE_SE == uID)
  501. {
  502. EdgeEnhance(SOUTHEAST);
  503. }
  504. else if(ID_IMAGE_EDGE_S == uID)
  505. {
  506. EdgeEnhance(SOUTH);
  507. }
  508. else if(ID_IMAGE_EDGE_SW == uID)
  509. {
  510. EdgeEnhance(SOUTHWEST);
  511. }
  512. else if(ID_IMAGE_EDGE_W == uID)
  513. {
  514. EdgeEnhance(WEST);
  515. }
  516. else if(ID_IMAGE_EDGE_NW == uID)
  517. {
  518. EdgeEnhance(NORTHWEST);
  519. }
  520. else if(ID_IMAGE_EDGE_LP1 == uID)
  521. {
  522. EdgeEnhance(LAP1);
  523. }
  524. else if(ID_IMAGE_EDGE_LP2 == uID)
  525. {
  526. EdgeEnhance(LAP2);
  527. }
  528. else if(ID_IMAGE_EDGE_LP3 == uID)
  529. {
  530. EdgeEnhance(LAP3);
  531. }
  532. else if(ID_IMAGE_EDGE_LP4 == uID)
  533. {
  534. EdgeEnhance(LAP4);
  535. }
  536. else if(ID_IMAGE_CONTOUR_H == uID)
  537. {
  538. if(CImgProcess::ContourDIB(m_hDIB, TRUE))
  539. {
  540. InitDIBData();
  541. SetModifiedFlag(TRUE);
  542. // OnRealizePal((WPARAM)0, 0);  // realize the new palette
  543. UpdateAllViews(NULL);
  544. }
  545. }
  546. else if(ID_IMAGE_CONTOUR_V == uID)
  547. {
  548. if(CImgProcess::ContourDIB(m_hDIB, FALSE))
  549. {
  550. InitDIBData();
  551. SetModifiedFlag(TRUE);
  552. // OnRealizePal((WPARAM)0, 0);  // realize the new palette
  553. UpdateAllViews(NULL);
  554. }
  555. }
  556. else if(ID_IMAGE_CONTOUR_SOBER == uID)
  557. {
  558. EdgeEnhance(SOBEL);
  559. }
  560. else if(ID_IMAGE_CONTOUR_HOUGH == uID)
  561. {
  562. EdgeEnhance(HOUGH);
  563. }
  564. else if(ID_IMAGE_REVERSE == uID)
  565. {
  566. if(CImgProcess::ReverseDIB(m_hDIB))
  567. {
  568. InitDIBData();
  569. SetModifiedFlag(TRUE);
  570. // OnRealizePal((WPARAM)0, 0);  // realize the new palette
  571. UpdateAllViews(NULL);
  572. }
  573. }
  574. else if(ID_IMAGE_FFT == uID)
  575. {
  576. if(CImgProcess::FFTDIB(m_hDIB))
  577. {
  578. InitDIBData();
  579. SetModifiedFlag(TRUE);
  580. // OnRealizePal((WPARAM)0, 0);  // realize the new palette
  581. UpdateAllViews(NULL);
  582. }
  583. }
  584. else if(ID_IMAGE_DCT == uID)
  585. {
  586. if(CImgProcess::DCTDIB(m_hDIB))
  587. {
  588. InitDIBData();
  589. SetModifiedFlag(TRUE);
  590. // OnRealizePal((WPARAM)0, 0);  // realize the new palette
  591. UpdateAllViews(NULL);
  592. }
  593. }
  594. else if(ID_IMAGE_WALH == uID)
  595. {
  596. if(CImgProcess::WALhDIB(m_hDIB))
  597. {
  598. InitDIBData();
  599. SetModifiedFlag(TRUE);
  600. // OnRealizePal((WPARAM)0, 0);  // realize the new palette
  601. UpdateAllViews(NULL);
  602. }
  603. }
  604. else if(ID_IMAGE_EROSION_H == uID)
  605. {
  606. if(CImgProcess::ErosionDIB(m_hDIB, TRUE))
  607. {
  608. InitDIBData();
  609. SetModifiedFlag(TRUE);
  610. // OnRealizePal((WPARAM)0, 0);  // realize the new palette
  611. UpdateAllViews(NULL);
  612. }
  613. }
  614. else if(ID_IMAGE_EROSION_V == uID)
  615. {
  616. if(CImgProcess::ErosionDIB(m_hDIB, FALSE))
  617. {
  618. InitDIBData();
  619. SetModifiedFlag(TRUE);
  620. // OnRealizePal((WPARAM)0, 0);  // realize the new palette
  621. UpdateAllViews(NULL);
  622. }
  623. }
  624. else if(ID_IMAGE_DILATION_H == uID)
  625. {
  626. if(CImgProcess::DilationDIB(m_hDIB, TRUE))
  627. {
  628. InitDIBData();
  629. SetModifiedFlag(TRUE);
  630. // OnRealizePal((WPARAM)0, 0);  // realize the new palette
  631. UpdateAllViews(NULL);
  632. }
  633. }
  634. else if(ID_IMAGE_DILATION_V == uID)
  635. {
  636. if(CImgProcess::DilationDIB(m_hDIB, FALSE))
  637. {
  638. InitDIBData();
  639. SetModifiedFlag(TRUE);
  640. // OnRealizePal((WPARAM)0, 0);  // realize the new palette
  641. UpdateAllViews(NULL);
  642. }
  643. }
  644. else if(ID_IMAGE_CLOSE_H == uID)
  645. {
  646. if(CImgProcess::MorphCloseDIB(m_hDIB, TRUE))
  647. {
  648. InitDIBData();
  649. SetModifiedFlag(TRUE);
  650. // OnRealizePal((WPARAM)0, 0);  // realize the new palette
  651. UpdateAllViews(NULL);
  652. }
  653. }
  654. else if(ID_IMAGE_CLOSE_V == uID)
  655. {
  656. if(CImgProcess::MorphCloseDIB(m_hDIB, FALSE))
  657. {
  658. InitDIBData();
  659. SetModifiedFlag(TRUE);
  660. // OnRealizePal((WPARAM)0, 0);  // realize the new palette
  661. UpdateAllViews(NULL);
  662. }
  663. }
  664. else if(ID_IMAGE_OPEN_H == uID)
  665. {
  666. if(CImgProcess::MorphOpenDIB(m_hDIB, TRUE))
  667. {
  668. InitDIBData();
  669. SetModifiedFlag(TRUE);
  670. // OnRealizePal((WPARAM)0, 0);  // realize the new palette
  671. UpdateAllViews(NULL);
  672. }
  673. }
  674. else if(ID_IMAGE_OPEN_V == uID)
  675. {
  676. if(CImgProcess::MorphOpenDIB(m_hDIB, FALSE))
  677. {
  678. InitDIBData();
  679. SetModifiedFlag(TRUE);
  680. // OnRealizePal((WPARAM)0, 0);  // realize the new palette
  681. UpdateAllViews(NULL);
  682. }
  683. }
  684. else if(ID_IMAGE_THIN == uID)
  685. {
  686. if(CImgProcess::ThinningDIB(m_hDIB))
  687. {
  688. InitDIBData();
  689. SetModifiedFlag(TRUE);
  690. // OnRealizePal((WPARAM)0, 0);  // realize the new palette
  691. UpdateAllViews(NULL);
  692. }
  693. }
  694. else
  695. {
  696. AfxMessageBox("Hi, what are you doing?");
  697. }
  698. CTimeSpan t_Span = CTime::GetCurrentTime() - t_Start;
  699. CString strStatus = t_Span.Format("Elapsed time- %H : %M : %S");
  700. ((CMainFrame*)AfxGetMainWnd())->SetStatusText(0, strStatus);
  701. }
  702. void CDIBDoc::OnUpdateImageProcess(CCmdUI *pCmdUI)
  703. {
  704. pCmdUI->Enable(NULL != m_hDIB);
  705. }
  706. void CDIBDoc::EdgeEnhance(int nAlgorithm)
  707. {
  708. CConvoluteDlg FD(1, 10, 3);
  709. if (FD.DoModal() == IDOK)
  710. {
  711. if(CImgProcess::EdgeEnhanceDIB(m_hDIB, FD.m_nStreng, nAlgorithm))
  712. {
  713. InitDIBData();
  714. SetModifiedFlag(TRUE);
  715. // OnRealizePal((WPARAM)0, 0);  // realize the new palette
  716. UpdateAllViews(NULL);
  717. }
  718. }
  719. }
  720. BOOL CDIBDoc::EnumFile(LPCTSTR lpszPathName)
  721. {
  722. ASSERT(strlen(lpszPathName) > 0);
  723. BeginWaitCursor();
  724. char *pExt=strrchr(lpszPathName,'.');
  725. char cExt[4];
  726. strcpy(cExt,++pExt);
  727. _strlwr(cExt);
  728. DeleteContents();
  729. HDIB hDIB = NULL;
  730. if (strcmp(cExt,"raw")==0)
  731. {
  732. CRaw raw;
  733. if(!raw.ReadFromFile(lpszPathName))
  734. {
  735. return FALSE;
  736. }
  737. hDIB = raw.Show();
  738. }
  739. else if(strcmp(cExt,"bmp")==0
  740. || strcmp(cExt,"dib")==0
  741. || strcmp(cExt,"ddb")==0)
  742. {
  743. CFile file;
  744. CFileException fe;
  745. if (!file.Open(lpszPathName, CFile::modeRead | CFile::shareDenyWrite, &fe))
  746. {
  747. fe.ReportError();
  748. return NULL;
  749. }
  750. // replace calls to Serialize with ReadDIBFile function
  751. TRY
  752. {
  753. hDIB = ::ReadDIBFile(file);
  754. }
  755. CATCH (CFileException, eLoad)
  756. {
  757. file.Abort(); // will not throw an exception
  758. eLoad->ReportError();
  759. hDIB = NULL;
  760. return NULL;
  761. }
  762. END_CATCH
  763. if (hDIB == NULL)
  764. {
  765. // may not be DIB format
  766. CString strMsg;
  767. strMsg.LoadString(IDS_CANNOT_LOAD_DIB);
  768. MessageBox(NULL, strMsg, NULL, MB_ICONINFORMATION | MB_OK);
  769. return NULL;
  770. }
  771. }
  772. else if(strcmp(cExt,"jpg")==0 || strcmp(cExt,"jpeg")==0)
  773. {
  774. UINT height,width;
  775. BYTE *pData = NULL;
  776. pData = JpegFile::JpegFileToRGB(lpszPathName, &width, &height);
  777. if(NULL == pData)return NULL;
  778. JpegFile::BGRFromRGB(pData, width, height);
  779. JpegFile::VertFlipBuf(pData, width * 3, height);
  780. UINT widthDW;
  781. BYTE *pDIB = JpegFile::MakeDwordAlignedBuf(pData, width, height, &widthDW);
  782. delete []pData;
  783. if(NULL == pDIB)
  784. {
  785. char strErr[100];
  786. sprintf(strErr, "Error: %d", GetLastError());
  787. MessageBox(AfxGetMainWnd()->GetSafeHwnd(), strErr, "Read File Error",
  788. MB_OK|MB_ICONERROR);
  789. }
  790. hDIB = ::ShowJPEG(width, height, pDIB);
  791. delete []pDIB;
  792. }
  793. else if(strcmp(cExt, "gif") == 0)
  794. {
  795. hDIB = ReadGIF(lpszPathName);
  796. }
  797. else if(strcmp(cExt,"pcx") == 0)
  798. {
  799. hDIB = ::ReadPCX256(lpszPathName);
  800. }
  801. else
  802. {
  803. // CString strMsg;
  804. // strMsg.Format("%sn不是图像文件!", lpszPathName);
  805. AfxMessageBox("不识别的文件格式!");
  806. return FALSE;
  807. }
  808. if(NULL != hDIB)
  809. {
  810. ReplaceHDIB(hDIB);
  811. InitDIBData();
  812. }
  813. else
  814. {
  815. return FALSE;
  816. }
  817. SetPathName(lpszPathName);
  818. char *pTitle = strrchr(lpszPathName, '\');
  819. SetTitle(++pTitle);
  820. SetModifiedFlag(FALSE);
  821. EndWaitCursor();
  822. return TRUE;
  823. }