DynSplitView2.cpp
上传用户:hnhlzg
上传日期:2013-10-19
资源大小:289k
文件大小:8k
源码类别:

数学计算

开发平台:

Visual C++

  1. // DynSplitView2.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "DSplit.h"
  5. #include "DynSplitView2.h"
  6. #include "PinYuLuBoDib.h"
  7. #include "Dialog1.h"
  8. #include "Dialog2.h"
  9. #include "Dialog3.h"
  10. #ifdef _DEBUG
  11. #define new DEBUG_NEW
  12. #undef THIS_FILE
  13. static char THIS_FILE[] = __FILE__;
  14. #endif
  15. /////////////////////////////////////////////////////////////////////////////
  16. // CDynSplitView2
  17. IMPLEMENT_DYNCREATE(CDynSplitView2, CView)
  18. CDynSplitView2::CDynSplitView2()
  19. {state2=0;
  20. }
  21. //8位图像初始化
  22. void CDynSplitView2::clearmem()
  23. {
  24. CDSplitDoc* pDoc = GetDocument();
  25. ASSERT_VALID(pDoc);
  26. pDoc ->statedoc=0;
  27.     state2=1;
  28. CDibNew1=&pDoc->CDibNew;
  29.     CDib1=&pDoc->CDib;
  30. long int  size=CDib1->GetHeight()*CDib1->GetWidth();
  31. memcpy(CDibNew1->m_pData,CDib1->m_pData,size);
  32. //memset(CDibNew1->m_pData,0,CDibNew1->GetWidth()*CDibNew1->GetHeight());
  33. }
  34. CPalette * CDynSplitView2::CreateBitmapPalette(PinYuLuBoDib * pBitmap)
  35. {
  36. struct
  37. {
  38. WORD Version;
  39. WORD NumberOfEntries;
  40. PALETTEENTRY aEntries[256];
  41. } palette = { 0x300, 256 };
  42. RGBQUAD buf[256];
  43. for (int k=0;k<256;k++)
  44. {
  45. buf[k].rgbBlue=k;
  46. buf[k].rgbGreen=k;
  47.             buf[k].rgbRed=k;
  48. buf[k].rgbReserved=0;
  49. }
  50. UINT numberOfColors = 256;
  51. for(UINT x=0; x<numberOfColors; ++x)
  52. {
  53. palette.aEntries[x].peRed =buf[x].rgbBlue;
  54.      
  55. palette.aEntries[x].peGreen =buf[x].rgbGreen;
  56. palette.aEntries[x].peBlue =buf[x].rgbRed;
  57. palette.aEntries[x].peFlags = buf[x].rgbReserved;
  58. }
  59. hPalette.CreatePalette((LPLOGPALETTE)&palette);
  60. //CPalette hPale=&hPalette;
  61. return &hPalette;
  62. }
  63. CDynSplitView2::~CDynSplitView2()
  64. {
  65. }
  66. CDSplitDoc* CDynSplitView2::GetDocument() // non-debug version is inline
  67. {
  68. ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDSplitDoc)));
  69. return (CDSplitDoc*)m_pDocument;
  70. }
  71. BEGIN_MESSAGE_MAP(CDynSplitView2, CView)
  72. //{{AFX_MSG_MAP(CDynSplitView2)
  73. ON_WM_ERASEBKGND()
  74. ON_COMMAND(ID_FILESAVE, OnFilesave)
  75. ON_COMMAND(ID_BUTTERWORTH_L, OnButterworthL)
  76. ON_COMMAND(ID_BUTTERWORTH_H, OnButterworthH)
  77. ON_COMMAND(ID_QuickForuier, OnQuickForuier)
  78. ON_COMMAND(ID_BOX, OnBox)
  79. ON_COMMAND(ID_PERFECTL, OnPerfectl)
  80. ON_COMMAND(ID_PERFECTH, OnPerfecth)
  81. ON_COMMAND(ID_TL, OnTl)
  82. ON_COMMAND(ID_Th, OnTh)
  83. ON_COMMAND(ID_ZL, OnZl)
  84. ON_COMMAND(ID_ZH, OnZh)
  85. ON_COMMAND(ID_FirstQuickForuier, OnFirstQuickForuier)
  86. //}}AFX_MSG_MAP
  87. END_MESSAGE_MAP()
  88. /////////////////////////////////////////////////////////////////////////////
  89. // CDynSplitView2 drawing
  90. void CDynSplitView2::OnDraw(CDC* pDC)
  91. {
  92. CDSplitDoc* pDoc = GetDocument();
  93. ASSERT_VALID(pDoc);
  94. if(!pDoc ->statedoc&&state2==1)
  95. {  
  96.   LPBITMAPINFO pBitmapInfo = CDibNew1->GetInfo();
  97.   RGBQUAD* m_pRGB=CDibNew1->GetRGB();
  98.  BYTE* pBitmapData;
  99. if(CDibNew1->byBitCount==8) 
  100.   pBitmapData = CDibNew1->GetData();
  101.         else
  102.  {
  103. pBitmapData = CDibNew1->GetData2();
  104.       pBitmapInfo->bmiHeader.biBitCount=8;
  105.  }
  106.         int bitmapHeight = CDibNew1->GetHeight();
  107.         int bitmapWidth = CDibNew1->GetWidth();
  108. pBitmapInfo->bmiHeader.biSizeImage=bitmapHeight*bitmapWidth;
  109.     unsigned char *pBit;
  110. char buf[256][3];
  111. for (int k=0;k<256;k++)
  112. for(int kk=0;kk<3;kk++)
  113. {
  114. buf[k][kk]=k;
  115. }
  116. LPBITMAPINFO p_bihed;
  117. p_bihed=(LPBITMAPINFO)malloc(sizeof(BITMAPINFO)+256*3+1024);
  118. memcpy(p_bihed,pBitmapInfo,sizeof(BITMAPINFO));
  119. pBit=(unsigned char*)p_bihed+sizeof(BITMAPINFO);
  120. m_pRGB = (RGBQUAD*)pBit;
  121. memcpy(pBit,buf,256*3);
  122. p_bihed->bmiHeader.biBitCount=8;
  123. p_bihed->bmiHeader.biSizeImage=bitmapHeight*bitmapWidth;
  124. pBitmapInfo=p_bihed;
  125. // if (CDibNew1->GetRGB()) // Has a color table
  126. {
  127. CPalette * hPalette=CreateBitmapPalette(CDibNew1);
  128.             CPalette * hOldPalette =
  129.                 pDC->SelectPalette(hPalette, true);
  130.             pDC->RealizePalette();
  131. ::StretchDIBits(pDC->GetSafeHdc(),0, 0, bitmapWidth, bitmapHeight,
  132.                0, 0, bitmapWidth, bitmapHeight,
  133. pBitmapData, pBitmapInfo,
  134. DIB_RGB_COLORS, SRCCOPY);
  135.             pDC->SelectPalette(hOldPalette, true);
  136.             ::DeleteObject(hPalette);
  137. }
  138. if(CDibNew1->byBitCount==24) 
  139. pBitmapInfo->bmiHeader.biBitCount=24;
  140. }
  141. }
  142. /////////////////////////////////////////////////////////////////////////////
  143. // CDynSplitView2 diagnostics
  144. #ifdef _DEBUG
  145. void CDynSplitView2::AssertValid() const
  146. {
  147. CView::AssertValid();
  148. }
  149. void CDynSplitView2::Dump(CDumpContext& dc) const
  150. {
  151. CView::Dump(dc);
  152. }
  153. #endif //_DEBUG
  154. /////////////////////////////////////////////////////////////////////////////
  155. // CDynSplitView2 message handlers
  156. BOOL CDynSplitView2::OnEraseBkgnd(CDC* pDC) 
  157. {
  158. CRect rect;
  159. GetClientRect(&rect);
  160. pDC->FillSolidRect(&rect,::GetSysColor(COLOR_WINDOW));
  161. return TRUE;
  162. }
  163. void CDynSplitView2::OnFilesave() 
  164. {
  165. // TODO: Add your command handler code here
  166. CFileDialog dlg(FALSE,_T("BMP"),_T("*.BMP"),OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,_T("位图文件(*.BMP)|*.BMP|"));
  167.     if(IDOK==dlg.DoModal())
  168. CString  filename;
  169.     filename.Format ("%s",dlg.GetPathName() );    
  170.     CDibNew1->SaveFile(filename);
  171. state2=1;
  172. Invalidate();
  173. }
  174. //低通布特波斯滤波消息函数
  175. void CDynSplitView2::OnButterworthL() 
  176. {
  177. // TODO: Add your command handler code here
  178. clearmem();
  179. if(CDibNew1->byBitCount==24) 
  180.  clearmem2();
  181.     CDialog1 dlg;
  182. if(IDOK==dlg.DoModal())
  183.     {CDibNew1->BWFilterL(dlg.m_x,dlg.m_y,dlg.m_n);
  184. Invalidate();
  185. }
  186. }
  187. //高通布特波斯滤波消息函数
  188. void CDynSplitView2::OnButterworthH() 
  189. {
  190. // TODO: Add your command handler code here
  191.       clearmem();
  192. if(CDibNew1->byBitCount==24) 
  193.  clearmem2();
  194.     CDialog1 dlg;
  195. if(IDOK==dlg.DoModal())
  196.     {CDibNew1->BWFilterH(dlg.m_x,dlg.m_y,dlg.m_n);
  197. Invalidate();
  198. }
  199. }
  200. //快速傅立叶消息函数
  201. void CDynSplitView2::OnQuickForuier() 
  202. {
  203. // TODO: Add your command handler code here
  204.        clearmem();
  205. if(CDibNew1->byBitCount==24) 
  206.  clearmem2();
  207. CDibNew1->QuickFourier();
  208. Invalidate();
  209. }
  210. void CDynSplitView2::OnBox() 
  211. {
  212. // TODO: Add your command handler code here
  213.   AfxMessageBox("打开的图像宽高尺寸要符合如下数据2、4、8、16、32、64、128、256");
  214. }
  215. //理想低通滤波消息函数
  216. void CDynSplitView2::OnPerfectl() 
  217. {
  218. // TODO: Add your command handler code here
  219.   clearmem();
  220. if(CDibNew1->byBitCount==24) 
  221.  clearmem2();
  222.     CDialog2 dlg;
  223. if(IDOK==dlg.DoModal())
  224.     {CDibNew1->PerfectFilterL(dlg.m_x,dlg.m_y);
  225. Invalidate();
  226. }
  227. }
  228. //理想高通滤波消息函数
  229. void CDynSplitView2::OnPerfecth() 
  230. {
  231. // TODO: Add your command handler code here
  232.     clearmem();
  233. if(CDibNew1->byBitCount==24) 
  234.  clearmem2();
  235.     CDialog2 dlg;
  236. if(IDOK==dlg.DoModal())
  237.     {CDibNew1->PerfectFilterH(dlg.m_x,dlg.m_y);
  238. Invalidate();
  239. }
  240. }
  241. //梯形低通滤波消息函数
  242. void CDynSplitView2::OnTl() 
  243. {
  244. // TODO: Add your command handler code here
  245.    clearmem();
  246. if(CDibNew1->byBitCount==24) 
  247.  clearmem2();
  248.     Dialog3 dlg;
  249. if(IDOK==dlg.DoModal())
  250.     {CDibNew1->TLFilter(dlg.m_x,dlg.m_y,dlg.m_x1,dlg.m_y1);
  251. Invalidate();
  252. }
  253. }
  254. //梯形高通滤波消息函数
  255. void CDynSplitView2::OnTh() 
  256. {
  257. // TODO: Add your command handler code here
  258.    clearmem();
  259. if(CDibNew1->byBitCount==24) 
  260.  clearmem2();
  261.     Dialog3 dlg;
  262. if(IDOK==dlg.DoModal())
  263.     {CDibNew1->THFilter(dlg.m_x,dlg.m_y,dlg.m_x1,dlg.m_y1);
  264. Invalidate();
  265. }
  266. }
  267. //指数低通滤波消息函数
  268. void CDynSplitView2::OnZl() 
  269. {
  270. // TODO: Add your command handler code here
  271.    clearmem();
  272. if(CDibNew1->byBitCount==24) 
  273.  clearmem2();
  274.     CDialog1 dlg;
  275. if(IDOK==dlg.DoModal())
  276.     {CDibNew1->ZLFilter(dlg.m_x,dlg.m_y,dlg.m_n);
  277. Invalidate();
  278. }
  279. }
  280. //指数高通滤波消息函数
  281. void CDynSplitView2::OnZh() 
  282. {
  283. // TODO: Add your command handler code here
  284.   clearmem();
  285. if(CDibNew1->byBitCount==24) 
  286.  clearmem2();
  287.     CDialog1 dlg;
  288. if(IDOK==dlg.DoModal())
  289.     {CDibNew1->ZHFilter(dlg.m_x,dlg.m_y,dlg.m_n);
  290. Invalidate();
  291. }
  292. }
  293. //未平移的傅立叶消息函数
  294. void CDynSplitView2::OnFirstQuickForuier() 
  295. {
  296. // TODO: Add your command handler code here
  297.    
  298. clearmem();
  299. if(CDibNew1->byBitCount==24) 
  300.  clearmem2();
  301. CDibNew1->FirstQuickFourier();
  302. Invalidate();
  303. }
  304. //24位彩色图像初始化
  305. void CDynSplitView2::clearmem2()
  306. {
  307.     CDSplitDoc* pDoc = GetDocument();
  308. ASSERT_VALID(pDoc);
  309. pDoc ->statedoc=0;
  310.     state2=1;
  311. CDibNew1=&pDoc->CDibNew;
  312.     CDib1=&pDoc->CDib;
  313. long int  size=CDib1->GetHeight()*CDib1->GetWidth();
  314. memcpy(CDibNew1->m_pData1,CDib1->m_pData1,size);
  315. }