DynSplitView2.cpp
Upload User: jjlianmen
Upload Date: 2022-08-03
Package Size: 157k
Code Size: 11k
Category:

Special Effects

Development Platform:

Matlab

  1. // DynSplitView2.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "DSplit.h"
  5. #include "DynSplitView2.h"
  6. #include "JisuanProcessDib.h"
  7. #include "YuZhi.h"
  8. #include "DELSMALL.h"
  9. #ifdef _DEBUG
  10. #define new DEBUG_NEW
  11. #undef THIS_FILE
  12. static char THIS_FILE[] = __FILE__;
  13. #endif
  14. /////////////////////////////////////////////////////////////////////////////
  15. // CDynSplitView2
  16. IMPLEMENT_DYNCREATE(CDynSplitView2, CView)
  17. CDynSplitView2::CDynSplitView2()
  18. {
  19. state2=0;
  20. }
  21. void CDynSplitView2::clearmem()
  22. {
  23. CDSplitDoc* pDoc = GetDocument();
  24. ASSERT_VALID(pDoc);
  25. pDoc ->statedoc=0;
  26.     state2=1;
  27. CDibNew1=&pDoc->CDibNew;
  28.     CDib1=&pDoc->CDib;
  29.     long int  size=CDib1->GetHeight()*CDib1->GetDibWidthBytes();
  30.     memcpy(CDibNew1->m_pData,CDib1->m_pData,size);
  31. }
  32. CPalette * CDynSplitView2::CreateBitmapPalette(JisuanProcessDib * pBitmap)
  33. {
  34. struct
  35. {
  36. WORD Version;
  37. WORD NumberOfEntries;
  38. PALETTEENTRY aEntries[256];
  39. } palette = { 0x300, 256 };
  40. LPRGBQUAD pRGBTable = pBitmap->GetRGB();
  41. UINT numberOfColors = pBitmap->GetNumberOfColors();
  42. for(UINT x=0; x<numberOfColors; ++x)
  43. {
  44. palette.aEntries[x].peRed =
  45. pRGBTable[x].rgbRed;
  46. palette.aEntries[x].peGreen =
  47. pRGBTable[x].rgbGreen;
  48. palette.aEntries[x].peBlue =
  49. pRGBTable[x].rgbBlue;
  50. palette.aEntries[x].peFlags = 0;
  51. }
  52. hPalette.CreatePalette((LPLOGPALETTE)&palette);
  53. //CPalette hPale=&hPalette;
  54. return &hPalette;
  55. }
  56. CDynSplitView2::~CDynSplitView2()
  57. {
  58. }
  59. CDSplitDoc* CDynSplitView2::GetDocument() // non-debug version is inline
  60. {
  61. ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDSplitDoc)));
  62. return (CDSplitDoc*)m_pDocument;
  63. }
  64. BEGIN_MESSAGE_MAP(CDynSplitView2, CView)
  65. //{{AFX_MSG_MAP(CDynSplitView2)
  66. ON_WM_ERASEBKGND()
  67. ON_COMMAND(ID_FILESAVE, OnFilesave)
  68. ON_COMMAND(ID_AREAJISUAN, OnAreajisuan)
  69. ON_COMMAND(ID_XIAOCHUSMALL, OnXiaochusmall)
  70. ON_COMMAND(ID_FOLLOWLINE, OnFollowline)
  71. ON_COMMAND(ID_A, OnA)
  72. //}}AFX_MSG_MAP
  73. END_MESSAGE_MAP()
  74. /////////////////////////////////////////////////////////////////////////////
  75. // CDynSplitView2 drawing
  76. void CDynSplitView2::OnDraw(CDC* pDC)
  77. {
  78. CDSplitDoc* pDoc = GetDocument();
  79. ASSERT_VALID(pDoc);
  80. if(!pDoc ->statedoc&&state2==1)
  81. {
  82.       int m_scale=1;
  83.         BYTE* pBitmapData = CDibNew1->GetData();
  84.         LPBITMAPINFO pBitmapInfo = CDibNew1->GetInfo();
  85.         int bitmapHeight = CDibNew1->GetHeight();
  86.         int bitmapWidth = CDibNew1->GetWidth();
  87. int scaledWidth = (int)(bitmapWidth * m_scale);
  88. int scaledHeight = (int)(bitmapHeight * m_scale);
  89. if (CDibNew1->GetRGB()) // Has a color table
  90. {
  91. CPalette * hPalette=CreateBitmapPalette(CDibNew1);
  92.             CPalette * hOldPalette =
  93.                 pDC->SelectPalette(hPalette, true);
  94.             pDC->RealizePalette();
  95. ::StretchDIBits(pDC->GetSafeHdc(),0, 0, scaledWidth, scaledHeight,
  96.                0, 0, bitmapWidth, bitmapHeight,
  97. pBitmapData, pBitmapInfo,
  98. DIB_RGB_COLORS, SRCCOPY);
  99.             pDC->SelectPalette(hOldPalette, true);
  100.             ::DeleteObject(hPalette);
  101. }
  102. }
  103. }
  104. /////////////////////////////////////////////////////////////////////////////
  105. // CDynSplitView2 diagnostics
  106. #ifdef _DEBUG
  107. void CDynSplitView2::AssertValid() const
  108. {
  109. CView::AssertValid();
  110. }
  111. void CDynSplitView2::Dump(CDumpContext& dc) const
  112. {
  113. CView::Dump(dc);
  114. }
  115. #endif //_DEBUG
  116. /////////////////////////////////////////////////////////////////////////////
  117. // CDynSplitView2 message handlers
  118. BOOL CDynSplitView2::OnEraseBkgnd(CDC* pDC) 
  119. {
  120. CRect rect;
  121. GetClientRect(&rect);
  122. pDC->FillSolidRect(&rect,::GetSysColor(COLOR_WINDOW));
  123. return TRUE;
  124. }
  125. void CDynSplitView2::OnFilesave() 
  126. {
  127. CFileDialog dlg(FALSE,_T("BMP"),_T("*.BMP"),OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,_T("位图文件(*.BMP)|*.BMP|"));
  128.     if(IDOK==dlg.DoModal())
  129. CString  filename;
  130.     filename.Format ("%s",dlg.GetPathName() );    
  131.     CDibNew1->SaveFile(filename);
  132. state2=1;
  133. Invalidate();
  134. }
  135. //计算面积消息函数
  136. void CDynSplitView2::OnAreajisuan() 
  137. {
  138. clearmem();
  139.     
  140.     LPBYTE temp;
  141. int i,j;
  142. int wide,height;
  143. CYuZhi Dlg;
  144. Dlg.DoModal();
  145. yuzhi_gray=Dlg.m_gray;
  146. if(CDibNew1->m_pBitmapInfoHeader->biBitCount==24)
  147. {
  148.  wide=CDibNew1->GetDibWidthBytes();
  149.  height=CDibNew1->GetHeight();
  150.      temp = new BYTE[wide*height];
  151.      memset(temp, (BYTE)255, wide * height);
  152.  CDibNew1->Baoliu(temp);
  153.          CDibNew1->MakeGray();
  154. }
  155. CDibNew1->erzhihua(yuzhi_gray);///图像二值化
  156.     CDibNew1->LianTong();//标记、计算像素区
  157.     
  158. if(CDibNew1->m_pBitmapInfoHeader->biBitCount==24)
  159. {
  160. LPBYTE  lpSrc,lpDst,temp2;
  161. lpSrc=CDibNew1->GetData();
  162. lpDst=temp;
  163. temp2=lpSrc;
  164. for(j=0;j<height;j++)
  165. for(i=0;i<wide;i++)
  166. {    
  167. *lpSrc=*lpDst+*lpSrc;
  168. if(*lpSrc>255)
  169. *lpSrc=255;
  170. lpSrc++;
  171. lpDst++;
  172. }
  173. lpSrc=temp2;
  174. }
  175.     
  176. delete temp;
  177. CClientDC dc(this);   
  178. CDSplitDoc* pDoc = GetDocument();
  179. ASSERT_VALID(pDoc);
  180. if(!pDoc ->statedoc&&state2==1)
  181. {
  182.       int m_scale=1;
  183.         BYTE* pBitmapData = CDibNew1->GetData();
  184.         LPBITMAPINFO pBitmapInfo = CDibNew1->GetInfo();
  185.         int bitmapHeight = CDibNew1->GetHeight();
  186.         int bitmapWidth = CDibNew1->GetWidth();
  187. int scaledWidth = (int)(bitmapWidth * m_scale);
  188. int scaledHeight = (int)(bitmapHeight * m_scale);
  189. if (CDibNew1->GetRGB()) // Has a color table
  190. {
  191. CPalette * hPalette=CreateBitmapPalette(CDibNew1);
  192.             CPalette * hOldPalette =
  193.                 dc.SelectPalette(hPalette, true);
  194.             dc.RealizePalette();
  195. ::StretchDIBits(dc.GetSafeHdc(),0, 0, scaledWidth, scaledHeight,
  196.                0, 0, bitmapWidth, bitmapHeight,
  197. pBitmapData, pBitmapInfo,
  198. DIB_RGB_COLORS, SRCCOPY);
  199.             dc.SelectPalette(hOldPalette, true);
  200.             ::DeleteObject(hPalette);
  201. }
  202. else
  203. {
  204. ::StretchDIBits(dc.GetSafeHdc(),0, 0, scaledWidth, scaledHeight,
  205. 0, 0, bitmapWidth, bitmapHeight,
  206. pBitmapData, pBitmapInfo,
  207. DIB_RGB_COLORS, SRCCOPY);
  208. }
  209. }
  210. dc.SetTextColor(100);
  211. CString ss_Area[255];
  212. for( i=0;i<255;i++)
  213. {
  214. if(CDibNew1->pppp[i].pp_area!=0)
  215. ss_Area[i].Format("%d",CDibNew1->pppp[i].pp_area);
  216. dc.TextOut(CDibNew1->pppp[i].pp_x,CDibNew1->pppp[i].pp_y,ss_Area[i]);
  217. }
  218. }
  219. //面积消除消息函数
  220. void CDynSplitView2::OnXiaochusmall() 
  221. {
  222. clearmem();
  223. LPBYTE temp;
  224. int i,j;
  225. int wide,height;
  226. CYuZhi Dlg;
  227. Dlg.DoModal();
  228. yuzhi_gray=Dlg.m_gray;
  229. if(CDibNew1->m_pBitmapInfoHeader->biBitCount==24)
  230. {
  231.  wide=CDibNew1->GetDibWidthBytes();
  232.  height=CDibNew1->GetHeight();
  233.      temp = new BYTE[wide*height];
  234.      memset(temp, (BYTE)255, wide * height);
  235.  CDibNew1->Baoliu(temp);
  236.          CDibNew1->MakeGray();
  237. }
  238. CDibNew1->erzhihua(yuzhi_gray); //图像二值化
  239. if(CDibNew1->m_pBitmapInfoHeader->biBitCount==24)
  240. {
  241. LPBYTE  lpSrc,lpDst,temp2;
  242. lpSrc=CDibNew1->GetData();
  243. lpDst=temp;
  244. temp2=lpSrc;
  245. for(j=0;j<height;j++)
  246. for(i=0;i<wide;i++)
  247. {    
  248. *lpSrc=*lpDst+*lpSrc;
  249. if(*lpSrc>255)
  250. *lpSrc=255;
  251. lpSrc++;
  252. lpDst++;
  253. }
  254. lpSrc=temp2;
  255. }
  256. int m_value;
  257. DELSMALL  Dlg1;
  258. Dlg1.DoModal();
  259. m_value=Dlg1.m_delsmall;
  260. CDibNew1->ClearSMALL(m_value); //消除小区域  
  261.   Invalidate();
  262. }
  263. //计算周长消息函数
  264. void CDynSplitView2::OnFollowline() 
  265. {
  266. clearmem();
  267. LPBYTE temp;
  268. int i,j;
  269. int wide,height;
  270. CYuZhi Dlg;
  271. Dlg.DoModal();
  272. yuzhi_gray=Dlg.m_gray;
  273. if(CDibNew1->m_pBitmapInfoHeader->biBitCount==24)
  274. {
  275.  wide=CDibNew1->GetDibWidthBytes();
  276.  height=CDibNew1->GetHeight();
  277.      temp = new BYTE[wide*height];
  278.      memset(temp, (BYTE)255, wide * height);
  279.  CDibNew1->Baoliu(temp);
  280.  CDibNew1->MakeGray();
  281. }
  282. CDibNew1->erzhihua(yuzhi_gray);//图像二值化
  283. CDibNew1->xiaochugulidianHEI();//消除孤立点黑像素
  284. CDibNew1->Borderline();//边界跟踪
  285. CClientDC dc(this);   
  286. CDSplitDoc* pDoc = GetDocument();
  287. ASSERT_VALID(pDoc);
  288. if(!pDoc ->statedoc&&state2==1)
  289. {
  290. int m_scale=1;
  291.         BYTE* pBitmapData = CDibNew1->GetData();
  292.         LPBITMAPINFO pBitmapInfo = CDibNew1->GetInfo();
  293.         int bitmapHeight = CDibNew1->GetHeight();
  294.         int bitmapWidth = CDibNew1->GetWidth();
  295. int scaledWidth = (int)(bitmapWidth * m_scale);
  296. int scaledHeight = (int)(bitmapHeight * m_scale);
  297. if (CDibNew1->GetRGB()) // Has a color table
  298. {
  299. CPalette * hPalette=CreateBitmapPalette(CDibNew1);
  300.             CPalette * hOldPalette =
  301.                 dc.SelectPalette(hPalette, true);
  302.             dc.RealizePalette();
  303. ::StretchDIBits(dc.GetSafeHdc(),0, 0, scaledWidth, scaledHeight,
  304. 0, 0, bitmapWidth, bitmapHeight,
  305. pBitmapData, pBitmapInfo,
  306. DIB_RGB_COLORS, SRCCOPY);
  307.             dc.SelectPalette(hOldPalette, true);
  308.             ::DeleteObject(hPalette);
  309. }
  310. else
  311. {
  312. ::StretchDIBits(dc.GetSafeHdc(),0, 0, scaledWidth, scaledHeight,
  313. 0, 0, bitmapWidth, bitmapHeight,
  314. pBitmapData, pBitmapInfo,
  315. DIB_RGB_COLORS, SRCCOPY);
  316. }
  317. }
  318. dc.SetTextColor(100);
  319. CString ss_line[255];
  320. for( i=0;i<255;i++)
  321. {
  322. if(CDibNew1->pppp[i].pp_line!=0)
  323. ss_line[i].Format("%d",CDibNew1->pppp[i].pp_line);
  324. dc.TextOut(CDibNew1->pppp[i].pp_x,CDibNew1->pppp[i].pp_y,ss_line[i]);
  325. }
  326. }
  327. //显示标记消息函数
  328. void CDynSplitView2::OnA() 
  329. {
  330. clearmem();
  331. LPBYTE temp;
  332. int i,j;
  333. int wide,height;
  334. CYuZhi Dlg;
  335. Dlg.DoModal();
  336. yuzhi_gray=Dlg.m_gray;
  337. if(CDibNew1->m_pBitmapInfoHeader->biBitCount==24)
  338. {
  339.          wide=CDibNew1->GetDibWidthBytes();
  340.  height=CDibNew1->GetHeight();
  341.      temp = new BYTE[wide*height];
  342.      memset(temp, (BYTE)255, wide * height);
  343.  CDibNew1->Baoliu(temp);
  344.      CDibNew1->MakeGray();
  345. }
  346. CDibNew1->erzhihua(yuzhi_gray);///图像二值化
  347.     CDibNew1->LianTong();//标记、计算像素区
  348.     if(CDibNew1->m_pBitmapInfoHeader->biBitCount==24)
  349. {
  350. LPBYTE  lpSrc,lpDst,temp2;
  351. lpSrc=CDibNew1->GetData();
  352. lpDst=temp;
  353. temp2=lpSrc;
  354. for(j=0;j<height;j++)
  355. for(i=0;i<wide;i++)
  356. {    
  357. *lpSrc=*lpDst+*lpSrc;
  358. if(*lpSrc>255)
  359. *lpSrc=255;
  360. lpSrc++;
  361. lpDst++;
  362. }
  363. lpSrc=temp2;
  364. }
  365. delete temp;
  366. CClientDC dc(this);   
  367. CDSplitDoc* pDoc = GetDocument();
  368. ASSERT_VALID(pDoc);
  369. if(!pDoc ->statedoc&&state2==1)
  370. {
  371.       int m_scale=1;
  372.         BYTE* pBitmapData = CDibNew1->GetData();
  373.         LPBITMAPINFO pBitmapInfo = CDibNew1->GetInfo();
  374.         int bitmapHeight = CDibNew1->GetHeight();
  375.         int bitmapWidth = CDibNew1->GetWidth();
  376. int scaledWidth = (int)(bitmapWidth * m_scale);
  377. int scaledHeight = (int)(bitmapHeight * m_scale);
  378. if (CDibNew1->GetRGB()) // Has a color table
  379. {
  380. CPalette * hPalette=CreateBitmapPalette(CDibNew1);
  381.             CPalette * hOldPalette =
  382.                 dc.SelectPalette(hPalette, true);
  383.             dc.RealizePalette();
  384. ::StretchDIBits(dc.GetSafeHdc(),0, 0, scaledWidth, scaledHeight,
  385. 0, 0, bitmapWidth, bitmapHeight,
  386. pBitmapData, pBitmapInfo,
  387. DIB_RGB_COLORS, SRCCOPY);
  388.             dc.SelectPalette(hOldPalette, true);
  389.             ::DeleteObject(hPalette);
  390. }
  391. else
  392. {
  393. ::StretchDIBits(dc.GetSafeHdc(),0, 0, scaledWidth, scaledHeight,
  394. 0, 0, bitmapWidth, bitmapHeight,
  395. pBitmapData, pBitmapInfo,
  396. DIB_RGB_COLORS, SRCCOPY);
  397. }
  398. }
  399. dc.SetTextColor(100);
  400. CString ss_Area[255];
  401. for(i=0;i<255;i++)
  402. {
  403. if(CDibNew1->pppp[i].pp_area!=0)
  404. ss_Area[i].Format("%d",CDibNew1->pppp[i].pp_number);
  405. dc.TextOut(CDibNew1->pppp[i].pp_x,CDibNew1->pppp[i].pp_y,ss_Area[i]);
  406. }
  407. }