www.gusucode.com > VC++图像处理典型算法完整演示源代码源码程序 > VC++图像处理典型算法完整演示源代码源码程序/code/HistogramDrawDlg.cpp
//Download by http://www.NewXing.com // HistogramDrawDlg.cpp : implementation file // #include "stdafx.h" #include "demo.h" #include "HistogramDrawDlg.h" #include "ImageCenterDib.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // HistogramDrawDlg dialog HistogramDrawDlg::HistogramDrawDlg(CWnd* pParent /*=NULL*/) : CDialog(HistogramDrawDlg::IDD, pParent) { //{{AFX_DATA_INIT(HistogramDrawDlg) //初始化颜色通道为亮度信息 m_colorSelect = 3; //}}AFX_DATA_INIT } void HistogramDrawDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(HistogramDrawDlg) DDX_CBIndex(pDX, IDC_COMBO_colorSelect, m_colorSelect); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(HistogramDrawDlg, CDialog) //{{AFX_MSG_MAP(HistogramDrawDlg) ON_WM_PAINT() ON_CBN_SELCHANGE(IDC_COMBO_colorSelect, OnSelchangeCOMBOcolorSelect) ON_WM_SIZE() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // HistogramDrawDlg message handlers //对话框初始化 BOOL HistogramDrawDlg::OnInitDialog() { CDialog::OnInitDialog(); //将静态框1移至rect指定位置,用来画直方图 CRect rect; rect=CRect(25,51,279,151); GetDlgItem(IDC_STATIC_HistRect)->MoveWindow(&rect); //将组合框移至rect指定的位置 rect=CRect(14,15,293,200); GetDlgItem(IDC_STATIC_ZHK)->MoveWindow(&rect); //将列表框移至rect指定的位置 rect=CRect(70,15,200,115); GetDlgItem(IDC_COMBO_colorSelect)->MoveWindow(&rect); //将颜色提示条移至指定位置 rect=CRect(25,155,279,168); GetDlgItem(IDC_STATIC_BmpBar)->MoveWindow(&rect); //将均值静态框移至指定位置 rect=CRect(29,176,130,193); GetDlgItem(IDC_STATIC_Average)->MoveWindow(&rect); //将方差静态框移至指定位置 rect=CRect(180,176,279,193); GetDlgItem(IDC_STATIC_Deviation)->MoveWindow(&rect); //将确定按钮移至指定位置 rect=CRect(221,210,277,234); GetDlgItem(IDOK)->MoveWindow(&rect); // 如果是灰度图像,则调用灰度直方图统计函数 if(m_histogramDib.m_nBitCount==8) m_histogramDib.computeHistGray(); else//彩色图像则统计亮度直方图 m_histogramDib.computeHistBrightness(); //计算直方图的均值和方差 m_histogramDib.computeAverage(); m_histogramDib.computeDeviation(); //将均值信息显示在均值静态框中 char szStr[10]; sprintf(szStr, "均值:%.2f",m_histogramDib.m_average ); SetDlgItemText(IDC_STATIC_Average, szStr); //将方差信息显示在方差静态框中 sprintf(szStr, "方差:%.2f", m_histogramDib.m_deviation); SetDlgItemText(IDC_STATIC_Deviation, szStr); return TRUE; } void HistogramDrawDlg::OnPaint() { //设备环境对象 CPaintDC dc(this); // device context for painting //彩色和灰度图像有效 if(m_histogramDib.m_nBitCount != 8 && m_histogramDib.m_nBitCount != 24) return ; //获取直方图绘制静态框的矩形区域 CRect clientRect; GetDlgItem(IDC_STATIC_HistRect)->GetWindowRect(&clientRect); ScreenToClient(&clientRect); BeginWaitCursor(); // Draw Back Ground //画背景 dc.SelectStockObject(NULL_BRUSH); dc.Rectangle(clientRect.left-1, clientRect.top, clientRect.right+3, clientRect.bottom+1); //画直方图灰度频率与直方图绘制矩形区域比例关系,画直方图 unsigned int max=0;; for(int i=0;i<256;i++){ if(m_histogramDib.m_histArray[i]>max) max=m_histogramDib.m_histArray[i]; } DWORD bufTemp[256]; double x=clientRect.Height(); for(i=0;i<256;i++){ bufTemp[i]=(unsigned long)((float)m_histogramDib.m_histArray[i]*x/max); } for(i=clientRect.left;i<=clientRect.right;i++){ dc.MoveTo(i,clientRect.bottom); dc.LineTo(i,clientRect.bottom-bufTemp[i-clientRect.left]); } EndWaitCursor(); } void HistogramDrawDlg::OnSelchangeCOMBOcolorSelect() { //该函数根据用户选择直方图颜色通道不同来作出相应操作 //将对话框用户设置的数据传入对话框内 UpdateData(1); if(m_histogramDib.m_nBitCount!=24){ m_colorSelect=3; UpdateData(0); return; } //根据用户的选择调用相应通道的直方图统计函数 if(m_colorSelect==0) m_histogramDib.computeHistBlue(); else if(m_colorSelect==1) m_histogramDib.computeHistGreen(); else if(m_colorSelect==2) m_histogramDib.computeHistRed(); else if(m_colorSelect==3) m_histogramDib.computeHistBrightness(); //计算直方图的均值和方差 m_histogramDib.computeAverage(); m_histogramDib.computeDeviation(); //显示均值和方差在相应静态框中 char szStr[10]; sprintf(szStr, "均值:%.2f",m_histogramDib.m_average ); SetDlgItemText(IDC_STATIC_Average, szStr); sprintf(szStr, "方差:%.2f", m_histogramDib.m_deviation); SetDlgItemText(IDC_STATIC_Deviation, szStr); //刷新 Invalidate(); } void HistogramDrawDlg::OnSize(UINT nType, int cx, int cy) { //该函数在创建对话框时调用,确定直方图对话框的大小及客户区中的位置 CDialog::OnSize(nType, cx, cy); CRect rect; rect=CRect(405,261,717,545); MoveWindow(&rect); }