位灰度图的一个像素也会占用32位。
为方便统计,对话框默认当前处理图像为灰度图,即RGB,故每次只需要统计其中一种颜 色的数量。
2)灰度直方图重绘过程 绘制工作主要由Refresh函数完成,它完成了 以下功能。
l 双缓存的创建 以双缓存模式绘制直方图,防止闪烁。
l 绘制直方图的坐标系和刻度 l 查找所有灰度中最多的出现次数 该次数会显示在Y轴的旁边,拥有该 次数灰度值的直方图最高。
l 以相对高度绘制直方图 其余灰度值的高度由其出现次数与最大出现次数的比 值决定。
l 利用鼠标操作改变显示灰度的上下限 灰度上下限在对话框中以两条蓝色的虚线表示,用户 可以通过鼠标操作改变两条虚线的位置来改变显示灰度的上下限。
用户在单击鼠标左键时程序会根据当前鼠标的位置, 判断鼠标是否在上下限虚线的范围内。
如果在上限虚线的范围中,则将m_nIsDraging变量赋值为DT_UP,如果在下限虚线的范围中,则赋值为 DT_LOW,否则赋值为DT_NULL。
用户在移动鼠标时如果m_nIsDraging不 为DT_NULL,则表示用户此时正在拖动上限或者下限的虚线,此时就需要更改上下限的值,并将其限定在合法的取值范围中。
下面列出HistogramDlg.h的代码清 单: pragma once include afxwin.h // CHistogramDlg 对话框 class CHistogramDlg : public CDialog DECLARE_MESSAGE_MAP DECLARE_DYNAMICCHistogramDlg public: CStatic m_stiHistogram // 直方图显示区域 int m_nLimitLow // 显示灰度的下限 int m_nLimitUp // 显示灰度的上限 long m_lCounts256 // 各级灰度出现的个数 long m_nPixelCount // 图像像素总数 CPoint m_psMove // 记录拖动时的鼠标位置 int m_nIsDraging // 鼠标是否正在拖动 int m_nGray // 当前鼠标位置的灰度级数 float m_dPer // 出现概率 CHistogramDlgCWnd pParent NULL // 标准构造函数 virtual CHistogramDlg afx_msg void OnEnChangeLimitLower // 灰度下限改变的响应函数 afx_msg void OnEnChangeLimitUp // 灰度上限改变的响应函数 afx_msg void OnPaint // 绘制对话框 virtual BOOL OnInitDialog // 对话框初始化时计算各级灰度数量 afx_msg void OnMouseMoveUINT nFlags CPoint point // 鼠标移动时响应拖动动作 afx_msg BOOL OnSetCursorCWnd pWnd UINT nHitTest UINT message // 拖动时改变鼠标光标 afx_msg void OnLButtonDownUINT nFlags CPoint point // 鼠标按下时判断是否在灰度上下限直线范围中 afx_msg void OnLButtonUpUINT nFlags CPoint point // 释放鼠标的响应函数 // 对话框数据 enum IDD IDD_HISTOGRAM protected: virtual void DoDataExchangeCDataExchange pDX // DDX/DDV 支持 private: void Refreshvoid // 刷新直方图 // 拖动枚举 enum DragingType DT_NULL // 无拖动 DT_LOW // 拖动下限 DT_UP // 拖动上限 下面列出HistogramDlg.h的核心代码清单: // HistogramDlg.cpp : 实现文件 include stdafx.h include MagicHouse.h include HistogramDlg.h include Mainfrm.h include MagicHouseDoc.h include MagicHouseView.h // CHistogramDlg 消息处理程序 / 作用: 对话框初始化时计算各级灰度数量 / BOOL CHistogramDlg::OnInitDialog CDialog::OnInitDialog CMainFrame pMain CMainFrameAfxGetMainWnd CMagicHouseView pView CMagicHouseViewpMain-GetActiveView for UINT i 0 i pView-m_nPicWidth pView-m_nPicHeight i int value pView-m_pImageTempBufferi 4 m_lCountsvalue // 计算像素总个数 m_nPixelCount pView-m_nPicWidth pView-m_nPicHeight return TRUE // return TRUE unless you set the focus to a control // 异常:OCX 属性页应返回 FALSE / 作用: 刷新直方图 备注: 双缓存绘制方法 / void CHistogramDlg::Refresh CDC pDC m_stiHistogram.GetDC CRect rect CDC memDC CBitmap MemBitmap // 获取绘图区域 m_stiHistogram.GetClientRectrect // 设备描述表初始化 memDC.CreateCompatibleDCNULL // 建立与屏幕显示兼容的内存显示设备 MemBitmap.CreateCompatibleBi