DlgHistShow1.cpp
上传用户:xjt2008yy
上传日期:2010-01-18
资源大小:272k
文件大小:4k
源码类别:

生物技术

开发平台:

Visual C++

  1. // DlgHistShow1.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "ImageProcessing.h"
  5. #include "DlgHistShow1.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CDlgHistShow dialog
  13. CDlgHistShow::CDlgHistShow(CWnd* pParent /*=NULL*/)
  14. : CDialog(CDlgHistShow::IDD, pParent)
  15. {
  16. //{{AFX_DATA_INIT(CDlgHistShow)
  17. // NOTE: the ClassWizard will add member initialization here
  18. //}}AFX_DATA_INIT
  19. }
  20. void CDlgHistShow::DoDataExchange(CDataExchange* pDX)
  21. {
  22. CDialog::DoDataExchange(pDX);
  23. //{{AFX_DATA_MAP(CDlgHistShow)
  24. // NOTE: the ClassWizard will add DDX and DDV calls here
  25. //}}AFX_DATA_MAP
  26. }
  27. BEGIN_MESSAGE_MAP(CDlgHistShow, CDialog)
  28. //{{AFX_MSG_MAP(CDlgHistShow)
  29. ON_WM_PAINT()
  30. //}}AFX_MSG_MAP
  31. END_MESSAGE_MAP()
  32. /////////////////////////////////////////////////////////////////////////////
  33. // CDlgHistShow message handlers
  34. BOOL CDlgHistShow::OnInitDialog() 
  35. {
  36. CDialog::OnInitDialog();
  37. // TODO: Add extra initialization here
  38. // 设置直线原图象象素的指针
  39. unsigned char * lpSrc;
  40. // 循环变量
  41. int i,j;
  42. // 获取绘制直方图的标签
  43. CWnd* pWnd = GetDlgItem(IDC_DLG_HIST_SHOW);
  44. // 计算得到直方图
  45. // 图象的高度和宽度
  46. CSize sizeImage;
  47. sizeImage = m_pDib->GetDimensions();
  48. // 获得图象数据存储的高度和宽度
  49. CSize sizeSaveImage;
  50. sizeSaveImage = m_pDib->GetDibSaveDim();
  51. // 重置计数为0
  52. for (i = 0; i < 256; i ++)
  53. {
  54. // 清零
  55. m_nHist[i] = 0;
  56. }
  57. // 计算各个灰度值的计数,即得到直方图
  58. for (i = 0; i < sizeImage.cy; i ++)
  59. {
  60. for (j = 0; j < sizeImage.cx; j ++)
  61. {
  62. lpSrc = (unsigned char *)m_pDib->m_lpImage + sizeSaveImage.cx * i + j;
  63. // 计数加1
  64. m_nHist[*(lpSrc)]++;
  65. }
  66. }
  67. return TRUE;  // return TRUE unless you set the focus to a control
  68.               // EXCEPTION: OCX Property Pages should return FALSE
  69. }
  70. void CDlgHistShow::OnPaint() 
  71. {
  72. CPaintDC dc(this); // device context for painting
  73. // TODO: Add your message handler code here
  74. // 循环变量
  75. int i;
  76. // 获取绘制直方图文本框的标签
  77. CWnd* pWnd = GetDlgItem(IDC_DLG_HIST_SHOW);
  78. // 获取设备上下文
  79. CDC* pDC = pWnd->GetDC();
  80. pWnd->Invalidate();
  81. pWnd->UpdateWindow();
  82. pDC->Rectangle(0, 0, 330, 300);
  83. // 创建画笔对象
  84. CPen* pPenRed = new CPen;
  85. // 创建红色画笔(用于绘制坐标轴)
  86. pPenRed->CreatePen(PS_SOLID, 1, RGB(255,0,0));
  87. // 选入红色画笔,并保存以前的画笔
  88. CPen* pOldPen = pDC->SelectObject(pPenRed);
  89. // 绘制坐标轴
  90. pDC->MoveTo(10,10);
  91. // 绘制垂直轴
  92. pDC->LineTo(10, 280);
  93. // 绘制水平轴
  94. pDC->LineTo(320, 280);
  95. // 绘制X轴刻度值
  96. CString strTemp;
  97. strTemp.Format("0");
  98. pDC->TextOut(10, 283, strTemp);
  99. strTemp.Format("50");
  100. pDC->TextOut(60, 283, strTemp);
  101. strTemp.Format("100");
  102. pDC->TextOut(110, 283, strTemp);
  103. strTemp.Format("150");
  104. pDC->TextOut(160, 283, strTemp);
  105. strTemp.Format("200");
  106. pDC->TextOut(210, 283, strTemp);
  107. strTemp.Format("255");
  108. pDC->TextOut(265, 283, strTemp);
  109. // 绘制X轴刻度
  110. for (i = 0; i < 256; i += 5)
  111. {
  112. if ((i & 1) == 0)
  113. {
  114. // 10的倍数
  115. pDC->MoveTo(i + 10, 280);
  116. pDC->LineTo(i + 10, 284);
  117. }
  118. else
  119. {
  120. // 5的奇数倍数
  121. pDC->MoveTo(i + 10, 280);
  122. pDC->LineTo(i + 10, 282);
  123. }
  124. }
  125. // 绘制X轴箭头
  126. pDC->MoveTo(315,275);
  127. pDC->LineTo(320,280);
  128. pDC->LineTo(315,285);
  129. // 绘制Y轴箭头
  130. pDC->MoveTo(10,10);
  131. pDC->LineTo(5,15);
  132. pDC->MoveTo(10,10);
  133. pDC->LineTo(15,15);
  134. // 直方图中最大计数值
  135. LONG lMaxCount = 0;
  136. // 计算最大计数值
  137. for (i = 0; i <= 255; i ++)
  138. {
  139. // 判断是否大于当前最大值
  140. if (m_nHist[i] > lMaxCount)
  141. {
  142. // 更新最大值
  143. lMaxCount = m_nHist[i];
  144. }
  145. }
  146. // 输出最大计数值
  147. pDC->MoveTo(10, 25);
  148. pDC->LineTo(14, 25);
  149. strTemp.Format("%d", lMaxCount);
  150. pDC->TextOut(11, 26, strTemp);
  151. // 声名画笔对象
  152. CPen* pPenBlue = new CPen;
  153. // 创建蓝色画笔(用于绘制直方图)
  154. pPenBlue->CreatePen(PS_SOLID, 1, RGB(0,0,255));
  155. // 选入蓝色画笔
  156. pDC->SelectObject(pPenBlue);
  157. // 判断是否存在计数值
  158. if(lMaxCount > 0){
  159. // 绘制直方图
  160. for (i = 0; i <= 255; i ++)
  161. {
  162. pDC->MoveTo(i + 10, 280);
  163. pDC->LineTo(i + 10, 281 - (int) (m_nHist[i] * 256 / lMaxCount));
  164. }
  165. }
  166. // 恢复以前的画笔
  167. pDC->SelectObject(pOldPen);
  168. // 删除新的画笔
  169. delete pPenRed;
  170. delete pPenBlue;
  171. }