ImageProcessingView.cpp
上传用户:wzyhdz
上传日期:2010-04-06
资源大小:164k
文件大小:86k
源码类别:

2D图形编程

开发平台:

Visual C++

  1. // ImageProcessingView.cpp : implementation of the CImageProcessingView class
  2. //
  3. #include "stdafx.h"
  4. #include "ImageProcessing.h"
  5. #include "ImageProcessingDoc.h"
  6. #include "ImageProcessingView.h"
  7. #include  "GlobalApi.h"
  8. #include <complex>
  9. using namespace std;
  10. #ifdef _DEBUG
  11. #define new DEBUG_NEW
  12. #undef THIS_FILE
  13. static char THIS_FILE[] = __FILE__;
  14. #endif
  15. /////////////////////////////////////////////////////////////////////////////
  16. // CImageProcessingView
  17. IMPLEMENT_DYNCREATE(CImageProcessingView, CScrollView)
  18. BEGIN_MESSAGE_MAP(CImageProcessingView, CScrollView)
  19. //{{AFX_MSG_MAP(CImageProcessingView)
  20. ON_COMMAND(ID_EDGE_CANNY, OnEdgeCanny)
  21. //}}AFX_MSG_MAP
  22. // Standard printing commands
  23. ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint)
  24. ON_COMMAND(ID_FILE_PRINT_DIRECT, CScrollView::OnFilePrint)
  25. ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview)
  26. END_MESSAGE_MAP()
  27. /////////////////////////////////////////////////////////////////////////////
  28. // CImageProcessingView construction/destruction
  29. CImageProcessingView::CImageProcessingView()
  30. {
  31. // 为小波变换设置的参数
  32. // 临时存放小波变换系数内存
  33. m_pDbImage = NULL;
  34. // 设置当前层数
  35. m_nDWTCurDepth = 0;
  36. // 设置小波基紧支集长度
  37. m_nSupp = 1;
  38. }
  39. CImageProcessingView::~CImageProcessingView()
  40. {
  41. // 释放已分配内存
  42. if(m_pDbImage){
  43. delete[]m_pDbImage;
  44. m_pDbImage = NULL;
  45. }
  46. }
  47. BOOL CImageProcessingView::PreCreateWindow(CREATESTRUCT& cs)
  48. {
  49. // TODO: Modify the Window class or styles here by modifying
  50. //  the CREATESTRUCT cs
  51. return CScrollView::PreCreateWindow(cs);
  52. }
  53. /////////////////////////////////////////////////////////////////////////////
  54. // CImageProcessingView drawing
  55. void CImageProcessingView::OnDraw(CDC* pDC)
  56. {
  57. CImageProcessingDoc* pDoc = GetDocument();
  58. ASSERT_VALID(pDoc);
  59. CSize sizeDibDisplay;
  60. if(!pDoc->m_pDibInit->IsEmpty()){
  61. sizeDibDisplay = pDoc->m_pDibInit->GetDimensions();
  62. pDoc->m_pDibInit->Draw(pDC,CPoint(0,0),sizeDibDisplay);
  63. }
  64. }
  65. void CImageProcessingView::OnInitialUpdate()
  66. {
  67. CScrollView::OnInitialUpdate();
  68. CImageProcessingDoc* pDoc = GetDocument();
  69. ASSERT_VALID(pDoc);
  70. CSize sizeTotal = pDoc->m_pDibInit->GetDimensions();
  71. SetScrollSizes(MM_TEXT, sizeTotal);
  72. GetParentFrame()->RecalcLayout();
  73. ResizeParentToFit();
  74. }
  75. /////////////////////////////////////////////////////////////////////////////
  76. // CImageProcessingView printing
  77. BOOL CImageProcessingView::OnPreparePrinting(CPrintInfo* pInfo)
  78. {
  79. // default preparation
  80. return DoPreparePrinting(pInfo);
  81. }
  82. void CImageProcessingView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  83. {
  84. // TODO: add extra initialization before printing
  85. }
  86. void CImageProcessingView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  87. {
  88. // TODO: add cleanup after printing
  89. }
  90. /////////////////////////////////////////////////////////////////////////////
  91. // CImageProcessingView diagnostics
  92. #ifdef _DEBUG
  93. void CImageProcessingView::AssertValid() const
  94. {
  95. CScrollView::AssertValid();
  96. }
  97. void CImageProcessingView::Dump(CDumpContext& dc) const
  98. {
  99. CScrollView::Dump(dc);
  100. }
  101. CImageProcessingDoc* CImageProcessingView::GetDocument() // non-debug version is inline
  102. {
  103. ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CImageProcessingDoc)));
  104. return (CImageProcessingDoc*)m_pDocument;
  105. }
  106. #endif //_DEBUG
  107. /////////////////////////////////////////////////////////////////////////////
  108. // CImageProcessingView message handlers
  109. /*************************************************************************
  110.  *
  111.  * 函数名称:
  112.  *   OnFft2d()
  113.  *
  114.  * 输入参数:
  115.  *   无
  116.  * 
  117.  * 返回值:
  118.  *   无
  119.  *
  120.  * 说明:
  121.  *   运行二维快速傅立叶变换
  122.  *
  123.  *************************************************************************
  124.  */
  125. //DEL void CImageProcessingView::OnFft2d() 
  126. //DEL {
  127. //DEL  //图象FFT变换
  128. //DEL 
  129. //DEL  // 更改光标形状
  130. //DEL  BeginWaitCursor();
  131. //DEL 
  132. //DEL  // 循环控制变量
  133. //DEL  int y;
  134. //DEL  int x;
  135. //DEL 
  136. //DEL  // 获得Doc类的指针
  137. //DEL  CImageProcessingDoc * pDoc = (CImageProcessingDoc *)this->GetDocument();
  138. //DEL 
  139. //DEL  CDib * pDib = pDoc->m_pDibInit;
  140. //DEL 
  141. //DEL  // 获得图象的头文件信息
  142. //DEL  LPBITMAPINFOHEADER lpBMIH=pDib->m_lpBMIH;
  143. //DEL 
  144. //DEL  // 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的离散傅立叶变换)
  145. //DEL  if (lpBMIH->biBitCount != 8)
  146. //DEL  {
  147. //DEL  // 提示用户
  148. //DEL  MessageBox("目前只支持256色位图的离散傅立叶变换!", "系统提示" ,
  149. //DEL  MB_ICONINFORMATION | MB_OK);
  150. //DEL 
  151. //DEL  // 返回
  152. //DEL  return;
  153. //DEL  }
  154. //DEL 
  155. //DEL  // 图象的宽长
  156. //DEL  CSize sizeImage ;
  157. //DEL  int nWidth ;
  158. //DEL  int nHeight;
  159. //DEL 
  160. //DEL  // 获得图象的宽长
  161. //DEL  sizeImage = pDib->GetDimensions() ;
  162. //DEL 
  163. //DEL  nWidth = sizeImage.cx;
  164. //DEL  nHeight= sizeImage.cy;
  165. //DEL 
  166. //DEL  // 临时变量
  167. //DEL  double dTmpOne;
  168. //DEL  double  dTmpTwo;
  169. //DEL 
  170. //DEL  // 傅立叶变换竖直方向点数
  171. //DEL  int nTransHeight ;
  172. //DEL 
  173. //DEL  // 傅立叶变换水平方向点数
  174. //DEL  int nTransWidth  ;
  175. //DEL 
  176. //DEL  // 计算进行傅立叶变换的点数 (2的整数次幂)
  177. //DEL  dTmpOne = log(nWidth)/log(2);
  178. //DEL  dTmpTwo = ceil(dTmpOne)    ;
  179. //DEL  dTmpTwo = pow(2,dTmpTwo)    ;
  180. //DEL  nTransWidth = (int) dTmpTwo    ;
  181. //DEL 
  182. //DEL  // 计算进行傅立叶变换的点数 (2的整数次幂)
  183. //DEL  dTmpOne = log(nHeight)/log(2);
  184. //DEL  dTmpTwo = ceil(dTmpOne)    ;
  185. //DEL  dTmpTwo = pow(2,dTmpTwo)    ;
  186. //DEL  nTransHeight = (int) dTmpTwo   ;
  187. //DEL 
  188. //DEL  // 计算图象数据存储每行需要的字节数
  189. //DEL  // BMP文件的每行数据存储是DWORD对齐的
  190. //DEL  int nSaveWidth;
  191. //DEL  nSaveWidth = ( (nWidth << 3) + 31)/32 * 4 ;
  192. //DEL 
  193. //DEL  // 指向图象数据的指针
  194. //DEL  LPBYTE lpImage ;
  195. //DEL  lpImage = pDib->m_lpImage ;
  196. //DEL 
  197. //DEL  // 图象象素值
  198. //DEL  unsigned char unchValue;
  199. //DEL 
  200. //DEL 
  201. //DEL  // 指向时域数据的指针
  202. //DEL  complex<double> * pCTData ;
  203. //DEL 
  204. //DEL  // 指向频域数据的指针
  205. //DEL  complex<double> * pCFData ;
  206. //DEL 
  207. //DEL  // 分配内存
  208. //DEL  pCTData=new complex<double>[nTransWidth * nTransHeight];
  209. //DEL  pCFData=new complex<double>[nTransWidth * nTransHeight];
  210. //DEL 
  211. //DEL  // 初始化
  212. //DEL  // 图象数据的宽和高不一定是2的整数次幂,所以pCTData
  213. //DEL  // 有一部分数据需要补0
  214. //DEL  for(y=0; y<nTransHeight; y++)
  215. //DEL  {
  216. //DEL  for(x=0; x<nTransWidth; x++)
  217. //DEL  {
  218. //DEL  pCTData[y*nTransWidth + x]=complex<double>(0,0);
  219. //DEL  }
  220. //DEL  }
  221. //DEL 
  222. //DEL  // 把图象数据传给pCTData
  223. //DEL  for(y=0; y<nHeight; y++)
  224. //DEL  {
  225. //DEL  for(x=0; x<nWidth; x++)
  226. //DEL  {
  227. //DEL  unchValue = lpImage[y*nSaveWidth +x];
  228. //DEL  pCTData[y*nTransWidth + x]=complex<double>(unchValue,0);
  229. //DEL  }
  230. //DEL  }
  231. //DEL 
  232. //DEL  // 傅立叶正变换
  233. //DEL  DIBFFT_2D(pCTData, nWidth, nHeight, pCFData) ;
  234. //DEL 
  235. //DEL  // 临时变量
  236. //DEL  double dTmp;
  237. //DEL 
  238. //DEL  for(y=0; y<nHeight; y++)
  239. //DEL  {
  240. //DEL  for(x=0; x<nWidth; x++)
  241. //DEL  {
  242. //DEL  dTmp = pCFData[y * nTransWidth + x].real() 
  243. //DEL     * pCFData[y * nTransWidth + x].real()
  244. //DEL   + pCFData[y * nTransWidth + x].imag() 
  245. //DEL     * pCFData[y * nTransWidth + x].imag();
  246. //DEL 
  247. //DEL  dTmp = sqrt(dTmp) ;
  248. //DEL 
  249. //DEL  // 为了显示,需要对幅度的大小进行伸缩
  250. //DEL  dTmp /= 100        ;
  251. //DEL 
  252. //DEL  // 限制图象数据的大小
  253. //DEL  dTmp = min(dTmp, 255) ;
  254. //DEL 
  255. //DEL  lpImage[y*nSaveWidth +x] = (unsigned char)(int)dTmp;
  256. //DEL  }
  257. //DEL  }
  258. //DEL 
  259. //DEL  // 为了在屏幕上显示,我们把幅度值大的部分用黑色显示
  260. //DEL  for(y=0; y<nHeight; y++)
  261. //DEL  {
  262. //DEL  for(x=0; x<nWidth; x++)
  263. //DEL  {
  264. //DEL  lpImage[y*nSaveWidth +x] = 255 - lpImage[y*nSaveWidth +x];
  265. //DEL  }
  266. //DEL  }
  267. //DEL 
  268. //DEL  // 刷新屏幕
  269. //DEL  Invalidate();
  270. //DEL 
  271. //DEL  // 释放内存
  272. //DEL  delete pCTData;
  273. //DEL  delete pCFData;
  274. //DEL  pCTData = NULL;
  275. //DEL  pCFData = NULL;
  276. //DEL 
  277. //DEL  // 设置脏标记
  278. //DEL  pDoc->SetModifiedFlag(TRUE);
  279. //DEL 
  280. //DEL  // 更新视图
  281. //DEL  pDoc->UpdateAllViews(NULL);
  282. //DEL 
  283. //DEL  //  恢复光标形状
  284. //DEL  EndWaitCursor();
  285. //DEL }
  286. /*************************************************************************
  287.  *
  288.  * 函数名称:
  289.  *   OnDft2d()
  290.  *
  291.  * 输入参数:
  292.  *   无
  293.  * 
  294.  * 返回值:
  295.  *   无
  296.  *
  297.  * 说明:
  298.  *   运行二维傅立叶变换
  299.  *
  300.  *************************************************************************
  301.  */
  302. //DEL void CImageProcessingView::OnDft2d() 
  303. //DEL {
  304. //DEL  //图象离散傅立叶变换
  305. //DEL 
  306. //DEL  //提示用户,直接进行离散傅立叶变换的时间很长
  307. //DEL  MessageBox("没有使用FFT,时间可能很长!", "作者提示" ,
  308. //DEL  MB_ICONINFORMATION | MB_OK);
  309. //DEL 
  310. //DEL  //更改光标形状
  311. //DEL  BeginWaitCursor(); 
  312. //DEL 
  313. //DEL  // 循环控制变量
  314. //DEL  int y;
  315. //DEL  int x;
  316. //DEL 
  317. //DEL  CImageProcessingDoc * pDoc = (CImageProcessingDoc *)this->GetDocument();
  318. //DEL  CDib * pDib = pDoc->m_pDibInit;
  319. //DEL 
  320. //DEL  // 获得图象的头文件信息
  321. //DEL  LPBITMAPINFOHEADER lpBMIH=pDib->m_lpBMIH;
  322. //DEL 
  323. //DEL  // 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的离散傅立叶变换)
  324. //DEL  if (lpBMIH->biBitCount != 8)
  325. //DEL  {
  326. //DEL  // 提示用户
  327. //DEL  MessageBox("目前只支持256色位图的离散傅立叶变换!", "系统提示" ,
  328. //DEL  MB_ICONINFORMATION | MB_OK);
  329. //DEL 
  330. //DEL  // 返回
  331. //DEL  return;
  332. //DEL  }
  333. //DEL 
  334. //DEL  //图象的长宽大小
  335. //DEL  CSize sizeImage = pDib->GetDimensions();
  336. //DEL  int nWidth = sizeImage.cx ;
  337. //DEL  int nHeight = sizeImage.cy ;
  338. //DEL 
  339. //DEL  // 计算图象数据存储每行需要的字节数
  340. //DEL  // BMP文件的每行数据存储是DWORD对齐的
  341. //DEL  int nSaveWidth;
  342. //DEL  nSaveWidth = ( (nWidth << 3) + 31)/32 * 4 ;
  343. //DEL 
  344. //DEL  // 指向图象数据的指针
  345. //DEL  LPBYTE lpImage ;
  346. //DEL  lpImage = pDib->m_lpImage ;
  347. //DEL 
  348. //DEL  double * pTrRstRpart  = new double [nWidth*nHeight];
  349. //DEL  double * pTrRstIpart  = new double [nWidth*nHeight];
  350. //DEL 
  351. //DEL  ::DIBDFT_2D(pDib, pTrRstRpart,pTrRstIpart);
  352. //DEL 
  353. //DEL  // 临时变量
  354. //DEL  double dTmp;
  355. //DEL 
  356. //DEL  for(y=0; y<nHeight; y++)
  357. //DEL  {
  358. //DEL  for(x=0; x<nWidth; x++)
  359. //DEL  {
  360. //DEL  dTmp = pTrRstRpart[y*nWidth + x] * pTrRstRpart[y*nWidth + x]
  361. //DEL   + pTrRstIpart[y*nWidth + x] * pTrRstIpart[y*nWidth + x];
  362. //DEL 
  363. //DEL  dTmp = sqrt(dTmp) ;
  364. //DEL 
  365. //DEL  // 为了显示,需要对幅度的大小进行伸缩
  366. //DEL  dTmp /= 100        ;
  367. //DEL 
  368. //DEL  // 限制图象数据的大小
  369. //DEL  dTmp = min(dTmp, 255) ;
  370. //DEL 
  371. //DEL  lpImage[y*nSaveWidth +x] = (unsigned char)(int)dTmp;
  372. //DEL  }
  373. //DEL  }
  374. //DEL 
  375. //DEL  // 为了在屏幕上显示,我们把幅度值大的部分用黑色显示
  376. //DEL  for(y=0; y<nHeight; y++)
  377. //DEL  {
  378. //DEL  for(x=0; x<nWidth; x++)
  379. //DEL  {
  380. //DEL  lpImage[y*nSaveWidth +x] = 255 - lpImage[y*nSaveWidth +x];
  381. //DEL  }
  382. //DEL  }
  383. //DEL 
  384. //DEL  // 释放内存
  385. //DEL  delete pTrRstRpart;
  386. //DEL  pTrRstRpart=NULL  ;
  387. //DEL 
  388. //DEL  delete pTrRstIpart;
  389. //DEL  pTrRstIpart=NULL  ;
  390. //DEL 
  391. //DEL  // 设置脏标记
  392. //DEL  pDoc->SetModifiedFlag(TRUE);
  393. //DEL 
  394. //DEL  // 更新视图
  395. //DEL  pDoc->UpdateAllViews(NULL);
  396. //DEL 
  397. //DEL  // 恢复光标形状
  398. //DEL  EndWaitCursor(); 
  399. //DEL 
  400. //DEL  // 刷新屏幕
  401. //DEL  Invalidate();
  402. //DEL }
  403. //DEL void CImageProcessingView::OnFreqDct() 
  404. //DEL {
  405. //DEL  // 图象的离散余弦变换
  406. //DEL 
  407. //DEL  // 更改光标形状
  408. //DEL  BeginWaitCursor();
  409. //DEL 
  410. //DEL  // 获取文档
  411. //DEL  CImageProcessingDoc* pDoc = GetDocument();
  412. //DEL 
  413. //DEL  //  获得图象CDib类的指针
  414. //DEL  CDib * pDib = pDoc->m_pDibInit;
  415. //DEL 
  416. //DEL  // 获得图象的头文件信息
  417. //DEL  LPBITMAPINFOHEADER lpBMIH=pDib->m_lpBMIH;
  418. //DEL 
  419. //DEL  // 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的离散余弦变换)
  420. //DEL  if (lpBMIH->biBitCount != 8)
  421. //DEL  {
  422. //DEL  // 提示用户
  423. //DEL  MessageBox("目前只支持256色位图的离散余弦变换!", "系统提示" ,
  424. //DEL  MB_ICONINFORMATION | MB_OK);
  425. //DEL 
  426. //DEL  // 返回
  427. //DEL  return;
  428. //DEL  }
  429. //DEL 
  430. //DEL  ::DIBDct(pDib);
  431. //DEL 
  432. //DEL  // 设置脏标记
  433. //DEL  pDoc->SetModifiedFlag(TRUE);
  434. //DEL 
  435. //DEL  // 更新视图
  436. //DEL  pDoc->UpdateAllViews(NULL);
  437. //DEL 
  438. //DEL     // 恢复光标
  439. //DEL  EndWaitCursor();
  440. //DEL 
  441. //DEL }
  442. //DEL void CImageProcessingView::OnFreqHotelling() 
  443. //DEL {
  444. //DEL  // 图象霍特林变换
  445. //DEL 
  446. //DEL  // 更改光标形状
  447. //DEL  BeginWaitCursor();
  448. //DEL 
  449. //DEL  // 获取文档
  450. //DEL  CImageProcessingDoc* pDoc = GetDocument();
  451. //DEL 
  452. //DEL  //  获得图象CDib类的指针
  453. //DEL  CDib * pDib = pDoc->m_pDibInit;
  454. //DEL 
  455. //DEL  // 获得图象的头文件信息
  456. //DEL  LPBITMAPINFOHEADER lpBMIH=pDib->m_lpBMIH;
  457. //DEL 
  458. //DEL  // 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的离散霍特林变换)
  459. //DEL  if (lpBMIH->biBitCount != 8)
  460. //DEL  {
  461. //DEL  // 提示用户
  462. //DEL  MessageBox("目前只支持256色位图的离散霍特林变换!", "系统提示" ,
  463. //DEL  MB_ICONINFORMATION | MB_OK);
  464. //DEL 
  465. //DEL  // 返回
  466. //DEL  return;
  467. //DEL  }
  468. //DEL 
  469. //DEL  //  图象的霍特林变换
  470. //DEL  DIBHOTELLING(pDib);
  471. //DEL 
  472. //DEL  // 设置脏标记
  473. //DEL  pDoc->SetModifiedFlag(TRUE);
  474. //DEL 
  475. //DEL  // 更新视图
  476. //DEL  pDoc->UpdateAllViews(NULL);
  477. //DEL 
  478. //DEL     // 恢复光标
  479. //DEL  EndWaitCursor();
  480. //DEL 
  481. //DEL }
  482. //DEL void CImageProcessingView::OnFreqWalsh() 
  483. //DEL {
  484. //DEL  // 图象的沃尔什-哈达玛变换
  485. //DEL 
  486. //DEL  // 更改光标形状
  487. //DEL  BeginWaitCursor();
  488. //DEL 
  489. //DEL  // 获取文档
  490. //DEL  CImageProcessingDoc* pDoc = GetDocument();
  491. //DEL 
  492. //DEL  //  获得图象CDib类的指针
  493. //DEL  CDib * pDib = pDoc->m_pDibInit;
  494. //DEL 
  495. //DEL  // 获得图象的头文件信息
  496. //DEL  LPBITMAPINFOHEADER lpBMIH=pDib->m_lpBMIH;
  497. //DEL 
  498. //DEL  // 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的沃尔什-哈达玛变换)
  499. //DEL  if (lpBMIH->biBitCount != 8)
  500. //DEL  {
  501. //DEL  // 提示用户
  502. //DEL  MessageBox("目前只支持256色位图的离散沃尔什变换!", "系统提示" ,
  503. //DEL  MB_ICONINFORMATION | MB_OK);
  504. //DEL 
  505. //DEL  // 返回
  506. //DEL  return;
  507. //DEL  }
  508. //DEL 
  509. //DEL  //  进行沃尔什-哈达玛变换
  510. //DEL  DIBWalsh(pDib);
  511. //DEL 
  512. //DEL  // 设置脏标记
  513. //DEL  pDoc->SetModifiedFlag(TRUE);
  514. //DEL 
  515. //DEL  // 更新视图
  516. //DEL  pDoc->UpdateAllViews(NULL);
  517. //DEL 
  518. //DEL     // 恢复光标
  519. //DEL  EndWaitCursor();
  520. //DEL 
  521. //DEL }
  522. /*************************************************************************
  523.  *
  524.  * 函数名称:
  525.  *   OnViewHistogram()
  526.  *
  527.  * 输入参数:
  528.  *   无
  529.  * 
  530.  * 返回值:
  531.  *   无
  532.  *
  533.  * 说明:
  534.  *   查看直方图,弹出直方图显示界面
  535.  *
  536.  *************************************************************************
  537.  */
  538. //DEL void CImageProcessingView::OnViewHistogram() 
  539. //DEL {
  540. //DEL  // 获取文档
  541. //DEL  CImageProcessingDoc* pDoc = GetDocument();
  542. //DEL 
  543. //DEL  // DIB的颜色数目
  544. //DEL  int nColorTableEntries;
  545. //DEL  nColorTableEntries = pDoc->m_pDibInit->m_nColorTableEntries;
  546. //DEL 
  547. //DEL  // 判断是否是8bpp位图(这里只处理8bpp位图)
  548. //DEL  if ( nColorTableEntries != 256)
  549. //DEL  {
  550. //DEL  // 提示用户,不再进行处理
  551. //DEL  MessageBox("目前只支持查看256色位图灰度直方图!", "系统提示" , MB_ICONINFORMATION | MB_OK);
  552. //DEL 
  553. //DEL  // 返回
  554. //DEL  return;
  555. //DEL  }
  556. //DEL 
  557. //DEL  // 更改光标形状
  558. //DEL  BeginWaitCursor();
  559. //DEL 
  560. //DEL  // 创建对话框
  561. //DEL  CDlgHistShow dlgHistShow;
  562. //DEL 
  563. //DEL  // 初始化变量值
  564. //DEL  dlgHistShow.m_pDib = pDoc->m_pDibInit;
  565. //DEL 
  566. //DEL  // 显示对话框
  567. //DEL  if (dlgHistShow.DoModal() != IDOK)
  568. //DEL  {
  569. //DEL  // 返回
  570. //DEL  return;
  571. //DEL  }
  572. //DEL 
  573. //DEL  // 恢复光标
  574. //DEL  EndWaitCursor();
  575. //DEL }
  576. /*************************************************************************
  577.  *
  578.  * 函数名称:
  579.  *   OnEnhanceSmooth()
  580.  *
  581.  * 输入参数:
  582.  *   无
  583.  * 
  584.  * 返回值:
  585.  *   无
  586.  *
  587.  * 说明:
  588.  *   对图象进行平滑处理,并弹出平滑模板设置对话框
  589.  *
  590.  *************************************************************************
  591.  */
  592. //DEL void CImageProcessingView::OnEnhanceSmooth() 
  593. //DEL {
  594. //DEL  // TODO: Add your command handler code here
  595. //DEL  // 图像平滑
  596. //DEL 
  597. //DEL  // 获取文档
  598. //DEL  CImageProcessingDoc* pDoc = GetDocument();
  599. //DEL 
  600. //DEL  // 模板高度
  601. //DEL  int nTempHeight;
  602. //DEL 
  603. //DEL  // 模板宽度
  604. //DEL  int nTempWidth;
  605. //DEL 
  606. //DEL  // 模板系数
  607. //DEL  double dbTempCoef;
  608. //DEL 
  609. //DEL  // 模板中心元素X坐标
  610. //DEL  int nTempCenX;
  611. //DEL 
  612. //DEL  // 模板中心元素Y坐标
  613. //DEL  int nTempCenY;
  614. //DEL 
  615. //DEL  // 模板元素数组
  616. //DEL  double pdbTemp[25];
  617. //DEL 
  618. //DEL  // 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的平滑,其它的可以类推)
  619. //DEL  if(pDoc->m_pDibInit->m_nColorTableEntries != 256)
  620. //DEL  //if (::DIBNumColors(lpDIB) != 256)
  621. //DEL  {
  622. //DEL  // 提示用户
  623. //DEL  MessageBox("目前只支持256色位图的平滑!", "系统提示" , 
  624. //DEL  MB_ICONINFORMATION | MB_OK);
  625. //DEL 
  626. //DEL  // 返回
  627. //DEL  return;
  628. //DEL  }
  629. //DEL 
  630. //DEL  // 创建对话框
  631. //DEL  CDlgSmooth dlgSmth;
  632. //DEL 
  633. //DEL  // 给模板数组赋初值(为平均模板)
  634. //DEL  pdbTemp[0] = 1.0;
  635. //DEL  pdbTemp[1] = 1.0;
  636. //DEL  pdbTemp[2] = 1.0;
  637. //DEL  pdbTemp[3] = 0.0;
  638. //DEL  pdbTemp[4] = 0.0;
  639. //DEL  pdbTemp[5] = 1.0;
  640. //DEL  pdbTemp[6] = 1.0;
  641. //DEL  pdbTemp[7] = 1.0;
  642. //DEL  pdbTemp[8] = 0.0;
  643. //DEL  pdbTemp[9] = 0.0;
  644. //DEL  pdbTemp[10] = 1.0;
  645. //DEL  pdbTemp[11] = 1.0;
  646. //DEL  pdbTemp[12] = 1.0;
  647. //DEL  pdbTemp[13] = 0.0;
  648. //DEL  pdbTemp[14] = 0.0;
  649. //DEL  pdbTemp[15] = 0.0;
  650. //DEL  pdbTemp[16] = 0.0;
  651. //DEL  pdbTemp[17] = 0.0;
  652. //DEL  pdbTemp[18] = 0.0;
  653. //DEL  pdbTemp[19] = 0.0;
  654. //DEL  pdbTemp[20] = 0.0;
  655. //DEL  pdbTemp[21] = 0.0;
  656. //DEL  pdbTemp[22] = 0.0;
  657. //DEL  pdbTemp[23] = 0.0;
  658. //DEL  pdbTemp[24] = 0.0;
  659. //DEL 
  660. //DEL  // 初始化对话框变量值
  661. //DEL  dlgSmth.m_nTemType  = 0;
  662. //DEL  dlgSmth.m_nSmthTemHeight  = 3;
  663. //DEL  dlgSmth.m_nSmthTemWidth  = 3;
  664. //DEL  dlgSmth.m_nSmthTemCenX = 1;
  665. //DEL  dlgSmth.m_nSmthTemCenY = 1;
  666. //DEL  dlgSmth.m_dbSmthTemCoef  = (double) (1.0 / 9.0);
  667. //DEL  dlgSmth.m_pdbTemp = pdbTemp;
  668. //DEL 
  669. //DEL  // 显示对话框,提示用户设定平移量
  670. //DEL  if (dlgSmth.DoModal() != IDOK)
  671. //DEL  {
  672. //DEL  // 返回
  673. //DEL  return;
  674. //DEL  }
  675. //DEL 
  676. //DEL  // 获取用户设定的平移量
  677. //DEL  nTempHeight   = dlgSmth.m_nSmthTemHeight;
  678. //DEL  nTempWidth  = dlgSmth.m_nSmthTemWidth;
  679. //DEL  nTempCenX = dlgSmth.m_nSmthTemCenX;
  680. //DEL  nTempCenY = dlgSmth.m_nSmthTemCenY;
  681. //DEL  dbTempCoef  = dlgSmth.m_dbSmthTemCoef;
  682. //DEL 
  683. //DEL  // 删除对话框
  684. //DEL  delete dlgSmth;
  685. //DEL 
  686. //DEL  // 更改光标形状
  687. //DEL  BeginWaitCursor();
  688. //DEL 
  689. //DEL  // 调用Template()函数平滑DIB
  690. //DEL  if (GeneralTemplate(pDoc->m_pDibInit, nTempWidth, nTempHeight, 
  691. //DEL  nTempCenX, nTempCenY, pdbTemp, dbTempCoef))
  692. //DEL  {
  693. //DEL  // 设置脏标记
  694. //DEL  pDoc->SetModifiedFlag(TRUE);
  695. //DEL 
  696. //DEL  // 更新视图
  697. //DEL  pDoc->UpdateAllViews(NULL);
  698. //DEL  }
  699. //DEL  else
  700. //DEL  {
  701. //DEL  // 提示用户
  702. //DEL  MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK);
  703. //DEL  }
  704. //DEL 
  705. //DEL  // 恢复光标
  706. //DEL  EndWaitCursor();
  707. //DEL 
  708. //DEL }
  709. /*************************************************************************
  710.  *
  711.  * 函数名称:
  712.  *   OnEnhanceMedian()
  713.  *
  714.  * 输入参数:
  715.  *   无
  716.  * 
  717.  * 返回值:
  718.  *   无
  719.  *
  720.  * 说明:
  721.  *   对图象进行中值滤波,并弹出平滑模板设置对话框
  722.  *
  723.  *************************************************************************
  724.  */
  725. //DEL void CImageProcessingView::OnEnhanceMedian() 
  726. //DEL {
  727. //DEL  // 中值滤波
  728. //DEL 
  729. //DEL  // 获取文档
  730. //DEL  CImageProcessingDoc* pDoc = GetDocument();
  731. //DEL 
  732. //DEL  // 滤波器的高度
  733. //DEL  int nFilterHeight;
  734. //DEL 
  735. //DEL  // 滤波器的宽度
  736. //DEL  int nFilterWidth;
  737. //DEL 
  738. //DEL  // 中心元素的X坐标
  739. //DEL  int nFilterCenX;
  740. //DEL 
  741. //DEL  // 中心元素的Y坐标
  742. //DEL  int nFilterCenY;
  743. //DEL 
  744. //DEL  // 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的平滑,其它的可以类推)
  745. //DEL  if(pDoc->m_pDibInit->m_nColorTableEntries != 256)
  746. //DEL  {
  747. //DEL  // 提示用户
  748. //DEL  MessageBox("目前只支持256色位图的平滑!", "系统提示" , 
  749. //DEL  MB_ICONINFORMATION | MB_OK);
  750. //DEL 
  751. //DEL  // 返回
  752. //DEL  return;
  753. //DEL  }
  754. //DEL 
  755. //DEL 
  756. //DEL  // 创建对话框
  757. //DEL  CDlgMedian dlgMedian;
  758. //DEL 
  759. //DEL  // 初始化变量值
  760. //DEL  dlgMedian.m_nFilterType = 0;
  761. //DEL  dlgMedian.m_nFilterHeight = 3;
  762. //DEL  dlgMedian.m_nFilterWidth = 1;
  763. //DEL  dlgMedian.m_nFilterCenX = 0;
  764. //DEL  dlgMedian.m_nFilterCenY = 1;
  765. //DEL 
  766. //DEL  // 显示对话框,提示用户设定平移量
  767. //DEL  if (dlgMedian.DoModal() != IDOK)
  768. //DEL  {
  769. //DEL  // 返回
  770. //DEL  return;
  771. //DEL  }
  772. //DEL 
  773. //DEL  // 获取用户的设定
  774. //DEL  nFilterHeight = dlgMedian.m_nFilterHeight;
  775. //DEL  nFilterWidth = dlgMedian.m_nFilterWidth;
  776. //DEL  nFilterCenX = dlgMedian.m_nFilterCenX;
  777. //DEL  nFilterCenY = dlgMedian.m_nFilterCenY;
  778. //DEL 
  779. //DEL  // 删除对话框
  780. //DEL  delete dlgMedian;
  781. //DEL 
  782. //DEL  // 更改光标形状
  783. //DEL  BeginWaitCursor();
  784. //DEL 
  785. //DEL  // 调用MedianFilter()函数中值滤波
  786. //DEL  if (MedianFilter(pDoc->m_pDibInit, nFilterWidth,
  787. //DEL  nFilterHeight, nFilterCenX, nFilterCenY ))
  788. //DEL 
  789. //DEL  {
  790. //DEL  // 设置脏标记
  791. //DEL  pDoc->SetModifiedFlag(TRUE);
  792. //DEL 
  793. //DEL  // 更新视图
  794. //DEL  pDoc->UpdateAllViews(NULL);
  795. //DEL  }
  796. //DEL  else
  797. //DEL  {
  798. //DEL  // 提示用户
  799. //DEL  MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK);
  800. //DEL  }
  801. //DEL 
  802. //DEL  // 恢复光标
  803. //DEL  EndWaitCursor();
  804. //DEL 
  805. //DEL  // 设置脏标记
  806. //DEL  pDoc->SetModifiedFlag(TRUE);
  807. //DEL 
  808. //DEL  // 更新视图
  809. //DEL  pDoc->UpdateAllViews(NULL);
  810. //DEL 
  811. //DEL }
  812. //DEL void CImageProcessingView::OnEnhancePseudcolor() 
  813. //DEL {
  814. //DEL  // 伪彩色编码
  815. //DEL 
  816. //DEL  // 获取文档
  817. //DEL  CImageProcessingDoc* pDoc = GetDocument();
  818. //DEL 
  819. //DEL  // 保存用户选择的伪彩色编码表索引
  820. //DEL  int nColor;
  821. //DEL 
  822. //DEL  // 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的平滑,其它的可以类推)
  823. //DEL  if(pDoc->m_pDibInit->m_nColorTableEntries != 256)
  824. //DEL  {
  825. //DEL  // 提示用户
  826. //DEL  MessageBox("目前只支持256色位图的伪彩色变换!", "系统提示" , 
  827. //DEL  MB_ICONINFORMATION | MB_OK);
  828. //DEL 
  829. //DEL  // 返回
  830. //DEL  return;
  831. //DEL  }
  832. //DEL 
  833. //DEL  // 参数对话框
  834. //DEL  CDlgEnhColor dlgPara;
  835. //DEL 
  836. //DEL  // 初始化变量值
  837. //DEL  if (pDoc->m_nColorIndex >= 0)
  838. //DEL  {
  839. //DEL  // 初始选中当前的伪彩色
  840. //DEL  dlgPara.m_nColor = pDoc->m_nColorIndex;
  841. //DEL  }
  842. //DEL  else
  843. //DEL  {
  844. //DEL  // 初始选中灰度伪彩色编码表
  845. //DEL  dlgPara.m_nColor = 0;
  846. //DEL  }
  847. //DEL 
  848. //DEL  // 指向名称数组的指针
  849. //DEL  dlgPara.m_lpColorName = (LPSTR) ColorScaleName;
  850. //DEL 
  851. //DEL  // 伪彩色编码数目
  852. //DEL  dlgPara.m_nColorCount = COLOR_SCALE_COUNT;
  853. //DEL 
  854. //DEL  // 名称字符串长度
  855. //DEL  dlgPara.m_nNameLen = sizeof(ColorScaleName) / COLOR_SCALE_COUNT;
  856. //DEL 
  857. //DEL  // 显示对话框,提示用户设定平移量
  858. //DEL  if (dlgPara.DoModal() != IDOK)
  859. //DEL  {
  860. //DEL  // 返回
  861. //DEL  return;
  862. //DEL  }
  863. //DEL 
  864. //DEL  // 获取用户的设定
  865. //DEL  nColor = dlgPara.m_nColor;
  866. //DEL 
  867. //DEL  // 删除对话框
  868. //DEL  delete dlgPara;
  869. //DEL 
  870. //DEL  // 更改光标形状
  871. //DEL  BeginWaitCursor();
  872. //DEL 
  873. //DEL  // 判断伪彩色编码是否改动
  874. //DEL  if (pDoc->m_nColorIndex != nColor)
  875. //DEL  {
  876. //DEL  // 调用ReplaceColorPal()函数变换调色板
  877. //DEL  ReplaceDIBColorTable(pDoc->m_pDibInit, (LPBYTE)ColorsTable[nColor]);
  878. //DEL 
  879. //DEL  // 更新调色板
  880. //DEL  pDoc->m_pDibInit->MakePalette();
  881. //DEL 
  882. //DEL  // 更新类成员变量
  883. //DEL  pDoc->m_nColorIndex = nColor;
  884. //DEL 
  885. //DEL  // 设置脏标记
  886. //DEL  pDoc->SetModifiedFlag(TRUE);
  887. //DEL 
  888. //DEL  // 更新视图
  889. //DEL  pDoc->UpdateAllViews(NULL);
  890. //DEL  }
  891. //DEL 
  892. //DEL 
  893. //DEL  // 恢复光标
  894. //DEL  EndWaitCursor();
  895. //DEL }
  896. //DEL void CImageProcessingView::OnTransDwt() 
  897. //DEL {
  898. //DEL  // 获得文档类指针
  899. //DEL  CImageProcessingDoc * pDoc = (CImageProcessingDoc *)this->GetDocument();
  900. //DEL 
  901. //DEL  // 指向图象的指针
  902. //DEL  CDib * pDib = pDoc->m_pDibInit;
  903. //DEL 
  904. //DEL  // 更改光标形状
  905. //DEL  BeginWaitCursor();
  906. //DEL 
  907. //DEL  // 进行小波变换
  908. //DEL  int rsl = DIBDWTStep(pDib,0);
  909. //DEL 
  910. //DEL  // 恢复光标形状
  911. //DEL  EndWaitCursor();
  912. //DEL 
  913. //DEL  // 如果小波变换不成功,则直接返回
  914. //DEL  if (!rsl)
  915. //DEL  return;
  916. //DEL 
  917. //DEL  // 设置脏标志
  918. //DEL  pDoc->SetModifiedFlag(TRUE);
  919. //DEL 
  920. //DEL  // 更新显示
  921. //DEL  pDoc->UpdateAllViews(FALSE);
  922. //DEL }
  923. //DEL void CImageProcessingView::OnTransIdwt() 
  924. //DEL {
  925. //DEL  // 获得文档类指针
  926. //DEL  CImageProcessingDoc * pDoc = (CImageProcessingDoc *)this->GetDocument();
  927. //DEL 
  928. //DEL  // 指向图象的指针
  929. //DEL  CDib * pDib = pDoc->m_pDibInit;
  930. //DEL 
  931. //DEL  // 更改光标形状
  932. //DEL  BeginWaitCursor();
  933. //DEL 
  934. //DEL  // 进行小波反变换
  935. //DEL  int rsl = DIBDWTStep(pDib,1);
  936. //DEL 
  937. //DEL  // 恢复光标形状
  938. //DEL  EndWaitCursor();
  939. //DEL 
  940. //DEL  // 如果小波变换不成功,则直接返回
  941. //DEL  if (!rsl)
  942. //DEL  return;
  943. //DEL  pDoc->UpdateAllViews(FALSE);
  944. //DEL 
  945. //DEL  // 设置脏标记
  946. //DEL  pDoc->SetModifiedFlag(TRUE);
  947. //DEL 
  948. //DEL  // 更新视图
  949. //DEL  pDoc->UpdateAllViews(NULL);
  950. //DEL }
  951. //DEL BOOL CImageProcessingView::DIBDWTStep(CDib* pDib, int nInv)
  952. //DEL {
  953. //DEL  // 循环变量
  954. //DEL  int i, j;
  955. //DEL 
  956. //DEL  // 获取图象的长度和宽度
  957. //DEL  int nWidth  = pDib->m_lpBMIH->biWidth;
  958. //DEL  int nHeight = pDib->m_lpBMIH->biHeight;
  959. //DEL 
  960. //DEL  // 获取变换的最大层数
  961. //DEL  int nMaxWLevel = Log2(nWidth);
  962. //DEL  int nMaxHLevel = Log2(nHeight);
  963. //DEL  int nMaxLevel;
  964. //DEL  if (nWidth == 1<<nMaxWLevel && nHeight == 1<<nMaxHLevel)
  965. //DEL  nMaxLevel = min(nMaxWLevel, nMaxHLevel);
  966. //DEL 
  967. //DEL  // 获取图象的存储尺寸
  968. //DEL  CSize sizeImageSave = pDib->GetDibSaveDim();
  969. //DEL 
  970. //DEL  // 临时变量
  971. //DEL  double *pDbTemp;
  972. //DEL  BYTE *pBits;
  973. //DEL 
  974. //DEL  // 如果小波变换的存储内存还没有分配,则分配此内存
  975. //DEL  if(!m_pDbImage){
  976. //DEL  m_pDbImage = new double[nWidth*nHeight];
  977. //DEL  if (!m_pDbImage) return FALSE;
  978. //DEL 
  979. //DEL  // 将图象数据放入m_pDbImage中 
  980. //DEL  for (j=0; j<nHeight; j++)
  981. //DEL  {
  982. //DEL  pDbTemp = m_pDbImage + j*sizeImageSave.cx;
  983. //DEL  pBits = pDib->m_lpImage + (nHeight-1-j)*sizeImageSave.cx;
  984. //DEL  for (i=0; i<nWidth; i++)
  985. //DEL  pDbTemp[i] = pBits[i];
  986. //DEL  }
  987. //DEL  }
  988. //DEL 
  989. //DEL  // 进行小波变换(或反变换)
  990. //DEL  if (!DWTStep_2D(m_pDbImage, nMaxWLevel-m_nDWTCurDepth, nMaxHLevel-m_nDWTCurDepth,
  991. //DEL  nMaxWLevel, nMaxHLevel, nInv, 1, m_nSupp))
  992. //DEL  return FALSE;
  993. //DEL 
  994. //DEL  // 如果是反变换,则当前层数减1
  995. //DEL  if (nInv)
  996. //DEL  m_nDWTCurDepth --;
  997. //DEL  // 否则加1
  998. //DEL  else
  999. //DEL  m_nDWTCurDepth ++;
  1000. //DEL 
  1001. //DEL  // 然后,将数据拷贝回原CDib中,并进行相应的数据转换
  1002. //DEL  int lfw = nWidth>>m_nDWTCurDepth, lfh = nHeight>>m_nDWTCurDepth;
  1003. //DEL  for (j=0; j<nHeight; j++)
  1004. //DEL  {
  1005. //DEL  pDbTemp = m_pDbImage + j*sizeImageSave.cx;
  1006. //DEL  pBits = pDib->m_lpImage + (nHeight-1-j)*sizeImageSave.cx;
  1007. //DEL  for (i=0; i<nWidth; i++)
  1008. //DEL  {
  1009. //DEL  if (j<lfh && i<lfw)
  1010. //DEL  pBits[i] = FloatToByte(pDbTemp[i]);
  1011. //DEL  else
  1012. //DEL  pBits[i] = BYTE(FloatToChar(pDbTemp[i]) ^ 0x80);
  1013. //DEL  }
  1014. //DEL  }
  1015. //DEL 
  1016. //DEL  // 返回
  1017. //DEL  return TRUE;
  1018. //DEL }
  1019. //DEL void CImageProcessingView::OnEnhanceLintrans() 
  1020. //DEL {
  1021. //DEL  // 获取文档
  1022. //DEL  CImageProcessingDoc* pDoc = GetDocument();
  1023. //DEL 
  1024. //DEL  // 创建对话框
  1025. //DEL  CDlgEhnLinTrans dlgPara;
  1026. //DEL 
  1027. //DEL  // 点1坐标
  1028. //DEL  int nX1;
  1029. //DEL  int nY1;
  1030. //DEL 
  1031. //DEL  // 点2坐标
  1032. //DEL  int nX2;
  1033. //DEL  int nY2;
  1034. //DEL 
  1035. //DEL  // 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的灰度拉伸,其它的可以类推)
  1036. //DEL  if(pDoc->m_pDibInit->m_nColorTableEntries != 256)
  1037. //DEL  {
  1038. //DEL  // 提示用户
  1039. //DEL  MessageBox("目前只支持256色位图的伪彩色变换!", "系统提示" , 
  1040. //DEL  MB_ICONINFORMATION | MB_OK);
  1041. //DEL 
  1042. //DEL  // 返回
  1043. //DEL  return;
  1044. //DEL  }
  1045. //DEL 
  1046. //DEL  // 初始化变量值
  1047. //DEL  dlgPara.m_nX1 = 50;
  1048. //DEL  dlgPara.m_nY1 = 30;
  1049. //DEL  dlgPara.m_nX2 = 200;
  1050. //DEL  dlgPara.m_nY2 = 220;
  1051. //DEL 
  1052. //DEL  // 显示对话框,提示用户设定拉伸位置
  1053. //DEL  if (dlgPara.DoModal() != IDOK)
  1054. //DEL  {
  1055. //DEL  // 返回
  1056. //DEL  return;
  1057. //DEL  }
  1058. //DEL 
  1059. //DEL  // 获取用户的设定
  1060. //DEL  nX1 = dlgPara.m_nX1;
  1061. //DEL  nY1 = dlgPara.m_nY1;
  1062. //DEL  nX2 = dlgPara.m_nX2;
  1063. //DEL  nY2 = dlgPara.m_nY2;
  1064. //DEL 
  1065. //DEL  // 删除对话框
  1066. //DEL  delete dlgPara;
  1067. //DEL 
  1068. //DEL  // 更改光标形状
  1069. //DEL  BeginWaitCursor();
  1070. //DEL 
  1071. //DEL  // 调用GrayStretch()函数进行灰度拉伸
  1072. //DEL  GraySegLinTrans(pDoc->m_pDibInit, nX1, nY1, nX2, nY2);
  1073. //DEL 
  1074. //DEL  // 设置脏标记
  1075. //DEL  pDoc->SetModifiedFlag(TRUE);
  1076. //DEL 
  1077. //DEL  // 更新视图
  1078. //DEL  pDoc->UpdateAllViews(NULL);
  1079. //DEL 
  1080. //DEL  // 恢复光标
  1081. //DEL  EndWaitCursor();
  1082. //DEL }
  1083. //DEL void CImageProcessingView::OnEnhanceHistequ() 
  1084. //DEL {
  1085. //DEL  // 直方图均衡
  1086. //DEL 
  1087. //DEL  // 获取文档
  1088. //DEL  CImageProcessingDoc* pDoc = GetDocument();
  1089. //DEL 
  1090. //DEL  // 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的直方图均衡,其它的可以类推)
  1091. //DEL  if(pDoc->m_pDibInit->m_nColorTableEntries != 256)
  1092. //DEL  {
  1093. //DEL  // 提示用户
  1094. //DEL  MessageBox("目前只支持256色位图的伪彩色变换!", "系统提示" , 
  1095. //DEL  MB_ICONINFORMATION | MB_OK);
  1096. //DEL 
  1097. //DEL  // 返回
  1098. //DEL  return;
  1099. //DEL  }
  1100. //DEL 
  1101. //DEL  // 更改光标形状
  1102. //DEL  BeginWaitCursor();
  1103. //DEL 
  1104. //DEL  // 调用HistogramEqualize()函数进行直方图均衡
  1105. //DEL  HistogramEqualize(pDoc->m_pDibInit);
  1106. //DEL 
  1107. //DEL  // 设置脏标记
  1108. //DEL  pDoc->SetModifiedFlag(TRUE);
  1109. //DEL 
  1110. //DEL  // 更新视图
  1111. //DEL  pDoc->UpdateAllViews(NULL);
  1112. //DEL 
  1113. //DEL  // 恢复光标
  1114. //DEL  EndWaitCursor();
  1115. //DEL }
  1116. /*************************************************************************
  1117.  *
  1118.  * 函数名称:
  1119.  *   OnRegReg()
  1120.  *
  1121.  * 输入参数:
  1122.  *   无
  1123.  * 
  1124.  * 返回值:
  1125.  *   无
  1126.  *
  1127.  * 说明:
  1128.  *   该函数实现图象的配准
  1129.  *
  1130.  *************************************************************************
  1131.  */
  1132. //DEL void CImageProcessingView::OnRegReg() 
  1133. //DEL {
  1134. //DEL  // 获得文档类句柄
  1135. //DEL  CImageProcessingDoc* pDoc;
  1136. //DEL  pDoc = GetDocument();
  1137. //DEL 
  1138. //DEL  // 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的水平镜像,其它的可以类推)
  1139. //DEL  if(pDoc->m_pDibInit->m_nColorTableEntries != 256)
  1140. //DEL  {
  1141. //DEL  // 提示用户
  1142. //DEL  MessageBox("目前只支持256色位图的图象配准!", "系统提示" , 
  1143. //DEL  MB_ICONINFORMATION | MB_OK);
  1144. //DEL 
  1145. //DEL  // 返回
  1146. //DEL  return;
  1147. //DEL  }
  1148. //DEL 
  1149. //DEL  // 打开图象配准对话框
  1150. //DEL  CDlgReg* pDlg=new CDlgReg(NULL,pDoc);
  1151. //DEL 
  1152. //DEL  pDlg->DoModal();
  1153. //DEL 
  1154. //DEL  delete pDlg;
  1155. //DEL }
  1156. /*************************************************************************
  1157.  *
  1158.  * 函数名称:
  1159.  *   OnEnhanceSharp()
  1160.  *
  1161.  * 输入参数:
  1162.  *   无
  1163.  * 
  1164.  * 返回值:
  1165.  *   无
  1166.  *
  1167.  * 说明:
  1168.  *   该函数利用Laplacian算子实现图象的锐化
  1169.  *
  1170.  *************************************************************************
  1171.  */
  1172. //DEL void CImageProcessingView::OnEnhanceSharp() 
  1173. //DEL {
  1174. //DEL  //更改光标形状
  1175. //DEL  BeginWaitCursor(); 
  1176. //DEL 
  1177. //DEL  CImageProcessingDoc * pDoc = (CImageProcessingDoc *)this->GetDocument();
  1178. //DEL  CDib * pDib = pDoc->m_pDibInit;
  1179. //DEL 
  1180. //DEL  LPBITMAPINFOHEADER lpBMIH=pDib->m_lpBMIH;
  1181. //DEL 
  1182. //DEL  // 判断是否是8-bpp位图
  1183. //DEL  if (lpBMIH->biBitCount != 8)
  1184. //DEL  {
  1185. //DEL  // 提示用户
  1186. //DEL  MessageBox("目前只支持256色位图的图象分割!", "系统提示" ,
  1187. //DEL  MB_ICONINFORMATION | MB_OK);
  1188. //DEL 
  1189. //DEL  // 返回
  1190. //DEL  return;
  1191. //DEL  }
  1192. //DEL 
  1193. //DEL  // 循环控制变量
  1194. //DEL  int y;
  1195. //DEL  int x;
  1196. //DEL 
  1197. //DEL  CSize sizeImage = pDib->GetDimensions();
  1198. //DEL  int nWidth = sizeImage.cx ;
  1199. //DEL  int nHeight= sizeImage.cy ;
  1200. //DEL 
  1201. //DEL  int nSaveWidth = pDib->GetDibSaveDim().cx;
  1202. //DEL 
  1203. //DEL  // 开辟内存,存储图象数据,该数据的存储不是DWORD对齐的
  1204. //DEL  unsigned char * pUnchImage = new unsigned char[nWidth*nHeight];
  1205. //DEL 
  1206. //DEL  for(y=0; y<nHeight; y++)
  1207. //DEL  {
  1208. //DEL  for(x=0; x<nWidth; x++)
  1209. //DEL  {
  1210. //DEL  pUnchImage[y*nWidth+x] = pDib->m_lpImage[y*nSaveWidth+x];
  1211. //DEL  }
  1212. //DEL  }
  1213. //DEL 
  1214. //DEL  // 调用LinearSharpen函数进行图象锐化增强
  1215. //DEL  LinearSharpen(pUnchImage, nWidth, nHeight) ;
  1216. //DEL 
  1217. //DEL  // 增强以后的图象拷贝到pDib中,进行显示
  1218. //DEL  for(y=0; y<nHeight; y++)
  1219. //DEL  {
  1220. //DEL  for(x=0; x<nWidth; x++)
  1221. //DEL  {
  1222. //DEL  pDib->m_lpImage[y*nSaveWidth+x] = pUnchImage[y*nWidth+x];
  1223. //DEL  }
  1224. //DEL  }
  1225. //DEL 
  1226. //DEL  // 释放内存
  1227. //DEL  delete []pUnchImage;
  1228. //DEL  pUnchImage = NULL  ;
  1229. //DEL 
  1230. //DEL  // 恢复光标形状
  1231. //DEL  EndWaitCursor(); 
  1232. //DEL 
  1233. //DEL  // 设置脏标记
  1234. //DEL  pDoc->SetModifiedFlag(TRUE);
  1235. //DEL 
  1236. //DEL  // 更新视图
  1237. //DEL  pDoc->UpdateAllViews(NULL);
  1238. //DEL 
  1239. //DEL }
  1240. /*************************************************************************
  1241. *
  1242. * 函数名称:
  1243. *   OnEnhanceSmoothFr()
  1244. *
  1245. * 输入参数:
  1246. *   无
  1247. *
  1248. * 返回值:
  1249. *   无
  1250. *
  1251. * 说明:
  1252. *   该函数利用低通滤波实现图象平滑
  1253. *
  1254. ************************************************************************
  1255. */
  1256. //DEL void CImageProcessingView::OnEnhanceSmoothFr() 
  1257. //DEL {
  1258. //DEL  // TODO: Add your command handler code here
  1259. //DEL  //更改光标形状
  1260. //DEL  BeginWaitCursor(); 
  1261. //DEL 
  1262. //DEL  CImageProcessingDoc * pDoc = (CImageProcessingDoc *)this->GetDocument();
  1263. //DEL  CDib * pDib = pDoc->m_pDibInit;
  1264. //DEL 
  1265. //DEL  LPBITMAPINFOHEADER lpBMIH=pDib->m_lpBMIH;
  1266. //DEL 
  1267. //DEL  // 判断是否是8-bpp位图
  1268. //DEL  if (lpBMIH->biBitCount != 8)
  1269. //DEL  {
  1270. //DEL  // 提示用户
  1271. //DEL  MessageBox("目前只支持256色位图的图象分割!", "系统提示" ,
  1272. //DEL  MB_ICONINFORMATION | MB_OK);
  1273. //DEL 
  1274. //DEL  // 返回
  1275. //DEL  return;
  1276. //DEL  }
  1277. //DEL 
  1278. //DEL  // 循环控制变量
  1279. //DEL  int y;
  1280. //DEL  int x;
  1281. //DEL 
  1282. //DEL  CSize sizeImage = pDib->GetDimensions();
  1283. //DEL  int nWidth = sizeImage.cx ;
  1284. //DEL  int nHeight= sizeImage.cy ;
  1285. //DEL 
  1286. //DEL  int nSaveWidth = pDib->GetDibSaveDim().cx;
  1287. //DEL 
  1288. //DEL  // 开辟内存,存储图象数据,该数据的存储不是DWORD对齐的
  1289. //DEL  unsigned char * pUnchImage = new unsigned char[nWidth*nHeight];
  1290. //DEL 
  1291. //DEL  for(y=0; y<nHeight; y++)
  1292. //DEL  {
  1293. //DEL  for(x=0; x<nWidth; x++)
  1294. //DEL  {
  1295. //DEL  pUnchImage[y*nWidth+x] = pDib->m_lpImage[y*nSaveWidth+x];
  1296. //DEL  }
  1297. //DEL  }
  1298. //DEL 
  1299. //DEL  // 调用低通滤波函数进行图象增强
  1300. //DEL  LowPassFilterEnhance(pUnchImage, nWidth, nHeight, nWidth/16) ;
  1301. //DEL 
  1302. //DEL  // 增强以后的图象拷贝到pDib中,进行显示
  1303. //DEL  for(y=0; y<nHeight; y++)
  1304. //DEL  {
  1305. //DEL  for(x=0; x<nWidth; x++)
  1306. //DEL  {
  1307. //DEL  pDib->m_lpImage[y*nSaveWidth+x] = pUnchImage[y*nWidth+x];
  1308. //DEL  }
  1309. //DEL  }
  1310. //DEL 
  1311. //DEL  // 释放内存
  1312. //DEL  delete []pUnchImage;
  1313. //DEL  pUnchImage = NULL  ;
  1314. //DEL 
  1315. //DEL  // 恢复光标形状
  1316. //DEL  EndWaitCursor(); 
  1317. //DEL 
  1318. //DEL  // 设置脏标记
  1319. //DEL  pDoc->SetModifiedFlag(TRUE);
  1320. //DEL 
  1321. //DEL  // 更新视图
  1322. //DEL  pDoc->UpdateAllViews(NULL);
  1323. //DEL }
  1324. /*************************************************************************
  1325. *
  1326. * 函数名称:
  1327. *   OnEnhanceButtLow()
  1328. *
  1329. * 输入参数:
  1330. *   无
  1331. *
  1332. * 返回值:
  1333. *   无
  1334. *
  1335. * 说明:
  1336. *   该函数利用Butterworth低通滤波实现图象平滑
  1337. *
  1338. ************************************************************************
  1339. */
  1340. //DEL void CImageProcessingView::OnEnhanceButtLow() 
  1341. //DEL {
  1342. //DEL  // TODO: Add your command handler code here
  1343. //DEL  //更改光标形状
  1344. //DEL  BeginWaitCursor(); 
  1345. //DEL 
  1346. //DEL  CImageProcessingDoc * pDoc = (CImageProcessingDoc *)this->GetDocument();
  1347. //DEL  CDib * pDib = pDoc->m_pDibInit;
  1348. //DEL 
  1349. //DEL  LPBITMAPINFOHEADER lpBMIH=pDib->m_lpBMIH;
  1350. //DEL 
  1351. //DEL  // 判断是否是8-bpp位图
  1352. //DEL  if (lpBMIH->biBitCount != 8)
  1353. //DEL  {
  1354. //DEL  // 提示用户
  1355. //DEL  MessageBox("目前只支持256色位图的图象分割!", "系统提示" ,
  1356. //DEL  MB_ICONINFORMATION | MB_OK);
  1357. //DEL 
  1358. //DEL  // 返回
  1359. //DEL  return;
  1360. //DEL  }
  1361. //DEL 
  1362. //DEL  // 循环控制变量
  1363. //DEL  int y;
  1364. //DEL  int x;
  1365. //DEL 
  1366. //DEL  CSize sizeImage = pDib->GetDimensions();
  1367. //DEL  int nWidth = sizeImage.cx ;
  1368. //DEL  int nHeight= sizeImage.cy ;
  1369. //DEL 
  1370. //DEL  int nSaveWidth = pDib->GetDibSaveDim().cx;
  1371. //DEL 
  1372. //DEL  // 开辟内存,存储图象数据,该数据的存储不是DWORD对齐的
  1373. //DEL  unsigned char * pUnchImage = new unsigned char[nWidth*nHeight];
  1374. //DEL 
  1375. //DEL  for(y=0; y<nHeight; y++)
  1376. //DEL  {
  1377. //DEL  for(x=0; x<nWidth; x++)
  1378. //DEL  {
  1379. //DEL  pUnchImage[y*nWidth+x] = pDib->m_lpImage[y*nSaveWidth+x];
  1380. //DEL  }
  1381. //DEL  }
  1382. //DEL 
  1383. //DEL  // 调用ButterWorth低通滤波函数进行图象增强
  1384. //DEL  ButterWorthLowPass(pUnchImage, nWidth, nHeight, nWidth/2) ;
  1385. //DEL 
  1386. //DEL  // 增强以后的图象拷贝到pDib中,进行显示
  1387. //DEL  for(y=0; y<nHeight; y++)
  1388. //DEL  {
  1389. //DEL  for(x=0; x<nWidth; x++)
  1390. //DEL  {
  1391. //DEL  pDib->m_lpImage[y*nSaveWidth+x] = pUnchImage[y*nWidth+x];
  1392. //DEL  }
  1393. //DEL  }
  1394. //DEL 
  1395. //DEL  // 释放内存
  1396. //DEL  delete []pUnchImage;
  1397. //DEL  pUnchImage = NULL  ;
  1398. //DEL 
  1399. //DEL  // 恢复光标形状
  1400. //DEL  EndWaitCursor(); 
  1401. //DEL 
  1402. //DEL  // 设置脏标记
  1403. //DEL  pDoc->SetModifiedFlag(TRUE);
  1404. //DEL 
  1405. //DEL  // 更新视图
  1406. //DEL  pDoc->UpdateAllViews(NULL);
  1407. //DEL }
  1408. /*************************************************************************
  1409. *
  1410. * 函数名称:
  1411. *   OnEnhanceSharpFreq()
  1412. *
  1413. * 输入参数:
  1414. *   无
  1415. *
  1416. * 返回值:
  1417. *   无
  1418. *
  1419. * 说明:
  1420. *   该函数利用高通滤波实现图象增强
  1421. *
  1422. ************************************************************************
  1423. */
  1424. //DEL void CImageProcessingView::OnEnhanceSharpFreq() 
  1425. //DEL {
  1426. //DEL  // TODO: Add your command handler code here
  1427. //DEL  //更改光标形状
  1428. //DEL  BeginWaitCursor(); 
  1429. //DEL 
  1430. //DEL  CImageProcessingDoc * pDoc = (CImageProcessingDoc *)this->GetDocument();
  1431. //DEL  CDib * pDib = pDoc->m_pDibInit;
  1432. //DEL 
  1433. //DEL  LPBITMAPINFOHEADER lpBMIH=pDib->m_lpBMIH;
  1434. //DEL 
  1435. //DEL  // 判断是否是8-bpp位图
  1436. //DEL  if (lpBMIH->biBitCount != 8)
  1437. //DEL  {
  1438. //DEL  // 提示用户
  1439. //DEL  MessageBox("目前只支持256色位图的图象分割!", "系统提示" ,
  1440. //DEL  MB_ICONINFORMATION | MB_OK);
  1441. //DEL 
  1442. //DEL  // 返回
  1443. //DEL  return;
  1444. //DEL  }
  1445. //DEL 
  1446. //DEL  // 循环控制变量
  1447. //DEL  int y;
  1448. //DEL  int x;
  1449. //DEL 
  1450. //DEL  CSize sizeImage = pDib->GetDimensions();
  1451. //DEL  int nWidth = sizeImage.cx ;
  1452. //DEL  int nHeight= sizeImage.cy ;
  1453. //DEL 
  1454. //DEL  int nSaveWidth = pDib->GetDibSaveDim().cx;
  1455. //DEL 
  1456. //DEL  // 开辟内存,存储图象数据,该数据的存储不是DWORD对齐的
  1457. //DEL  unsigned char * pUnchImage = new unsigned char[nWidth*nHeight];
  1458. //DEL 
  1459. //DEL  for(y=0; y<nHeight; y++)
  1460. //DEL  {
  1461. //DEL  for(x=0; x<nWidth; x++)
  1462. //DEL  {
  1463. //DEL  pUnchImage[y*nWidth+x] = pDib->m_lpImage[y*nSaveWidth+x];
  1464. //DEL  }
  1465. //DEL  }
  1466. //DEL 
  1467. //DEL  // 调用高通滤波函数进行图象增强
  1468. //DEL  HighPassFilterEnhance(pUnchImage, nWidth, nHeight, 50) ;
  1469. //DEL 
  1470. //DEL  // 增强以后的图象拷贝到pDib中,进行显示
  1471. //DEL  for(y=0; y<nHeight; y++)
  1472. //DEL  {
  1473. //DEL  for(x=0; x<nWidth; x++)
  1474. //DEL  {
  1475. //DEL  pDib->m_lpImage[y*nSaveWidth+x] = pUnchImage[y*nWidth+x];
  1476. //DEL  }
  1477. //DEL  }
  1478. //DEL 
  1479. //DEL  // 释放内存
  1480. //DEL  delete []pUnchImage;
  1481. //DEL  pUnchImage = NULL  ;
  1482. //DEL 
  1483. //DEL  // 恢复光标形状
  1484. //DEL  EndWaitCursor(); 
  1485. //DEL 
  1486. //DEL  // 设置脏标记
  1487. //DEL  pDoc->SetModifiedFlag(TRUE);
  1488. //DEL 
  1489. //DEL  // 更新视图
  1490. //DEL  pDoc->UpdateAllViews(NULL);
  1491. //DEL }
  1492. /*************************************************************************
  1493. *
  1494. * 函数名称:
  1495. *   OnEnhanceButtHight()
  1496. *
  1497. * 输入参数:
  1498. *   无
  1499. *
  1500. * 返回值:
  1501. *   无
  1502. *
  1503. * 说明:
  1504. *   该函数利用Butterworth高通滤波实现图象平滑
  1505. *
  1506. ************************************************************************
  1507. */
  1508. //DEL void CImageProcessingView::OnEnhanceButtHight() 
  1509. //DEL {
  1510. //DEL  //更改光标形状
  1511. //DEL  BeginWaitCursor(); 
  1512. //DEL 
  1513. //DEL  CImageProcessingDoc * pDoc = (CImageProcessingDoc *)this->GetDocument();
  1514. //DEL  CDib * pDib = pDoc->m_pDibInit;
  1515. //DEL 
  1516. //DEL  LPBITMAPINFOHEADER lpBMIH=pDib->m_lpBMIH;
  1517. //DEL 
  1518. //DEL  // 判断是否是8-bpp位图
  1519. //DEL  if (lpBMIH->biBitCount != 8)
  1520. //DEL  {
  1521. //DEL  // 提示用户
  1522. //DEL  MessageBox("目前只支持256色位图的图象分割!", "系统提示" ,
  1523. //DEL  MB_ICONINFORMATION | MB_OK);
  1524. //DEL 
  1525. //DEL  // 返回
  1526. //DEL  return;
  1527. //DEL  }
  1528. //DEL 
  1529. //DEL  // 循环控制变量
  1530. //DEL  int y;
  1531. //DEL  int x;
  1532. //DEL 
  1533. //DEL  CSize sizeImage = pDib->GetDimensions();
  1534. //DEL  int nWidth = sizeImage.cx ;
  1535. //DEL  int nHeight= sizeImage.cy ;
  1536. //DEL 
  1537. //DEL  int nSaveWidth = pDib->GetDibSaveDim().cx;
  1538. //DEL 
  1539. //DEL  // 开辟内存,存储图象数据,该数据的存储不是DWORD对齐的
  1540. //DEL  unsigned char * pUnchImage = new unsigned char[nWidth*nHeight];
  1541. //DEL 
  1542. //DEL  for(y=0; y<nHeight; y++)
  1543. //DEL  {
  1544. //DEL  for(x=0; x<nWidth; x++)
  1545. //DEL  {
  1546. //DEL  pUnchImage[y*nWidth+x] = pDib->m_lpImage[y*nSaveWidth+x];
  1547. //DEL  }
  1548. //DEL  }
  1549. //DEL 
  1550. //DEL  // 调用ButterWorth高通滤波函数进行图象增强
  1551. //DEL  ButterWorthHighPass(pUnchImage, nWidth, nHeight, nWidth/2) ;
  1552. //DEL 
  1553. //DEL  // 增强以后的图象拷贝到pDib中,进行显示
  1554. //DEL  for(y=0; y<nHeight; y++)
  1555. //DEL  {
  1556. //DEL  for(x=0; x<nWidth; x++)
  1557. //DEL  {
  1558. //DEL  pDib->m_lpImage[y*nSaveWidth+x] = pUnchImage[y*nWidth+x];
  1559. //DEL  }
  1560. //DEL  }
  1561. //DEL 
  1562. //DEL  // 释放内存
  1563. //DEL  delete []pUnchImage;
  1564. //DEL  pUnchImage = NULL  ;
  1565. //DEL 
  1566. //DEL  // 恢复光标形状
  1567. //DEL  EndWaitCursor(); 
  1568. //DEL 
  1569. //DEL  // 设置脏标记
  1570. //DEL  pDoc->SetModifiedFlag(TRUE);
  1571. //DEL 
  1572. //DEL  // 更新视图
  1573. //DEL  pDoc->UpdateAllViews(NULL);
  1574. //DEL 
  1575. //DEL }
  1576. /*************************************************************************
  1577. *
  1578. * 函数名称:
  1579. *   OnRegionsegFix()
  1580. *
  1581. * 输入参数:
  1582. *   无
  1583. *
  1584. * 返回值:
  1585. *   无
  1586. *
  1587. * 说明:
  1588. *   实现并行区域分割
  1589. *
  1590. ************************************************************************
  1591. */
  1592. //DEL void CImageProcessingView::OnRegionsegFix() 
  1593. //DEL {
  1594. //DEL  // TODO: Add your command handler code here
  1595. //DEL 
  1596. //DEL  //更改光标形状
  1597. //DEL  BeginWaitCursor(); 
  1598. //DEL 
  1599. //DEL  CImageProcessingDoc * pDoc = (CImageProcessingDoc *)this->GetDocument();
  1600. //DEL  CDib * pDib = pDoc->m_pDibInit;
  1601. //DEL 
  1602. //DEL  LPBITMAPINFOHEADER lpBMIH=pDib->m_lpBMIH;
  1603. //DEL 
  1604. //DEL  // 判断是否是8-bpp位图
  1605. //DEL  if (lpBMIH->biBitCount != 8)
  1606. //DEL  {
  1607. //DEL  // 提示用户
  1608. //DEL  MessageBox("目前只支持256色位图的图象分割!", "系统提示" ,
  1609. //DEL  MB_ICONINFORMATION | MB_OK);
  1610. //DEL 
  1611. //DEL  // 返回
  1612. //DEL  return;
  1613. //DEL  }
  1614. //DEL 
  1615. //DEL  // 调用函数实现固定阈值分割
  1616. //DEL  RegionSegFixThreshold(pDib,200);
  1617. //DEL 
  1618. //DEL  // 恢复光标形状
  1619. //DEL  EndWaitCursor(); 
  1620. //DEL 
  1621. //DEL  // 设置脏标记
  1622. //DEL  pDoc->SetModifiedFlag(TRUE);
  1623. //DEL 
  1624. //DEL  // 更新视图
  1625. //DEL  pDoc->UpdateAllViews(NULL);
  1626. //DEL }
  1627. /*************************************************************************
  1628. *
  1629. * 函数名称:
  1630. *   OnAdaRegionSeg()
  1631. *
  1632. * 输入参数:
  1633. *   无
  1634. *
  1635. * 返回值:
  1636. *   无
  1637. *
  1638. * 说明:
  1639. *   实现自适应区域分割算法
  1640. *
  1641. ************************************************************************
  1642. */
  1643. //DEL void CImageProcessingView::OnAdaRegionSeg() 
  1644. //DEL {
  1645. //DEL  // TODO: Add your command handler code here
  1646. //DEL 
  1647. //DEL  //更改光标形状
  1648. //DEL  BeginWaitCursor(); 
  1649. //DEL 
  1650. //DEL  CImageProcessingDoc * pDoc = (CImageProcessingDoc *)this->GetDocument();
  1651. //DEL  CDib * pDib = pDoc->m_pDibInit;
  1652. //DEL 
  1653. //DEL  LPBITMAPINFOHEADER lpBMIH=pDib->m_lpBMIH;
  1654. //DEL 
  1655. //DEL  // 判断是否是8-bpp位图
  1656. //DEL  if (lpBMIH->biBitCount != 8)
  1657. //DEL  {
  1658. //DEL  // 提示用户
  1659. //DEL  MessageBox("目前只支持256色位图的图象分割!", "系统提示" ,
  1660. //DEL  MB_ICONINFORMATION | MB_OK);
  1661. //DEL 
  1662. //DEL  // 返回
  1663. //DEL  return;
  1664. //DEL  }
  1665. //DEL 
  1666. //DEL  // 自适应区域分割
  1667. //DEL  RegionSegAdaptive(pDib);
  1668. //DEL 
  1669. //DEL  // 恢复光标形状
  1670. //DEL  EndWaitCursor(); 
  1671. //DEL 
  1672. //DEL  // 设置脏标记
  1673. //DEL  pDoc->SetModifiedFlag(TRUE);
  1674. //DEL 
  1675. //DEL  // 更新视图
  1676. //DEL  pDoc->UpdateAllViews(NULL);
  1677. //DEL 
  1678. //DEL }
  1679. /*************************************************************************
  1680. *
  1681. * 函数名称:
  1682. *   OnEdgeRoberts()
  1683. *
  1684. * 输入参数:
  1685. *   无
  1686. *
  1687. * 返回值:
  1688. *   无
  1689. *
  1690. * 说明:
  1691. *   实现并行边界分割-Roberts算子
  1692. *
  1693. ************************************************************************
  1694. */
  1695. //DEL void CImageProcessingView::OnEdgeRoberts() 
  1696. //DEL {
  1697. //DEL  // TODO: Add your command handler code here
  1698. //DEL 
  1699. //DEL  //更改光标形状
  1700. //DEL  BeginWaitCursor(); 
  1701. //DEL 
  1702. //DEL  // 循环控制变量
  1703. //DEL  int y;
  1704. //DEL  int x;
  1705. //DEL 
  1706. //DEL  CImageProcessingDoc * pDoc = (CImageProcessingDoc *)this->GetDocument();
  1707. //DEL  CDib * pDib = pDoc->m_pDibInit;
  1708. //DEL 
  1709. //DEL  LPBITMAPINFOHEADER lpBMIH=pDib->m_lpBMIH;
  1710. //DEL 
  1711. //DEL  // 判断是否是8-bpp位图
  1712. //DEL  if (lpBMIH->biBitCount != 8)
  1713. //DEL  {
  1714. //DEL  // 提示用户
  1715. //DEL  MessageBox("目前只支持256色位图的图象分割!", "系统提示" ,
  1716. //DEL  MB_ICONINFORMATION | MB_OK);
  1717. //DEL 
  1718. //DEL  // 返回
  1719. //DEL  return;
  1720. //DEL  }
  1721. //DEL 
  1722. //DEL  // 图象的长宽大小
  1723. //DEL  CSize sizeImage = pDib->GetDimensions();
  1724. //DEL  int nWidth = sizeImage.cx ;
  1725. //DEL  int nHeight = sizeImage.cy ;
  1726. //DEL 
  1727. //DEL  // 指向梯度数据的指针
  1728. //DEL  double * pdGrad;
  1729. //DEL 
  1730. //DEL  // 按照图像的大小开辟内存空间,存储梯度计算的结果
  1731. //DEL  pdGrad=new double[nHeight*nWidth];
  1732. //DEL 
  1733. //DEL  //图像数据的指针
  1734. //DEL  LPBYTE  pImageData = pDib->m_lpImage;
  1735. //DEL 
  1736. //DEL  // 图像在计算机在存储中的实际大小
  1737. //DEL  CSize sizeImageSave = pDib->GetDibSaveDim();
  1738. //DEL 
  1739. //DEL  // 图像在内存中每一行象素占用的实际空间
  1740. //DEL  int nSaveWidth = sizeImageSave.cx;
  1741. //DEL 
  1742. //DEL  // 应用Roberts算子求梯度
  1743. //DEL  RobertsOperator(pDib, pdGrad);
  1744. //DEL 
  1745. //DEL 
  1746. //DEL  for(y=0; y<nHeight ; y++ )
  1747. //DEL  for(x=0 ; x<nWidth ; x++ )
  1748. //DEL  {
  1749. //DEL  if(*(pdGrad+y*nWidth+x)>50)
  1750. //DEL  *( pImageData+y*nSaveWidth+x )=0;
  1751. //DEL  else
  1752. //DEL  *( pImageData+y*nSaveWidth+x )=255;
  1753. //DEL  }
  1754. //DEL 
  1755. //DEL   //释放梯度结果使用的内存空间
  1756. //DEL  delete pdGrad;
  1757. //DEL  pdGrad=NULL;
  1758. //DEL 
  1759. //DEL  // 恢复光标形状
  1760. //DEL  EndWaitCursor(); 
  1761. //DEL 
  1762. //DEL  // 设置脏标记
  1763. //DEL  pDoc->SetModifiedFlag(TRUE);
  1764. //DEL 
  1765. //DEL  // 更新视图
  1766. //DEL  pDoc->UpdateAllViews(NULL);
  1767. //DEL }
  1768. /*************************************************************************
  1769. *
  1770. * 函数名称:
  1771. *   OnEdgeSobel()
  1772. *
  1773. * 输入参数:
  1774. *   无
  1775. *
  1776. * 返回值:
  1777. *   无
  1778. *
  1779. * 说明:
  1780. *   实现并行边界分割-Sobel算子
  1781. *
  1782. ************************************************************************
  1783. */
  1784. //DEL void CImageProcessingView::OnEdgeSobel() 
  1785. //DEL {
  1786. //DEL  // TODO: Add your command handler code here
  1787. //DEL 
  1788. //DEL  //更改光标形状
  1789. //DEL  BeginWaitCursor(); 
  1790. //DEL 
  1791. //DEL  // 循环控制变量
  1792. //DEL  int y;
  1793. //DEL  int x;
  1794. //DEL 
  1795. //DEL  CImageProcessingDoc * pDoc = (CImageProcessingDoc *)this->GetDocument();
  1796. //DEL  CDib * pDib = pDoc->m_pDibInit;
  1797. //DEL 
  1798. //DEL  LPBITMAPINFOHEADER lpBMIH=pDib->m_lpBMIH;
  1799. //DEL 
  1800. //DEL  // 判断是否是8-bpp位图
  1801. //DEL  if (lpBMIH->biBitCount != 8)
  1802. //DEL  {
  1803. //DEL  // 提示用户
  1804. //DEL  MessageBox("目前只支持256色位图的图象分割!", "系统提示" ,
  1805. //DEL  MB_ICONINFORMATION | MB_OK);
  1806. //DEL 
  1807. //DEL  // 返回
  1808. //DEL  return;
  1809. //DEL  }
  1810. //DEL 
  1811. //DEL  // 图象的长宽大小
  1812. //DEL  CSize sizeImage = pDib->GetDimensions();
  1813. //DEL  int nWidth = sizeImage.cx ;
  1814. //DEL  int nHeight = sizeImage.cy ;
  1815. //DEL 
  1816. //DEL  // 指向梯度数据的指针
  1817. //DEL  double * pdGrad;
  1818. //DEL 
  1819. //DEL  // 按照图像的大小开辟内存空间,存储梯度计算的结果
  1820. //DEL  pdGrad=new double[nHeight*nWidth];
  1821. //DEL 
  1822. //DEL  //图像数据的指针
  1823. //DEL  LPBYTE  lpImage = pDib->m_lpImage;
  1824. //DEL 
  1825. //DEL  // 图像在计算机在存储中的实际大小
  1826. //DEL  CSize sizeImageSave = pDib->GetDibSaveDim();
  1827. //DEL 
  1828. //DEL  // 图像在内存中每一行象素占用的实际空间
  1829. //DEL  int nSaveWidth = sizeImageSave.cx;
  1830. //DEL 
  1831. //DEL  // 应用Sobel算子求梯度
  1832. //DEL  SobelOperator(pDib, pdGrad);
  1833. //DEL 
  1834. //DEL 
  1835. //DEL  for(y=0; y<nHeight ; y++ )
  1836. //DEL  for(x=0 ; x<nWidth ; x++ )
  1837. //DEL  {
  1838. //DEL  if(*(pdGrad+y*nWidth+x)>50)
  1839. //DEL  *( lpImage+y*nSaveWidth+x )=0;
  1840. //DEL  else
  1841. //DEL  *( lpImage+y*nSaveWidth+x )=255;
  1842. //DEL  }
  1843. //DEL 
  1844. //DEL   //释放内存空间
  1845. //DEL  delete []pdGrad;
  1846. //DEL  pdGrad=NULL;
  1847. //DEL 
  1848. //DEL  // 恢复光标形状
  1849. //DEL  EndWaitCursor(); 
  1850. //DEL 
  1851. //DEL  // 设置脏标记
  1852. //DEL  pDoc->SetModifiedFlag(TRUE);
  1853. //DEL 
  1854. //DEL  // 更新视图
  1855. //DEL  pDoc->UpdateAllViews(NULL);
  1856. //DEL }
  1857. /*************************************************************************
  1858. *
  1859. * 函数名称:
  1860. *   OnEdgePrewitt()
  1861. *
  1862. * 输入参数:
  1863. *   无
  1864. *
  1865. * 返回值:
  1866. *   无
  1867. *
  1868. * 说明:
  1869. *   实现并行边界分割-Prewitt算子
  1870. *
  1871. ************************************************************************
  1872. */
  1873. //DEL void CImageProcessingView::OnEdgePrewitt() 
  1874. //DEL {
  1875. //DEL  // TODO: Add your command handler code here
  1876. //DEL 
  1877. //DEL  //更改光标形状
  1878. //DEL  BeginWaitCursor(); 
  1879. //DEL 
  1880. //DEL  // 循环控制变量
  1881. //DEL  int y;
  1882. //DEL  int x;
  1883. //DEL 
  1884. //DEL  CImageProcessingDoc * pDoc = (CImageProcessingDoc *)this->GetDocument();
  1885. //DEL  CDib * pDib = pDoc->m_pDibInit;
  1886. //DEL 
  1887. //DEL  LPBITMAPINFOHEADER lpBMIH=pDib->m_lpBMIH;
  1888. //DEL 
  1889. //DEL  // 判断是否是8-bpp位图
  1890. //DEL  if (lpBMIH->biBitCount != 8)
  1891. //DEL  {
  1892. //DEL  // 提示用户
  1893. //DEL  MessageBox("目前只支持256色位图的图象分割!", "系统提示" ,
  1894. //DEL  MB_ICONINFORMATION | MB_OK);
  1895. //DEL 
  1896. //DEL  // 返回
  1897. //DEL  return;
  1898. //DEL  }
  1899. //DEL 
  1900. //DEL  // 图象的长宽大小
  1901. //DEL  CSize sizeImage = pDib->GetDimensions();
  1902. //DEL  int nWidth = sizeImage.cx ;
  1903. //DEL  int nHeight = sizeImage.cy ;
  1904. //DEL 
  1905. //DEL  // 指向梯度数据的指针
  1906. //DEL  double * pdGrad;
  1907. //DEL 
  1908. //DEL  // 按照图像的大小开辟内存空间,存储梯度计算的结果
  1909. //DEL  pdGrad=new double[nHeight*nWidth];
  1910. //DEL 
  1911. //DEL  //图像数据的指针
  1912. //DEL  LPBYTE  lpImage = pDib->m_lpImage;
  1913. //DEL 
  1914. //DEL  // 图像在计算机在存储中的实际大小
  1915. //DEL  CSize sizeImageSave = pDib->GetDibSaveDim();
  1916. //DEL 
  1917. //DEL  // 图像在内存中每一行象素占用的实际空间
  1918. //DEL  int nSaveWidth = sizeImageSave.cx;
  1919. //DEL 
  1920. //DEL  // 应用Prewitt算子求梯度
  1921. //DEL  PrewittOperator(pDib, pdGrad);
  1922. //DEL 
  1923. //DEL 
  1924. //DEL  for(y=0; y<nHeight ; y++ )
  1925. //DEL  for(x=0 ; x<nWidth ; x++ )
  1926. //DEL  {
  1927. //DEL  if(*(pdGrad+y*nWidth+x)>50)
  1928. //DEL  *( lpImage+y*nSaveWidth+x )=0;
  1929. //DEL  else
  1930. //DEL  *( lpImage+y*nSaveWidth+x )=255;
  1931. //DEL  }
  1932. //DEL 
  1933. //DEL   //释放内存空间
  1934. //DEL  delete []pdGrad;
  1935. //DEL  pdGrad=NULL;
  1936. //DEL 
  1937. //DEL  // 恢复光标形状
  1938. //DEL  EndWaitCursor(); 
  1939. //DEL 
  1940. //DEL  // 设置脏标记
  1941. //DEL  pDoc->SetModifiedFlag(TRUE);
  1942. //DEL 
  1943. //DEL  // 更新视图
  1944. //DEL  pDoc->UpdateAllViews(NULL);
  1945. //DEL 
  1946. //DEL }
  1947. /*************************************************************************
  1948. *
  1949. * 函数名称:
  1950. *   OnEdgeLaplace()
  1951. *
  1952. * 输入参数:
  1953. *   无
  1954. *
  1955. * 返回值:
  1956. *   无
  1957. *
  1958. * 说明:
  1959. *   实现并行边界分割-拉普拉斯算子
  1960. *
  1961. ************************************************************************
  1962. */
  1963. //DEL void CImageProcessingView::OnEdgeLaplace() 
  1964. //DEL {
  1965. //DEL  // TODO: Add your command handler code here
  1966. //DEL 
  1967. //DEL  //更改光标形状
  1968. //DEL  BeginWaitCursor(); 
  1969. //DEL 
  1970. //DEL  // 循环控制变量
  1971. //DEL  int y;
  1972. //DEL  int x;
  1973. //DEL 
  1974. //DEL  CImageProcessingDoc * pDoc = (CImageProcessingDoc *)this->GetDocument();
  1975. //DEL  CDib * pDib = pDoc->m_pDibInit;
  1976. //DEL 
  1977. //DEL  LPBITMAPINFOHEADER lpBMIH=pDib->m_lpBMIH;
  1978. //DEL 
  1979. //DEL  // 判断是否是8-bpp位图
  1980. //DEL  if (lpBMIH->biBitCount != 8)
  1981. //DEL  {
  1982. //DEL  // 提示用户
  1983. //DEL  MessageBox("目前只支持256色位图的图象分割!", "系统提示" ,
  1984. //DEL  MB_ICONINFORMATION | MB_OK);
  1985. //DEL 
  1986. //DEL  // 返回
  1987. //DEL  return;
  1988. //DEL  }
  1989. //DEL 
  1990. //DEL  // 图象的长宽大小
  1991. //DEL  CSize sizeImage = pDib->GetDimensions();
  1992. //DEL  int nWidth = sizeImage.cx ;
  1993. //DEL  int nHeight = sizeImage.cy ;
  1994. //DEL 
  1995. //DEL  // 指向梯度数据的指针
  1996. //DEL  double * pdGrad;
  1997. //DEL 
  1998. //DEL  // 按照图像的大小开辟内存空间,存储梯度计算的结果
  1999. //DEL  pdGrad=new double[nHeight*nWidth];
  2000. //DEL 
  2001. //DEL  //图像数据的指针
  2002. //DEL  LPBYTE  lpImage = pDib->m_lpImage;
  2003. //DEL 
  2004. //DEL  // 图像在计算机在存储中的实际大小
  2005. //DEL  CSize sizeImageSave = pDib->GetDibSaveDim();
  2006. //DEL 
  2007. //DEL  // 图像在内存中每一行象素占用的实际空间
  2008. //DEL  int nSaveWidth = sizeImageSave.cx;
  2009. //DEL 
  2010. //DEL  // 应用Laplace算子求梯度
  2011. //DEL  LaplacianOperator(pDib, pdGrad);
  2012. //DEL 
  2013. //DEL 
  2014. //DEL  for(y=0; y<nHeight ; y++ )
  2015. //DEL  for(x=0 ; x<nWidth ; x++ )
  2016. //DEL  {
  2017. //DEL  if(*(pdGrad+y*nWidth+x)>50)
  2018. //DEL  *( lpImage+y*nSaveWidth+x )=0;
  2019. //DEL  else
  2020. //DEL  *( lpImage+y*nSaveWidth+x )=255;
  2021. //DEL  }
  2022. //DEL 
  2023. //DEL  //释放内存空间
  2024. //DEL  delete []pdGrad;
  2025. //DEL  pdGrad=NULL;
  2026. //DEL 
  2027. //DEL  // 恢复光标形状
  2028. //DEL  EndWaitCursor(); 
  2029. //DEL 
  2030. //DEL  // 设置脏标记
  2031. //DEL  pDoc->SetModifiedFlag(TRUE);
  2032. //DEL 
  2033. //DEL  // 更新视图
  2034. //DEL  pDoc->UpdateAllViews(NULL);
  2035. //DEL 
  2036. //DEL }
  2037. /*************************************************************************
  2038. *
  2039. * 函数名称:
  2040. *   OnEdgeCanny()
  2041. *
  2042. * 输入参数:
  2043. *   无
  2044. *
  2045. * 返回值:
  2046. *   无
  2047. *
  2048. * 说明:
  2049. *   实现并行边界分割-Canny算子
  2050. *
  2051. ************************************************************************
  2052. */
  2053. void CImageProcessingView::OnEdgeCanny() 
  2054. {
  2055. // TODO: Add your command handler code here
  2056. //更改光标形状
  2057. BeginWaitCursor(); 
  2058. CImageProcessingDoc * pDoc = (CImageProcessingDoc *)this->GetDocument();
  2059. CDib * pDib = pDoc->m_pDibInit;
  2060. LPBITMAPINFOHEADER lpBMIH=pDib->m_lpBMIH;
  2061. // 判断是否是8-bpp位图
  2062. if (lpBMIH->biBitCount != 8)
  2063. {
  2064. // 提示用户
  2065. MessageBox("目前只支持256色位图的图象分割!", "系统提示" ,
  2066. MB_ICONINFORMATION | MB_OK);
  2067. // 返回
  2068. return;
  2069. }
  2070. // 循环控制变量
  2071. int y; 
  2072. int x;
  2073. CSize sizeImage = pDib->GetDimensions();
  2074. int nWidth = sizeImage.cx ;
  2075. int nHeight= sizeImage.cy ;
  2076. int nSaveWidth = pDib->GetDibSaveDim().cx;
  2077. // 开辟内存,存储图象数据
  2078. unsigned char * pUnchImage = new unsigned char[nWidth*nHeight];
  2079. for(y=0; y<nHeight; y++)
  2080. {
  2081. for(x=0; x<nWidth; x++)
  2082. {
  2083. pUnchImage[y*nWidth+x] = pDib->m_lpImage[y*nSaveWidth+x];
  2084. }
  2085. }
  2086. // canny算子计算后的结果
  2087. unsigned char * pUnchEdge = new unsigned char[nWidth*nHeight];
  2088. // 调用canny函数进行边界提取
  2089. Canny(pUnchImage, nWidth, nHeight, 0.4, 0.4, 0.79, pUnchEdge) ;
  2090. for(y=0; y<nHeight; y++)
  2091. {
  2092. for(x=0; x<nWidth; x++)
  2093. {
  2094. pDib->m_lpImage[y*nWidth+x]=(unsigned char)(255-pUnchEdge[y*nWidth+x]);
  2095. }
  2096. }
  2097. delete []pUnchImage;
  2098. pUnchImage = NULL  ;
  2099. delete []pUnchEdge ;
  2100. pUnchEdge = NULL   ;
  2101. // 恢复光标形状
  2102. EndWaitCursor(); 
  2103. // 设置脏标记
  2104. pDoc->SetModifiedFlag(TRUE);
  2105. // 更新视图
  2106. pDoc->UpdateAllViews(NULL);
  2107. }
  2108. /*************************************************************************
  2109. *
  2110. * 函数名称:
  2111. *   OnEdgeTrack()
  2112. *
  2113. * 输入参数:
  2114. *   无
  2115. *
  2116. * 返回值:
  2117. *   无
  2118. *
  2119. * 说明:
  2120. *   实现边界跟踪算法
  2121. *
  2122. ************************************************************************
  2123. */
  2124. //DEL void CImageProcessingView::OnEdgeTrack() 
  2125. //DEL {
  2126. //DEL  // TODO: Add your command handler code here
  2127. //DEL 
  2128. //DEL  //更改光标形状
  2129. //DEL  BeginWaitCursor(); 
  2130. //DEL 
  2131. //DEL  // 获得Doc类的指
  2132. //DEL  CImageProcessingDoc * pDoc = (CImageProcessingDoc *)this->GetDocument();
  2133. //DEL 
  2134. //DEL  CDib * pDib = pDoc->m_pDibInit;
  2135. //DEL 
  2136. //DEL  LPBITMAPINFOHEADER lpBMIH=pDib->m_lpBMIH;
  2137. //DEL 
  2138. //DEL  // 判断是否是8-bpp位图
  2139. //DEL  if (lpBMIH->biBitCount != 8)
  2140. //DEL  {
  2141. //DEL  // 提示用户
  2142. //DEL  MessageBox("目前只支持256色位图的图象分割!", "系统提示" ,
  2143. //DEL  MB_ICONINFORMATION | MB_OK);
  2144. //DEL 
  2145. //DEL  // 返回
  2146. //DEL  return;
  2147. //DEL  }
  2148. //DEL 
  2149. //DEL 
  2150. //DEL  // 图像在计算机在存储中的实际大小
  2151. //DEL  CSize sizeImageSave = pDib->GetDibSaveDim();
  2152. //DEL 
  2153. //DEL  // 图像在内存中每一行象素占用的实际空间
  2154. //DEL  int nSaveWidth = sizeImageSave.cx;
  2155. //DEL 
  2156. //DEL  // 遍历图象的纵坐标
  2157. //DEL  int y;
  2158. //DEL 
  2159. //DEL  // 遍历图象的横坐标
  2160. //DEL  int x;
  2161. //DEL 
  2162. //DEL  // 图象的长宽大小
  2163. //DEL  CSize sizeImage = pDib->GetDimensions();
  2164. //DEL  int nWidth = sizeImage.cx ;
  2165. //DEL  int nHeight = sizeImage.cy ;
  2166. //DEL 
  2167. //DEL 
  2168. //DEL  // 指向图像数据的指针
  2169. //DEL  LPBYTE lpImage ;
  2170. //DEL  lpImage = pDib->m_lpImage ;
  2171. //DEL 
  2172. //DEL  // 边界跟踪后的结果区域
  2173. //DEL  unsigned char * pUnEdgeTrack ;
  2174. //DEL 
  2175. //DEL  pUnEdgeTrack = new unsigned char[nWidth * nHeight] ;
  2176. //DEL 
  2177. //DEL  EdgeTrack(pDib, pUnEdgeTrack);
  2178. //DEL 
  2179. //DEL  for(y=0; y<nHeight; y++)
  2180. //DEL  {
  2181. //DEL  for(x=0; x<nWidth; x++)
  2182. //DEL  {
  2183. //DEL  lpImage[y*nSaveWidth + x] = (unsigned char) (255-pUnEdgeTrack[y*nWidth + x]);
  2184. //DEL  }
  2185. //DEL  }
  2186. //DEL 
  2187. //DEL  //释放内存
  2188. //DEL  delete pUnEdgeTrack;
  2189. //DEL  pUnEdgeTrack = NULL;
  2190. //DEL 
  2191. //DEL  // 恢复光标形状
  2192. //DEL  EndWaitCursor(); 
  2193. //DEL 
  2194. //DEL  // 设置脏标记
  2195. //DEL  pDoc->SetModifiedFlag(TRUE);
  2196. //DEL 
  2197. //DEL  // 更新视图
  2198. //DEL  pDoc->UpdateAllViews(NULL);
  2199. //DEL 
  2200. //DEL }
  2201. /*************************************************************************
  2202. *
  2203. * 函数名称:
  2204. *   OnRegionGrow()
  2205. *
  2206. * 输入参数:
  2207. *   无
  2208. *
  2209. * 返回值:
  2210. *   无
  2211. *
  2212. * 说明:
  2213. *   实现区域生长算法
  2214. *
  2215. ************************************************************************
  2216. */
  2217. //DEL void CImageProcessingView::OnRegionGrow() 
  2218. //DEL {
  2219. //DEL  // TODO: Add your command handler code here
  2220. //DEL 
  2221. //DEL  //更改光标形状
  2222. //DEL  BeginWaitCursor(); 
  2223. //DEL 
  2224. //DEL  // 获得Doc类的指
  2225. //DEL  CImageProcessingDoc * pDoc = (CImageProcessingDoc *)this->GetDocument();
  2226. //DEL 
  2227. //DEL  CDib * pDib = pDoc->m_pDibInit;
  2228. //DEL 
  2229. //DEL  LPBITMAPINFOHEADER lpBMIH=pDib->m_lpBMIH;
  2230. //DEL 
  2231. //DEL  // 判断是否是8-bpp位图
  2232. //DEL  if (lpBMIH->biBitCount != 8)
  2233. //DEL  {
  2234. //DEL  // 提示用户
  2235. //DEL  MessageBox("目前只支持256色位图的图象分割!", "系统提示" ,
  2236. //DEL  MB_ICONINFORMATION | MB_OK);
  2237. //DEL 
  2238. //DEL  // 返回
  2239. //DEL  return;
  2240. //DEL  }
  2241. //DEL 
  2242. //DEL  // 遍历图象的纵坐标
  2243. //DEL  int y;
  2244. //DEL 
  2245. //DEL  // 遍历图象的横坐标
  2246. //DEL  int x;
  2247. //DEL 
  2248. //DEL  // 图像在计算机在存储中的实际大小
  2249. //DEL  CSize sizeImageSave = pDib->GetDibSaveDim();
  2250. //DEL 
  2251. //DEL  // 图像在内存中每一行象素占用的实际空间
  2252. //DEL  int nSaveWidth = sizeImageSave.cx;
  2253. //DEL 
  2254. //DEL  // 图象的长宽大小
  2255. //DEL  CSize sizeImage = pDib->GetDimensions();
  2256. //DEL  int nWidth = sizeImage.cx ;
  2257. //DEL  int nHeight = sizeImage.cy ;
  2258. //DEL 
  2259. //DEL  // 指向图像数据的指针
  2260. //DEL  LPBYTE lpImage ;
  2261. //DEL  lpImage = pDib->m_lpImage ;
  2262. //DEL 
  2263. //DEL  unsigned char * pUnchRgRst = new unsigned char[nWidth * nHeight];
  2264. //DEL  // 初始化
  2265. //DEL  memset(pUnchRgRst, 0 , sizeof(unsigned char)*nWidth*nHeight );
  2266. //DEL 
  2267. //DEL  RegionGrow(pDib, pUnchRgRst);
  2268. //DEL 
  2269. //DEL  for(y=0; y<nHeight; y++)
  2270. //DEL  for(x=0; x<nWidth; x++)
  2271. //DEL  {
  2272. //DEL  lpImage[y*nSaveWidth + x] =(unsigned char) (255-pUnchRgRst[y*nWidth+x] );
  2273. //DEL  }
  2274. //DEL 
  2275. //DEL  // 释放内存
  2276. //DEL  delete []pUnchRgRst;
  2277. //DEL  pUnchRgRst = NULL  ;
  2278. //DEL 
  2279. //DEL  // 恢复光标形状
  2280. //DEL  EndWaitCursor(); 
  2281. //DEL 
  2282. //DEL  // 设置脏标记
  2283. //DEL  pDoc->SetModifiedFlag(TRUE);
  2284. //DEL 
  2285. //DEL  // 更新视图
  2286. //DEL  pDoc->UpdateAllViews(NULL);
  2287. //DEL }
  2288. /*************************************************************************
  2289.  *
  2290.  * 函数名称:
  2291.  *   OnMotionBackground()
  2292.  *
  2293.  * 输入参数:
  2294.  *   无
  2295.  * 
  2296.  * 返回值:
  2297.  *   无
  2298.  *
  2299.  * 说明:
  2300.  *   该函数根据运动图象提取其中的静止背景。其中运动图象要求为bmp文件,并按
  2301.  *顺序排列。
  2302.  *
  2303.  *************************************************************************
  2304.  */
  2305. //DEL void CImageProcessingView::OnMotionBackground() 
  2306. //DEL {
  2307. //DEL  // 提取背景成功标志
  2308. //DEL  BOOL bFlag;
  2309. //DEL 
  2310. //DEL  // 获取文档指针
  2311. //DEL  CImageProcessingDoc* pDoc;
  2312. //DEL  pDoc = GetDocument();
  2313. //DEL 
  2314. //DEL  // 获得当前打开文件的文件路径名
  2315. //DEL  CString strPathName;
  2316. //DEL  strPathName = pDoc->GetPathName();
  2317. //DEL 
  2318. //DEL  // 序列的总帧数
  2319. //DEL  int nTotalFrameNum = 20;
  2320. //DEL 
  2321. //DEL  // 图象的宽度
  2322. //DEL  int nImageWidth;
  2323. //DEL  nImageWidth = pDoc->m_pDibInit->m_lpBMIH->biWidth;
  2324. //DEL 
  2325. //DEL  // 图象的高度
  2326. //DEL  int nImageHeight;
  2327. //DEL  nImageHeight = pDoc->m_pDibInit->m_lpBMIH->biHeight;
  2328. //DEL 
  2329. //DEL  // 图象的静止背景
  2330. //DEL  unsigned char* pUnchBackGround;
  2331. //DEL  pUnchBackGround = new unsigned char[nImageWidth*nImageHeight];
  2332. //DEL 
  2333. //DEL  // 更改光标形状
  2334. //DEL  BeginWaitCursor();
  2335. //DEL 
  2336. //DEL  // 调用GetBackground函数提取静止背景
  2337. //DEL  bFlag = GetBackground(strPathName, nTotalFrameNum, nImageWidth,nImageHeight, pUnchBackGround);
  2338. //DEL  if(bFlag == FALSE){
  2339. //DEL  return;
  2340. //DEL  }
  2341. //DEL 
  2342. //DEL  // 将背景设置为当前显示图象
  2343. //DEL  LPBYTE lpTemp;
  2344. //DEL  lpTemp = pDoc->m_pDibInit->m_lpImage;
  2345. //DEL 
  2346. //DEL  // 将数据拷贝到图象中
  2347. //DEL  memcpy(lpTemp, (LPBYTE)pUnchBackGround, nImageWidth*nImageHeight);
  2348. //DEL 
  2349. //DEL  // 恢复光标形状
  2350. //DEL  EndWaitCursor(); 
  2351. //DEL 
  2352. //DEL  // 释放已分配内存
  2353. //DEL  delete[]pUnchBackGround;
  2354. //DEL  pUnchBackGround = NULL;
  2355. //DEL 
  2356. //DEL  // 设置脏标记
  2357. //DEL  pDoc->SetModifiedFlag(TRUE);
  2358. //DEL 
  2359. //DEL  // 更新视图
  2360. //DEL  pDoc->UpdateAllViews(NULL);
  2361. //DEL }
  2362. /*************************************************************************
  2363.  *
  2364.  * 函数名称:
  2365.  *   OnRecogMatch()
  2366.  *
  2367.  * 输入参数:
  2368.  *   无
  2369.  * 
  2370.  * 返回值:
  2371.  *   无
  2372.  *
  2373.  * 说明:
  2374.  *   根据图象模板,在待匹配的图象中找到匹配的位置
  2375.  *
  2376.  *************************************************************************
  2377.  */
  2378. //DEL void CImageProcessingView::OnRecogMatch() 
  2379. //DEL {
  2380. //DEL  CImageProcessingDoc* pDoc;
  2381. //DEL  pDoc = GetDocument();
  2382. //DEL 
  2383. //DEL  // 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的水平镜像,其它的可以类推)
  2384. //DEL  if(pDoc->m_pDibInit->m_nColorTableEntries != 256)
  2385. //DEL  {
  2386. //DEL  // 提示用户
  2387. //DEL  MessageBox("目前只支持256色位图的图象配准!", "系统提示" , 
  2388. //DEL  MB_ICONINFORMATION | MB_OK);
  2389. //DEL 
  2390. //DEL  // 返回
  2391. //DEL  return;
  2392. //DEL  }
  2393. //DEL 
  2394. //DEL  // 打开图象识别对话框
  2395. //DEL  CDlgRecMatch* pDlg = new CDlgRecMatch(NULL, pDoc);
  2396. //DEL  pDlg->DoModal();
  2397. //DEL 
  2398. //DEL  delete pDlg;
  2399. //DEL }
  2400. //DEL void CImageProcessingView::OnDegenerationInverse() 
  2401. //DEL {
  2402. //DEL  // 图象的模糊
  2403. //DEL 
  2404. //DEL  // 更改光标形状
  2405. //DEL  BeginWaitCursor();
  2406. //DEL 
  2407. //DEL  // 获取文档
  2408. //DEL  CImageProcessingDoc* pDoc = GetDocument();
  2409. //DEL 
  2410. //DEL  //  获得图象CDib类的指针
  2411. //DEL  CDib * pDib = pDoc->m_pDibInit;
  2412. //DEL 
  2413. //DEL  // 获得图象的头文件信息
  2414. //DEL  LPBITMAPINFOHEADER lpBMIH=pDib->m_lpBMIH;
  2415. //DEL 
  2416. //DEL  // 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的图象模糊)
  2417. //DEL  if (lpBMIH->biBitCount != 8)
  2418. //DEL  {
  2419. //DEL  // 提示用户
  2420. //DEL  MessageBox("目前只支持256色位图的图象模糊!", "系统提示" ,
  2421. //DEL  MB_ICONINFORMATION | MB_OK);
  2422. //DEL 
  2423. //DEL  // 返回
  2424. //DEL  return;
  2425. //DEL  }
  2426. //DEL 
  2427. //DEL  ::DIBNoRestriction(pDib);
  2428. //DEL 
  2429. //DEL  // 设置脏标记
  2430. //DEL  pDoc->SetModifiedFlag(TRUE);
  2431. //DEL 
  2432. //DEL  // 更新视图
  2433. //DEL  pDoc->UpdateAllViews(NULL);
  2434. //DEL 
  2435. //DEL     // 恢复光标
  2436. //DEL  EndWaitCursor();
  2437. //DEL 
  2438. //DEL }
  2439. //DEL void CImageProcessingView::OnRestoreInverse() 
  2440. //DEL {
  2441. //DEL  // 图象的逆滤波
  2442. //DEL 
  2443. //DEL  // 更改光标形状
  2444. //DEL  BeginWaitCursor();
  2445. //DEL 
  2446. //DEL  // 获取文档
  2447. //DEL  CImageProcessingDoc* pDoc = GetDocument();
  2448. //DEL 
  2449. //DEL  //  获得图象CDib类的指针
  2450. //DEL  CDib * pDib = pDoc->m_pDibInit;
  2451. //DEL 
  2452. //DEL  // 获得图象的头文件信息
  2453. //DEL  LPBITMAPINFOHEADER lpBMIH=pDib->m_lpBMIH;
  2454. //DEL 
  2455. //DEL  // 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的逆滤波)
  2456. //DEL  if (lpBMIH->biBitCount != 8)
  2457. //DEL  {
  2458. //DEL  // 提示用户
  2459. //DEL  MessageBox("目前只支持256色位图的逆滤波!", "系统提示" ,
  2460. //DEL  MB_ICONINFORMATION | MB_OK);
  2461. //DEL 
  2462. //DEL  // 返回
  2463. //DEL  return;
  2464. //DEL  }
  2465. //DEL 
  2466. //DEL  ::DIBInverseFilter(pDib);
  2467. //DEL 
  2468. //DEL  // 设置脏标记
  2469. //DEL  pDoc->SetModifiedFlag(TRUE);
  2470. //DEL 
  2471. //DEL  // 更新视图
  2472. //DEL  pDoc->UpdateAllViews(NULL);
  2473. //DEL 
  2474. //DEL     // 恢复光标
  2475. //DEL  EndWaitCursor();
  2476. //DEL 
  2477. //DEL }
  2478. //DEL void CImageProcessingView::OnDegenerationMotion() 
  2479. //DEL {
  2480. //DEL  // 图象的运动模糊
  2481. //DEL 
  2482. //DEL  // 更改光标形状
  2483. //DEL  BeginWaitCursor();
  2484. //DEL 
  2485. //DEL  // 获取文档
  2486. //DEL  CImageProcessingDoc* pDoc = GetDocument();
  2487. //DEL 
  2488. //DEL  //  获得图象CDib类的指针
  2489. //DEL  CDib * pDib = pDoc->m_pDibInit;
  2490. //DEL 
  2491. //DEL  // 获得图象的头文件信息
  2492. //DEL  LPBITMAPINFOHEADER lpBMIH=pDib->m_lpBMIH;
  2493. //DEL 
  2494. //DEL  // 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的运动模糊)
  2495. //DEL  if (lpBMIH->biBitCount != 8)
  2496. //DEL  {
  2497. //DEL  // 提示用户
  2498. //DEL  MessageBox("目前只支持256色位图的运动模糊!", "系统提示" ,
  2499. //DEL  MB_ICONINFORMATION | MB_OK);
  2500. //DEL 
  2501. //DEL  // 返回
  2502. //DEL  return;
  2503. //DEL  }
  2504. //DEL 
  2505. //DEL  ::DIBMotionDegeneration(pDib);
  2506. //DEL 
  2507. //DEL  // 设置脏标记
  2508. //DEL  pDoc->SetModifiedFlag(TRUE);
  2509. //DEL 
  2510. //DEL  // 更新视图
  2511. //DEL  pDoc->UpdateAllViews(NULL);
  2512. //DEL 
  2513. //DEL     // 恢复光标
  2514. //DEL  EndWaitCursor();
  2515. //DEL 
  2516. //DEL }
  2517. //DEL void CImageProcessingView::OnRestoreMotion() 
  2518. //DEL {
  2519. //DEL  // 运动模糊图象复原
  2520. //DEL 
  2521. //DEL  // 更改光标形状
  2522. //DEL  BeginWaitCursor();
  2523. //DEL 
  2524. //DEL  // 获取文档
  2525. //DEL  CImageProcessingDoc* pDoc = GetDocument();
  2526. //DEL 
  2527. //DEL  //  获得图象CDib类的指针
  2528. //DEL  CDib * pDib = pDoc->m_pDibInit;
  2529. //DEL 
  2530. //DEL  // 获得图象的头文件信息
  2531. //DEL  LPBITMAPINFOHEADER lpBMIH=pDib->m_lpBMIH;
  2532. //DEL 
  2533. //DEL  // 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的运动模糊复原)
  2534. //DEL  if (lpBMIH->biBitCount != 8)
  2535. //DEL  {
  2536. //DEL  // 提示用户
  2537. //DEL  MessageBox("目前只支持256色位图的运动模糊复原!", "系统提示" ,
  2538. //DEL  MB_ICONINFORMATION | MB_OK);
  2539. //DEL 
  2540. //DEL  // 返回
  2541. //DEL  return;
  2542. //DEL  }
  2543. //DEL 
  2544. //DEL  ::DIBMotionRestore(pDib);
  2545. //DEL 
  2546. //DEL  // 设置脏标记
  2547. //DEL  pDoc->SetModifiedFlag(TRUE);
  2548. //DEL 
  2549. //DEL  // 更新视图
  2550. //DEL  pDoc->UpdateAllViews(NULL);
  2551. //DEL 
  2552. //DEL     // 恢复光标
  2553. //DEL  EndWaitCursor();
  2554. //DEL 
  2555. //DEL }
  2556. //DEL void CImageProcessingView::OnDEGENERATIONWinner() 
  2557. //DEL {
  2558. //DEL  // 图象的加噪模糊
  2559. //DEL 
  2560. //DEL  // 更改光标形状
  2561. //DEL  BeginWaitCursor();
  2562. //DEL 
  2563. //DEL  // 获取文档
  2564. //DEL  CImageProcessingDoc* pDoc = GetDocument();
  2565. //DEL 
  2566. //DEL  //  获得图象CDib类的指针
  2567. //DEL  CDib * pDib = pDoc->m_pDibInit;
  2568. //DEL 
  2569. //DEL  // 获得图象的头文件信息
  2570. //DEL  LPBITMAPINFOHEADER lpBMIH=pDib->m_lpBMIH;
  2571. //DEL 
  2572. //DEL  // 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的加噪模糊)
  2573. //DEL  if (lpBMIH->biBitCount != 8)
  2574. //DEL  {
  2575. //DEL  // 提示用户
  2576. //DEL  MessageBox("目前只支持256色位图的加噪模糊!", "系统提示" ,
  2577. //DEL  MB_ICONINFORMATION | MB_OK);
  2578. //DEL 
  2579. //DEL  // 返回
  2580. //DEL  return;
  2581. //DEL  }
  2582. //DEL 
  2583. //DEL  ::DIBNoiseDegeneration(pDib);
  2584. //DEL 
  2585. //DEL  // 设置脏标记
  2586. //DEL  pDoc->SetModifiedFlag(TRUE);
  2587. //DEL 
  2588. //DEL  // 更新视图
  2589. //DEL  pDoc->UpdateAllViews(NULL);
  2590. //DEL 
  2591. //DEL     // 恢复光标
  2592. //DEL  EndWaitCursor();
  2593. //DEL 
  2594. //DEL }
  2595. //DEL void CImageProcessingView::OnRestoreWinner() 
  2596. //DEL {
  2597. //DEL  // 图象的维纳滤波
  2598. //DEL 
  2599. //DEL  // 更改光标形状
  2600. //DEL  BeginWaitCursor();
  2601. //DEL 
  2602. //DEL  // 获取文档
  2603. //DEL  CImageProcessingDoc* pDoc = GetDocument();
  2604. //DEL 
  2605. //DEL  //  获得图象CDib类的指针
  2606. //DEL  CDib * pDib = pDoc->m_pDibInit;
  2607. //DEL 
  2608. //DEL  // 获得图象的头文件信息
  2609. //DEL  LPBITMAPINFOHEADER lpBMIH=pDib->m_lpBMIH;
  2610. //DEL 
  2611. //DEL  // 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的维纳滤波)
  2612. //DEL  if (lpBMIH->biBitCount != 8)
  2613. //DEL  {
  2614. //DEL  // 提示用户
  2615. //DEL  MessageBox("目前只支持256色位图的维纳滤波!", "系统提示" ,
  2616. //DEL  MB_ICONINFORMATION | MB_OK);
  2617. //DEL 
  2618. //DEL  // 返回
  2619. //DEL  return;
  2620. //DEL  }
  2621. //DEL 
  2622. //DEL  ::DIBWinnerFilter(pDib);
  2623. //DEL 
  2624. //DEL  // 设置脏标记
  2625. //DEL  pDoc->SetModifiedFlag(TRUE);
  2626. //DEL 
  2627. //DEL  // 更新视图
  2628. //DEL  pDoc->UpdateAllViews(NULL);
  2629. //DEL 
  2630. //DEL     // 恢复光标
  2631. //DEL  EndWaitCursor();
  2632. //DEL 
  2633. //DEL }
  2634. //DEL void CImageProcessingView::OnMoment() 
  2635. //DEL {
  2636. //DEL  // 图象的pq阶力矩
  2637. //DEL 
  2638. //DEL  // 更改光标形状
  2639. //DEL  BeginWaitCursor();
  2640. //DEL 
  2641. //DEL  // 获取文档
  2642. //DEL  CImageProcessingDoc* pDoc = GetDocument();
  2643. //DEL 
  2644. //DEL  //  获得图象CDib类的指针
  2645. //DEL  CDib * pDib = pDoc->m_pDibInit;
  2646. //DEL 
  2647. //DEL  // 获得图象的头文件信息
  2648. //DEL  LPBITMAPINFOHEADER lpBMIH=pDib->m_lpBMIH;
  2649. //DEL 
  2650. //DEL  // 判断是否是8-bpp位图
  2651. //DEL  if (lpBMIH->biBitCount != 8)
  2652. //DEL  {
  2653. //DEL  // 提示用户
  2654. //DEL  MessageBox("目前只支持256色位图!", "系统提示" ,
  2655. //DEL  MB_ICONINFORMATION | MB_OK);
  2656. //DEL 
  2657. //DEL  // 返回
  2658. //DEL  return;
  2659. //DEL  }
  2660. //DEL 
  2661. //DEL  ::DIBMOMENT(pDib);
  2662. //DEL 
  2663. //DEL     // 恢复光标
  2664. //DEL  EndWaitCursor();
  2665. //DEL 
  2666. //DEL }
  2667. //DEL void CImageProcessingView::OnBarycentermoment() 
  2668. //DEL {
  2669. //DEL  // 图象的重心矩
  2670. //DEL 
  2671. //DEL  // 更改光标形状
  2672. //DEL  BeginWaitCursor();
  2673. //DEL 
  2674. //DEL  // 获取文档
  2675. //DEL  CImageProcessingDoc* pDoc = GetDocument();
  2676. //DEL 
  2677. //DEL  //  获得图象CDib类的指针
  2678. //DEL  CDib * pDib = pDoc->m_pDibInit;
  2679. //DEL 
  2680. //DEL  // 获得图象的头文件信息
  2681. //DEL  LPBITMAPINFOHEADER lpBMIH=pDib->m_lpBMIH;
  2682. //DEL 
  2683. //DEL  // 判断是否是8-bpp位图
  2684. //DEL  if (lpBMIH->biBitCount != 8)
  2685. //DEL  {
  2686. //DEL  // 提示用户
  2687. //DEL  MessageBox("目前只支持256色位图!", "系统提示" ,
  2688. //DEL  MB_ICONINFORMATION | MB_OK);
  2689. //DEL 
  2690. //DEL  // 返回
  2691. //DEL  return;
  2692. //DEL  }
  2693. //DEL 
  2694. //DEL  ::DIBBARYCENTERMOMENT(pDib);
  2695. //DEL 
  2696. //DEL  // 恢复光标
  2697. //DEL  EndWaitCursor();
  2698. //DEL 
  2699. //DEL }
  2700. //DEL void CImageProcessingView::OnAnalysisHolenum() 
  2701. //DEL {
  2702. //DEL  // 消去二值图象中小于阈值面积的区域
  2703. //DEL 
  2704. //DEL  // 更改光标形状
  2705. //DEL  BeginWaitCursor();
  2706. //DEL 
  2707. //DEL  // 获取文档
  2708. //DEL  CImageProcessingDoc* pDoc = GetDocument();
  2709. //DEL 
  2710. //DEL  //  获得图象CDib类的指针
  2711. //DEL  CDib * pDib = pDoc->m_pDibInit;
  2712. //DEL 
  2713. //DEL  // 获得图象的头文件信息
  2714. //DEL  LPBITMAPINFOHEADER lpBMIH=pDib->m_lpBMIH;
  2715. //DEL 
  2716. //DEL  // 判断是否是8-bpp位图
  2717. //DEL  if (lpBMIH->biBitCount != 8)
  2718. //DEL  {
  2719. //DEL  // 提示用户
  2720. //DEL  MessageBox("目前只支持256色位图的图象!", "系统提示" ,
  2721. //DEL  MB_ICONINFORMATION | MB_OK);
  2722. //DEL 
  2723. //DEL  // 返回
  2724. //DEL  return;
  2725. //DEL  }
  2726. //DEL 
  2727. //DEL  ::DIBHOLENUMBER(pDib);
  2728. //DEL 
  2729. //DEL  // 设置脏标记
  2730. //DEL  pDoc->SetModifiedFlag(TRUE);
  2731. //DEL 
  2732. //DEL  // 更新视图
  2733. //DEL  pDoc->UpdateAllViews(NULL);
  2734. //DEL 
  2735. //DEL     // 恢复光标
  2736. //DEL  EndWaitCursor();
  2737. //DEL 
  2738. //DEL }
  2739. //DEL void CImageProcessingView::OnStreetFramework() 
  2740. //DEL {
  2741. //DEL  // 街区距离骨架提取
  2742. //DEL 
  2743. //DEL  // 更改光标形状
  2744. //DEL  BeginWaitCursor();
  2745. //DEL 
  2746. //DEL  // 获取文档
  2747. //DEL  CImageProcessingDoc* pDoc = GetDocument();
  2748. //DEL 
  2749. //DEL  //  获得图象CDib类的指针
  2750. //DEL  CDib * pDib = pDoc->m_pDibInit;
  2751. //DEL 
  2752. //DEL  // 获得图象的头文件信息
  2753. //DEL  LPBITMAPINFOHEADER lpBMIH=pDib->m_lpBMIH;
  2754. //DEL 
  2755. //DEL  // 判断是否是8-bpp位图
  2756. //DEL  if (lpBMIH->biBitCount != 8)
  2757. //DEL  {
  2758. //DEL  // 提示用户
  2759. //DEL  MessageBox("目前只支持256色位图!", "系统提示" ,
  2760. //DEL  MB_ICONINFORMATION | MB_OK);
  2761. //DEL 
  2762. //DEL  // 返回
  2763. //DEL  return;
  2764. //DEL  }
  2765. //DEL 
  2766. //DEL  ::DIBFREAMEWORK(pDib);
  2767. //DEL 
  2768. //DEL  // 设置脏标记
  2769. //DEL  pDoc->SetModifiedFlag(TRUE);
  2770. //DEL 
  2771. //DEL  // 更新视图
  2772. //DEL  pDoc->UpdateAllViews(NULL);
  2773. //DEL 
  2774. //DEL     // 恢复光标
  2775. //DEL  EndWaitCursor();
  2776. //DEL 
  2777. //DEL }
  2778. //DEL void CImageProcessingView::OnStreetTransform() 
  2779. //DEL {
  2780. //DEL  // 二值图象的街区距离变换
  2781. //DEL 
  2782. //DEL  // 更改光标形状
  2783. //DEL  BeginWaitCursor();
  2784. //DEL 
  2785. //DEL  // 获取文档
  2786. //DEL  CImageProcessingDoc* pDoc = GetDocument();
  2787. //DEL 
  2788. //DEL  //  获得图象CDib类的指针
  2789. //DEL  CDib * pDib = pDoc->m_pDibInit;
  2790. //DEL 
  2791. //DEL  // 获得图象的头文件信息
  2792. //DEL  LPBITMAPINFOHEADER lpBMIH=pDib->m_lpBMIH;
  2793. //DEL 
  2794. //DEL  // 判断是否是8-bpp位图(
  2795. //DEL  if (lpBMIH->biBitCount != 8)
  2796. //DEL  {
  2797. //DEL  // 提示用户
  2798. //DEL  MessageBox("目前只支持256色位图!", "系统提示" ,
  2799. //DEL  MB_ICONINFORMATION | MB_OK);
  2800. //DEL 
  2801. //DEL  // 返回
  2802. //DEL  return;
  2803. //DEL  }
  2804. //DEL 
  2805. //DEL  ::DIBSTREETDIS(pDib);
  2806. //DEL 
  2807. //DEL  // 设置脏标记
  2808. //DEL  pDoc->SetModifiedFlag(TRUE);
  2809. //DEL 
  2810. //DEL  // 更新视图
  2811. //DEL  pDoc->UpdateAllViews(NULL);
  2812. //DEL 
  2813. //DEL     // 恢复光标
  2814. //DEL  EndWaitCursor();
  2815. //DEL 
  2816. //DEL }
  2817. //DEL void CImageProcessingView::OnFrameRestore() 
  2818. //DEL {
  2819. //DEL  // 街区距离骨架复原
  2820. //DEL 
  2821. //DEL  // 更改光标形状
  2822. //DEL  BeginWaitCursor();
  2823. //DEL 
  2824. //DEL  // 获取文档
  2825. //DEL  CImageProcessingDoc* pDoc = GetDocument();
  2826. //DEL 
  2827. //DEL  //  获得图象CDib类的指针
  2828. //DEL  CDib * pDib = pDoc->m_pDibInit;
  2829. //DEL 
  2830. //DEL  // 获得图象的头文件信息
  2831. //DEL  LPBITMAPINFOHEADER lpBMIH=pDib->m_lpBMIH;
  2832. //DEL 
  2833. //DEL  // 判断是否是8-bpp位图
  2834. //DEL  if (lpBMIH->biBitCount != 8)
  2835. //DEL  {
  2836. //DEL  // 提示用户
  2837. //DEL  MessageBox("目前只支持256色位图!", "系统提示" ,
  2838. //DEL  MB_ICONINFORMATION | MB_OK);
  2839. //DEL 
  2840. //DEL  // 返回
  2841. //DEL  return;
  2842. //DEL  }
  2843. //DEL 
  2844. //DEL  ::DIBCHESSBOARDDISRESTORE(pDib);
  2845. //DEL 
  2846. //DEL  // 设置脏标记
  2847. //DEL  pDoc->SetModifiedFlag(TRUE);
  2848. //DEL 
  2849. //DEL  // 更新视图
  2850. //DEL  pDoc->UpdateAllViews(NULL);
  2851. //DEL 
  2852. //DEL     // 恢复光标
  2853. //DEL  EndWaitCursor();
  2854. //DEL 
  2855. //DEL }
  2856. //DEL void CImageProcessingView::OnTrace() 
  2857. //DEL {
  2858. //DEL  // 二值图象边界跟踪
  2859. //DEL 
  2860. //DEL  // 更改光标形状
  2861. //DEL  BeginWaitCursor();
  2862. //DEL 
  2863. //DEL  // 获取文档
  2864. //DEL  CImageProcessingDoc* pDoc = GetDocument();
  2865. //DEL 
  2866. //DEL  //  获得图象CDib类的指针
  2867. //DEL  CDib * pDib = pDoc->m_pDibInit;
  2868. //DEL 
  2869. //DEL  // 获得图象的头文件信息
  2870. //DEL  LPBITMAPINFOHEADER lpBMIH=pDib->m_lpBMIH;
  2871. //DEL 
  2872. //DEL  // 判断是否是8-bpp位图
  2873. //DEL  if (lpBMIH->biBitCount != 8)
  2874. //DEL  {
  2875. //DEL  // 提示用户
  2876. //DEL  MessageBox("目前只支持256色位图!", "系统提示" ,
  2877. //DEL  MB_ICONINFORMATION | MB_OK);
  2878. //DEL 
  2879. //DEL  // 返回
  2880. //DEL  return;
  2881. //DEL  }
  2882. //DEL 
  2883. //DEL  ::DIBTrace(pDib);
  2884. //DEL 
  2885. //DEL  // 设置脏标记
  2886. //DEL  pDoc->SetModifiedFlag(TRUE);
  2887. //DEL 
  2888. //DEL  // 更新视图
  2889. //DEL  pDoc->UpdateAllViews(NULL);
  2890. //DEL 
  2891. //DEL     // 恢复光标
  2892. //DEL  EndWaitCursor();
  2893. //DEL 
  2894. //DEL 
  2895. //DEL }
  2896. //DEL void CImageProcessingView::OnOutline() 
  2897. //DEL {
  2898. //DEL  // 二值图象边界提取
  2899. //DEL 
  2900. //DEL  // 更改光标形状
  2901. //DEL  BeginWaitCursor();
  2902. //DEL 
  2903. //DEL  // 获取文档
  2904. //DEL  CImageProcessingDoc* pDoc = GetDocument();
  2905. //DEL 
  2906. //DEL  //  获得图象CDib类的指针
  2907. //DEL  CDib * pDib = pDoc->m_pDibInit;
  2908. //DEL 
  2909. //DEL  // 获得图象的头文件信息
  2910. //DEL  LPBITMAPINFOHEADER lpBMIH=pDib->m_lpBMIH;
  2911. //DEL 
  2912. //DEL  // 判断是否是8-bpp位图
  2913. //DEL  if (lpBMIH->biBitCount != 8)
  2914. //DEL  {
  2915. //DEL  // 提示用户
  2916. //DEL  MessageBox("目前只支持256色位图!", "系统提示" ,
  2917. //DEL  MB_ICONINFORMATION | MB_OK);
  2918. //DEL 
  2919. //DEL  // 返回
  2920. //DEL  return;
  2921. //DEL  }
  2922. //DEL 
  2923. //DEL  ::DIBOUTLINE(pDib);
  2924. //DEL 
  2925. //DEL  // 设置脏标记
  2926. //DEL  pDoc->SetModifiedFlag(TRUE);
  2927. //DEL 
  2928. //DEL  // 更新视图
  2929. //DEL  pDoc->UpdateAllViews(NULL);
  2930. //DEL 
  2931. //DEL     // 恢复光标
  2932. //DEL  EndWaitCursor();
  2933. //DEL 
  2934. //DEL }
  2935. //DEL void CImageProcessingView::OnViewBayer() 
  2936. //DEL {
  2937. //DEL  // Bayer抖动法显示图象
  2938. //DEL 
  2939. //DEL  // 更改光标形状
  2940. //DEL  BeginWaitCursor();
  2941. //DEL 
  2942. //DEL  // 获取文档
  2943. //DEL  CImageProcessingDoc* pDoc = GetDocument();
  2944. //DEL 
  2945. //DEL  //  获得图象CDib类的指针
  2946. //DEL  CDib * pDib = pDoc->m_pDibInit;
  2947. //DEL 
  2948. //DEL  // 获得图象的头文件信息
  2949. //DEL  LPBITMAPINFOHEADER lpBMIH=pDib->m_lpBMIH;
  2950. //DEL 
  2951. //DEL  // 判断是否是8-bpp位图
  2952. //DEL  if (lpBMIH->biBitCount != 8)
  2953. //DEL  {
  2954. //DEL  // 提示用户
  2955. //DEL  MessageBox("目前只支持256色位图!", "系统提示" ,
  2956. //DEL  MB_ICONINFORMATION | MB_OK);
  2957. //DEL 
  2958. //DEL  // 返回
  2959. //DEL  return;
  2960. //DEL  }
  2961. //DEL 
  2962. //DEL  ::LimbPatternBayer(pDib);
  2963. //DEL 
  2964. //DEL  // 设置脏标记
  2965. //DEL  pDoc->SetModifiedFlag(TRUE);
  2966. //DEL 
  2967. //DEL  // 更新视图
  2968. //DEL  pDoc->UpdateAllViews(NULL);
  2969. //DEL 
  2970. //DEL     // 恢复光标
  2971. //DEL  EndWaitCursor();
  2972. //DEL 
  2973. //DEL }
  2974. //DEL void CImageProcessingView::OnVIEWFloydSteinberg() 
  2975. //DEL {
  2976. //DEL  // Floyd-Steinberg抖动法显示图象
  2977. //DEL 
  2978. //DEL  // 更改光标形状
  2979. //DEL  BeginWaitCursor();
  2980. //DEL 
  2981. //DEL  // 获取文档
  2982. //DEL  CImageProcessingDoc* pDoc = GetDocument();
  2983. //DEL 
  2984. //DEL  //  获得图象CDib类的指针
  2985. //DEL  CDib * pDib = pDoc->m_pDibInit;
  2986. //DEL 
  2987. //DEL  // 获得图象的头文件信息
  2988. //DEL  LPBITMAPINFOHEADER lpBMIH=pDib->m_lpBMIH;
  2989. //DEL 
  2990. //DEL  // 判断是否是8-bpp位图
  2991. //DEL  if (lpBMIH->biBitCount != 8)
  2992. //DEL  {
  2993. //DEL  // 提示用户
  2994. //DEL  MessageBox("目前只支持256色位图!", "系统提示" ,
  2995. //DEL  MB_ICONINFORMATION | MB_OK);
  2996. //DEL 
  2997. //DEL  // 返回
  2998. //DEL  return;
  2999. //DEL  }
  3000. //DEL 
  3001. //DEL  ::DitherFloydSteinberg(pDib);
  3002. //DEL 
  3003. //DEL  // 设置脏标记
  3004. //DEL  pDoc->SetModifiedFlag(TRUE);
  3005. //DEL 
  3006. //DEL  // 更新视图
  3007. //DEL  pDoc->UpdateAllViews(NULL);
  3008. //DEL 
  3009. //DEL     // 恢复光标
  3010. //DEL  EndWaitCursor();
  3011. //DEL 
  3012. //DEL }
  3013. //DEL void CImageProcessingView::OnCodingHuffman() 
  3014. //DEL {
  3015. //DEL  // 哈夫曼编码表
  3016. //DEL 
  3017. //DEL  // 获取文档
  3018. //DEL  CImageProcessingDoc * pDoc = GetDocument();
  3019. //DEL 
  3020. //DEL  // 指向源图象象素的指针
  3021. //DEL  unsigned char * lpSrc;
  3022. //DEL 
  3023. //DEL  // 图象的高度和宽度
  3024. //DEL  LONG lHeight;
  3025. //DEL  LONG lWidth;
  3026. //DEL 
  3027. //DEL  // 图象每行的字节数
  3028. //DEL  LONG lLineBytes;
  3029. //DEL 
  3030. //DEL  // 图象象素总数
  3031. //DEL  LONG lCountSum;
  3032. //DEL 
  3033. //DEL  // 循环变量
  3034. //DEL  LONG i;
  3035. //DEL  LONG j;
  3036. //DEL 
  3037. //DEL  // 数组指针用来保存各个灰度值出现概率
  3038. //DEL  double * dProba;
  3039. //DEL 
  3040. //DEL  // 当前图象颜色数目
  3041. //DEL  int nColorNum;
  3042. //DEL 
  3043. //DEL  //  获得图象CDib类的指针
  3044. //DEL  CDib * pDib = pDoc->m_pDibInit;
  3045. //DEL 
  3046. //DEL  //图象数据的指针
  3047. //DEL  LPBYTE  lpDIBBits = pDib->m_lpImage;
  3048. //DEL 
  3049. //DEL  // 头文件信息
  3050. //DEL  LPBITMAPINFOHEADER lpBMIH=pDib->m_lpBMIH;
  3051. //DEL 
  3052. //DEL  // 判断是否是8-bpp位图(只处理8-bpp位图的霍夫曼编码)
  3053. //DEL  if (lpBMIH->biBitCount != 8)
  3054. //DEL  {
  3055. //DEL  // 提示用户
  3056. //DEL  MessageBox("目前只支持256色位图的霍夫曼编码!", "系统提示" ,
  3057. //DEL  MB_ICONINFORMATION | MB_OK);
  3058. //DEL 
  3059. //DEL  // 返回
  3060. //DEL  return;
  3061. //DEL  }
  3062. //DEL 
  3063. //DEL  // 更改光标形状
  3064. //DEL  BeginWaitCursor();
  3065. //DEL 
  3066. //DEL  /********************************************************************
  3067. //DEL     开始计算各个灰度级出现的概率
  3068. //DEL 
  3069. //DEL     如果需要对指定的序列进行哈夫曼编码,
  3070. //DEL     只要将这一步改成给各个灰度级概率赋值即可
  3071. //DEL  **********************************************************************
  3072. //DEL  */
  3073. //DEL 
  3074. //DEL  //  由头文件信息得到图象的比特数,从而得到颜色信息
  3075. //DEL  nColorNum = (int)pow(2,lpBMIH->biBitCount);
  3076. //DEL 
  3077. //DEL  // 分配内存
  3078. //DEL  dProba = new double[nColorNum];
  3079. //DEL 
  3080. //DEL  //得到图象的宽度和高度
  3081. //DEL  CSize   SizeDim;
  3082. //DEL  SizeDim = pDib->GetDimensions();
  3083. //DEL  lWidth = SizeDim.cx;
  3084. //DEL  lHeight = SizeDim.cy;
  3085. //DEL 
  3086. //DEL  // 计算图象象素总数
  3087. //DEL  lCountSum = lHeight * lWidth;
  3088. //DEL 
  3089. //DEL  //得到实际的Dib图象存储大小
  3090. //DEL  CSize   SizeRealDim;
  3091. //DEL  SizeRealDim = pDib->GetDibSaveDim();
  3092. //DEL 
  3093. //DEL  // 计算图象每行的字节数
  3094. //DEL  lLineBytes = SizeRealDim.cx;
  3095. //DEL 
  3096. //DEL  // 赋零值
  3097. //DEL  for (i = 0; i < nColorNum; i ++)
  3098. //DEL  {
  3099. //DEL  dProba[i] = 0.0;
  3100. //DEL  }
  3101. //DEL 
  3102. //DEL  // 计算各个灰度值的计数
  3103. //DEL  for (i = 0; i < lHeight; i ++)
  3104. //DEL  {
  3105. //DEL  for (j = 0; j < lWidth; j ++)
  3106. //DEL  {
  3107. //DEL  // 指向图象指针
  3108. //DEL  lpSrc = lpDIBBits + lLineBytes * i + j;
  3109. //DEL 
  3110. //DEL  // 计数加1
  3111. //DEL  dProba[*(lpSrc)] = dProba[*(lpSrc)] + 1;
  3112. //DEL  }
  3113. //DEL  }
  3114. //DEL 
  3115. //DEL 
  3116. //DEL  // 计算各个灰度值出现的概率
  3117. //DEL  for (i = 0; i < nColorNum; i ++)
  3118. //DEL  {
  3119. //DEL  dProba[i] = dProba[i] / (FLOAT)lCountSum;
  3120. //DEL  }
  3121. //DEL 
  3122. //DEL  /***************************************************
  3123. //DEL   构建霍夫曼编码的码表
  3124. //DEL   并用对话框显示霍夫曼码表
  3125. //DEL  ****************************************************/
  3126. //DEL 
  3127. //DEL  // 创建对话框
  3128. //DEL  CDlgHuffman dlgCoding;
  3129. //DEL 
  3130. //DEL  // 初始化变量值
  3131. //DEL  dlgCoding.dProba = dProba;
  3132. //DEL  dlgCoding.nColorNum = nColorNum;
  3133. //DEL 
  3134. //DEL  // 显示对话框
  3135. //DEL  dlgCoding.DoModal();
  3136. //DEL 
  3137. //DEL  // 恢复光标
  3138. //DEL  EndWaitCursor();
  3139. //DEL 
  3140. //DEL }
  3141. //DEL void CImageProcessingView::OnCodingShanfino() 
  3142. //DEL {
  3143. //DEL  // 香农-弗诺编码表
  3144. //DEL 
  3145. //DEL  // 获取文档
  3146. //DEL  CImageProcessingDoc * pDoc = GetDocument();
  3147. //DEL 
  3148. //DEL  // 指向源图象象素的指针
  3149. //DEL  unsigned char * lpSrc;
  3150. //DEL 
  3151. //DEL  // 图象的高度
  3152. //DEL  LONG lHeight;
  3153. //DEL  LONG lWidth;
  3154. //DEL 
  3155. //DEL  // 图象每行的字节数
  3156. //DEL  LONG lLineBytes;
  3157. //DEL 
  3158. //DEL  // 获取当前DIB颜色数目
  3159. //DEL  int nColorNum;
  3160. //DEL 
  3161. //DEL  // 图象象素总数
  3162. //DEL  LONG lCountSum;
  3163. //DEL 
  3164. //DEL  // 循环变量
  3165. //DEL  LONG i;
  3166. //DEL  LONG j;
  3167. //DEL 
  3168. //DEL  // 保存各个灰度值出现概率的数组指针
  3169. //DEL  double * dProba;
  3170. //DEL 
  3171. //DEL  //  获得图象CDib类的指针
  3172. //DEL  CDib * pDib = pDoc->m_pDibInit;
  3173. //DEL 
  3174. //DEL  //图象数据的指针
  3175. //DEL  LPBYTE  lpDIBBits = pDib->m_lpImage;
  3176. //DEL 
  3177. //DEL  // 头文件信息
  3178. //DEL  LPBITMAPINFOHEADER lpBMIH=pDib->m_lpBMIH;
  3179. //DEL 
  3180. //DEL  // 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的香农-费诺编码)
  3181. //DEL  if (lpBMIH->biBitCount != 8)
  3182. //DEL  {
  3183. //DEL  // 提示用户
  3184. //DEL  MessageBox("目前只支持256色位图的香农-费诺编码!", "系统提示" ,
  3185. //DEL  MB_ICONINFORMATION | MB_OK);
  3186. //DEL 
  3187. //DEL  // 返回
  3188. //DEL  return;
  3189. //DEL  }
  3190. //DEL 
  3191. //DEL  // 更改光标形状
  3192. //DEL  BeginWaitCursor();
  3193. //DEL 
  3194. //DEL  /******************************************************************************
  3195. //DEL  // 开始计算各个灰度级出现的概率
  3196. //DEL  //
  3197. //DEL  // 如果需要对指定的序列进行香农-弗诺编码,
  3198. //DEL  //只要将这一步改成给各个灰度级概率赋值即可
  3199. //DEL  *****************************************************************************
  3200. //DEL  */
  3201. //DEL  //  灰度值总数的计算
  3202. //DEL  nColorNum = (int)pow(2,lpBMIH->biBitCount);
  3203. //DEL 
  3204. //DEL  // 分配内存
  3205. //DEL  dProba = new double[nColorNum];
  3206. //DEL 
  3207. //DEL  //得到图象的宽度和高度
  3208. //DEL  CSize   SizeDim;
  3209. //DEL  SizeDim = pDib->GetDimensions();
  3210. //DEL  lWidth = SizeDim.cx;
  3211. //DEL  lHeight = SizeDim.cy;
  3212. //DEL 
  3213. //DEL  // 计算图象象素总数
  3214. //DEL  lCountSum = lHeight * lWidth;
  3215. //DEL 
  3216. //DEL  //得到实际的Dib图象存储大小
  3217. //DEL  CSize   SizeRealDim;
  3218. //DEL  SizeRealDim = pDib->GetDibSaveDim();
  3219. //DEL 
  3220. //DEL  // 计算图象每行的字节数
  3221. //DEL  lLineBytes = SizeRealDim.cx;
  3222. //DEL 
  3223. //DEL  // 计算图象象素总数
  3224. //DEL  lCountSum = lHeight * lWidth;
  3225. //DEL 
  3226. //DEL  // 重置计数为0
  3227. //DEL  for (i = 0; i < nColorNum; i ++)
  3228. //DEL  {
  3229. //DEL  dProba[i] = 0.0;
  3230. //DEL  }
  3231. //DEL 
  3232. //DEL  // 计算各个灰度值的计数(对于非256色位图,此处给数组dProba赋值方法将不同)
  3233. //DEL  for (i = 0; i < lHeight; i ++)
  3234. //DEL  {
  3235. //DEL  for (j = 0; j < lWidth; j ++)
  3236. //DEL  {
  3237. //DEL  // 指向图象指针
  3238. //DEL  lpSrc = lpDIBBits + lLineBytes * i + j;
  3239. //DEL 
  3240. //DEL  // 计数加1
  3241. //DEL  dProba[*(lpSrc)] = dProba[*(lpSrc)]+ 1;
  3242. //DEL  }
  3243. //DEL  }
  3244. //DEL 
  3245. //DEL 
  3246. //DEL  // 计算各个灰度值出现的概率
  3247. //DEL  for (i = 0; i < nColorNum; i ++)
  3248. //DEL  {
  3249. //DEL  dProba[i] /= (double)lCountSum;
  3250. //DEL  }
  3251. //DEL 
  3252. //DEL  /***************************************************
  3253. //DEL   构建香农-费诺编码的码表
  3254. //DEL   并用对话框显示香农-费诺码表
  3255. //DEL  ****************************************************/
  3256. //DEL 
  3257. //DEL  // 创建对话框
  3258. //DEL  CDlgShannon dlgPara;
  3259. //DEL 
  3260. //DEL  // 初始化变量值
  3261. //DEL  dlgPara.m_dProba = dProba;
  3262. //DEL  dlgPara.m_nColorNum = nColorNum;
  3263. //DEL 
  3264. //DEL  // 显示对话框
  3265. //DEL  dlgPara.DoModal();
  3266. //DEL 
  3267. //DEL  //释放内存
  3268. //DEL  delete dProba;
  3269. //DEL 
  3270. //DEL  // 恢复光标
  3271. //DEL  EndWaitCursor();
  3272. //DEL }
  3273. //DEL void CImageProcessingView::OnCodingArith() 
  3274. //DEL {
  3275. //DEL  CDlgArith dlgCoding;
  3276. //DEL 
  3277. //DEL  // 显示对话框
  3278. //DEL  dlgCoding.DoModal();
  3279. //DEL 
  3280. //DEL }
  3281. //DEL void CImageProcessingView::OnCodingBitplane() 
  3282. //DEL {
  3283. //DEL  // 创建对话框
  3284. //DEL  CDlgBitPlane dlgCoding;
  3285. //DEL 
  3286. //DEL  // 显示对话框
  3287. //DEL  dlgCoding.DoModal();
  3288. //DEL 
  3289. //DEL  BYTE bBitNum = dlgCoding.m_BItNumber;
  3290. //DEL 
  3291. //DEL  // 获取文档
  3292. //DEL  CImageProcessingDoc * pDoc = GetDocument();
  3293. //DEL 
  3294. //DEL  //  获得图象CDib类的指针
  3295. //DEL  CDib * pDib = pDoc->m_pDibInit;
  3296. //DEL 
  3297. //DEL  // 头文件信息
  3298. //DEL  LPBITMAPINFOHEADER lpBMIH=pDib->m_lpBMIH;
  3299. //DEL 
  3300. //DEL  // 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的位平面分解)
  3301. //DEL  if (lpBMIH->biBitCount != 8)
  3302. //DEL  {
  3303. //DEL  // 提示用户
  3304. //DEL  MessageBox("目前只支持256色位图的位平面分解!", "系统提示" ,
  3305. //DEL  MB_ICONINFORMATION | MB_OK);
  3306. //DEL 
  3307. //DEL  // 返回
  3308. //DEL  return;
  3309. //DEL  }
  3310. //DEL  DIBBITPLANE(pDib,bBitNum);
  3311. //DEL 
  3312. //DEL  // 设置脏标记
  3313. //DEL  pDoc->SetModifiedFlag(TRUE);
  3314. //DEL 
  3315. //DEL  // 更新视图
  3316. //DEL  pDoc->UpdateAllViews(NULL);
  3317. //DEL 
  3318. //DEL }
  3319. //DEL void CImageProcessingView::OnCodingWriteimg() 
  3320. //DEL {
  3321. //DEL  // 对当前图象进行DPCM编码(存为IMG格式文件)
  3322. //DEL 
  3323. //DEL  // 获取文档
  3324. //DEL  CImageProcessingDoc * pDoc = GetDocument();
  3325. //DEL 
  3326. //DEL  //  获得图象CDib类的指针
  3327. //DEL  CDib * pDib = pDoc->m_pDibInit;
  3328. //DEL 
  3329. //DEL  //图象数据的指针
  3330. //DEL  LPBYTE  lpDIBBits = pDib->m_lpImage;
  3331. //DEL 
  3332. //DEL  // 头文件信息
  3333. //DEL  LPBITMAPINFOHEADER lpBMIH=pDib->m_lpBMIH;
  3334. //DEL 
  3335. //DEL  // 判断是否是8-bpp位图(处理8-bpp位图的DPCM编码)
  3336. //DEL  if (lpBMIH->biBitCount != 8)
  3337. //DEL  {
  3338. //DEL  // 提示用户
  3339. //DEL  MessageBox("目前只支持256色位图的DPCM编码!", "系统提示" ,
  3340. //DEL  MB_ICONINFORMATION | MB_OK);
  3341. //DEL 
  3342. //DEL  // 返回
  3343. //DEL  return;
  3344. //DEL  }
  3345. //DEL 
  3346. //DEL  // 更改光标形状
  3347. //DEL  BeginWaitCursor();
  3348. //DEL 
  3349. //DEL  // 文件保存路径
  3350. //DEL  CString strFilePath;
  3351. //DEL 
  3352. //DEL  // 获取原始文件名
  3353. //DEL  strFilePath = pDoc->GetPathName();
  3354. //DEL 
  3355. //DEL  // 更改后缀为IMG
  3356. //DEL  if (strFilePath.Right(4).CompareNoCase(".BMP") == 0)
  3357. //DEL  {
  3358. //DEL  strFilePath = strFilePath.Left(strFilePath.GetLength()-3) + "IMG";
  3359. //DEL  }
  3360. //DEL  else
  3361. //DEL  {
  3362. //DEL  strFilePath += ".IMG";
  3363. //DEL  }
  3364. //DEL 
  3365. //DEL  // 创建SaveAs对话框
  3366. //DEL  CFileDialog dlg(FALSE, "IMG", strFilePath, 
  3367. //DEL  OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, 
  3368. //DEL              "IMG图象文件 (*.IMG) | *.IMG|所有文件 (*.*) | *.*||", NULL);
  3369. //DEL 
  3370. //DEL  // 提示用户选择保存的路径
  3371. //DEL  if (dlg.DoModal() != IDOK)
  3372. //DEL  {
  3373. //DEL  // 恢复光标
  3374. //DEL  EndWaitCursor();
  3375. //DEL 
  3376. //DEL  return;
  3377. //DEL  }
  3378. //DEL 
  3379. //DEL  // 获取用户指定的文件路径
  3380. //DEL  strFilePath = dlg.GetPathName();
  3381. //DEL 
  3382. //DEL  // CFile和CFileException对象
  3383. //DEL  CFile file;
  3384. //DEL  CFileException fe;
  3385. //DEL 
  3386. //DEL  // 尝试创建指定的IMG文件
  3387. //DEL  if (!file.Open(strFilePath, CFile::modeCreate |
  3388. //DEL    CFile::modeReadWrite | CFile::shareExclusive, &fe))
  3389. //DEL  {
  3390. //DEL  MessageBox("打开指定IMG文件时失败!", "系统提示" , 
  3391. //DEL  MB_ICONINFORMATION | MB_OK);
  3392. //DEL 
  3393. //DEL  return;
  3394. //DEL  }
  3395. //DEL 
  3396. //DEL  // 调用WRITE2IMG()函数将当前的DIB保存为IMG文件
  3397. //DEL  if (::WRITE2IMG(pDib, file))
  3398. //DEL  {
  3399. //DEL  MessageBox("成功保存为IMG文件!", "系统提示" , 
  3400. //DEL  MB_ICONINFORMATION | MB_OK);
  3401. //DEL  }
  3402. //DEL  else
  3403. //DEL  {
  3404. //DEL  MessageBox("保存为IMG文件失败!", "系统提示" , 
  3405. //DEL  MB_ICONINFORMATION | MB_OK);
  3406. //DEL  }
  3407. //DEL 
  3408. //DEL  // 恢复光标
  3409. //DEL  EndWaitCursor();
  3410. //DEL 
  3411. //DEL }
  3412. //DEL void CImageProcessingView::OnCodingLoadimg() 
  3413. //DEL {
  3414. //DEL  // 读入IMG文件
  3415. //DEL 
  3416. //DEL  // 获取文档
  3417. //DEL  CImageProcessingDoc * pDoc = GetDocument();
  3418. //DEL 
  3419. //DEL  //  获得图象CDib类的指针
  3420. //DEL  CDib * pDib = pDoc->m_pDibInit;
  3421. //DEL 
  3422. //DEL  // 文件路径
  3423. //DEL  CString strFilePath;
  3424. //DEL 
  3425. //DEL  // 创建Open对话框
  3426. //DEL  CFileDialog dlg(TRUE, "PCX", NULL,
  3427. //DEL  OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, 
  3428. //DEL  "IMG图象文件 (*.PCX) | *.IMG|所有文件 (*.*) | *.*||", NULL);
  3429. //DEL 
  3430. //DEL  // 提示用户选择保存的路径
  3431. //DEL  if (dlg.DoModal() != IDOK)
  3432. //DEL  {
  3433. //DEL  // 返回
  3434. //DEL  return;
  3435. //DEL  }
  3436. //DEL 
  3437. //DEL  // 获取用户指定的文件路径
  3438. //DEL  strFilePath = dlg.GetPathName();
  3439. //DEL 
  3440. //DEL  // CFile和CFileException对象
  3441. //DEL  CFile file;
  3442. //DEL  CFileException fe;
  3443. //DEL 
  3444. //DEL  // 尝试打开指定的PCX文件
  3445. //DEL  if (!file.Open(strFilePath, CFile::modeRead | CFile::shareDenyWrite, &fe))
  3446. //DEL  {
  3447. //DEL  // 提示用户
  3448. //DEL  MessageBox("打开指定PCX文件时失败!", "系统提示" , 
  3449. //DEL  MB_ICONINFORMATION | MB_OK);
  3450. //DEL 
  3451. //DEL  // 返回
  3452. //DEL  return;
  3453. //DEL  }
  3454. //DEL 
  3455. //DEL  // 更改光标形状
  3456. //DEL  BeginWaitCursor();
  3457. //DEL 
  3458. //DEL  // 调用LOADIMG()函数读取指定的IMG文件
  3459. //DEL  BOOL Succ = LOADIMG(pDib, file);
  3460. //DEL 
  3461. //DEL  if (Succ == TRUE)
  3462. //DEL  {
  3463. //DEL  // 提示用户
  3464. //DEL  MessageBox("成功读取IMG文件!", "系统提示" , 
  3465. //DEL  MB_ICONINFORMATION | MB_OK);
  3466. //DEL 
  3467. //DEL  }
  3468. //DEL  else
  3469. //DEL  {
  3470. //DEL  // 提示用户
  3471. //DEL  MessageBox("读取IMG文件失败!", "系统提示" , 
  3472. //DEL  MB_ICONINFORMATION | MB_OK);
  3473. //DEL  }
  3474. //DEL 
  3475. //DEL  // 更新视图
  3476. //DEL  pDoc->UpdateAllViews(NULL);
  3477. //DEL 
  3478. //DEL  // 恢复光标
  3479. //DEL  EndWaitCursor();
  3480. //DEL 
  3481. //DEL }