histogamdlg.cpp
来自「一个非常全的vc编程的原程序代码是关于图像处理的!」· C++ 代码 · 共 208 行
CPP
208 行
// HistogamDlg.cpp : implementation file
//
#include "stdafx.h"
#include "ViewDIB.h"
#include "HistogamDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CHistogamDlg dialog
CHistogamDlg::CHistogamDlg(CWnd* pParent /*=NULL*/)
: CDialog(CHistogamDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CHistogamDlg)
m_lLevel = 0;
m_count = 0;
m_percentile = 0.0;
//}}AFX_DATA_INIT
}
void CHistogamDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CHistogamDlg)
DDX_Control(pDX, IDC_PIXELS_EDIT, m_PixelsEdit);
DDX_Control(pDX, IDC_MEAN_EDIT, m_MeanEdit);
DDX_Control(pDX, IDC_LEVEL_EDIT, m_LevelEdit);
DDX_Control(pDX, IDC_COMBO, m_ChannelCombo);
DDX_Text(pDX, IDC_LEVEL_EDIT, m_lLevel);
DDV_MinMaxLong(pDX, m_lLevel, 0, 255);
DDX_Text(pDX, IDC_COUNT_EDIT, m_count);
DDX_Text(pDX, IDC_PERCENTILE_EDIT, m_percentile);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CHistogamDlg, CDialog)
//{{AFX_MSG_MAP(CHistogamDlg)
ON_BN_CLICKED(IDC_OK_BUTTON, OnOkButton)
ON_WM_PAINT()
ON_CBN_SELCHANGE(IDC_COMBO, OnSelchangeCombo)
ON_BN_CLICKED(IDC_LEVEL_BUTTON, OnLevelButton)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CHistogamDlg message handlers
void CHistogamDlg::OnOkButton()
{
// TODO: Add your control notification handler code here
OnOK();
}
void CHistogamDlg::OnPaint()
{
CPaintDC dc(this);
UpdateData(TRUE);
//some prepare work for painting.
CWnd* pWnd = GetDlgItem(IDC_PIC);
CDC* pControlDC = pWnd->GetDC();
pWnd->Invalidate();
pWnd->UpdateWindow();
CPen penD;
CBrush brush;
CPen* pOldPen;
CBrush* pOldBrush;
penD.CreatePen(PS_SOLID, 2, RGB(0,0,0));
brush.CreateSolidBrush(RGB(192, 192, 192));
pOldBrush = pControlDC->SelectObject(&brush);
//set the color degree bar according to the channel selected.
m_nChannel = m_ChannelCombo.GetCurSel();
for(int i=0;i<256;i++)
m_pen[i].DeleteObject();
if(m_nChannel == 2){
m_maxValue = m_max;
for(int i=0;i<256;i++){
m_Value[i] = m_L[i];
m_pen[i].CreatePen(PS_SOLID, 1, RGB(i,i,i));
}
}
if(m_nChannel == 3){
m_maxValue = m_max0;
for(int i=0;i<256;i++){
m_Value[i] = m_R[i];
m_pen[i].CreatePen(PS_SOLID, 1, RGB(i,0,0));
}
}
if(m_nChannel == 1){
m_maxValue = m_max1;
for(int i=0;i<256;i++){
m_Value[i] = m_G[i];
m_pen[i].CreatePen(PS_SOLID, 1, RGB(0,i,0));
}
}
if(m_nChannel == 0){
m_maxValue = m_max2;
for(int i=0;i<256;i++){
m_Value[i] = m_B[i];
m_pen[i].CreatePen(PS_SOLID, 1, RGB(0,0,i));
}
}
//drow the histogram and color bar.
pControlDC->Rectangle(0, 0, 258, 110);
pControlDC->Rectangle(0, 112, 258, 122);
pControlDC->SelectObject(pOldBrush);
for(i=0;i<256;i++)
{
pOldPen = pControlDC->SelectObject(&penD);
pControlDC->MoveTo(i+1, 110);
pControlDC->LineTo(i+1, 110-m_Value[i]);
pControlDC->SelectObject(pOldPen);
pOldPen = pControlDC->SelectObject(&m_pen[i]);
pControlDC->MoveTo(i+1, 113);
pControlDC->LineTo(i+1, 121);
pControlDC->SelectObject(pOldPen);
}
for(i=0;i<256;i++)
m_pen[i].DeleteObject();
char aMean[5];
long mean = 0;
for(i=0;i<256;i++)
mean += (m_Value[i]*m_maxValue/100*i);
mean = mean/(m_width*m_height);
_itoa(mean, aMean, 10);
m_MeanEdit.SetSel(0, -1);
m_MeanEdit.ReplaceSel(aMean);
char aPixels[5];
long pixels = m_width*m_height;
_itoa(pixels, aPixels, 10);
m_PixelsEdit.SetSel(0, -1);
m_PixelsEdit.ReplaceSel(aPixels);
//do the end work for paint.
pWnd->ReleaseDC(pControlDC);
UpdateData(FALSE);
}
BOOL CHistogamDlg::OnInitDialog()
{
CDialog::OnInitDialog();
for(int i=0;i<256;i++)
{
m_pen[i].CreatePen(PS_SOLID, 1, RGB(i,i,i));
}
m_ChannelCombo.AddString("Luminosity");
m_ChannelCombo.AddString("Red");
m_ChannelCombo.AddString("Green");
m_ChannelCombo.AddString("Blue");
m_ChannelCombo.SelectString(-1, "Luminosity");
UpdateData(FALSE);
return TRUE;
}
void CHistogamDlg::OnSelchangeCombo()
{
UpdateData(TRUE);
OnPaint();
UpdateData(FALSE);
}
void CHistogamDlg::OnLevelButton()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
long level = m_lLevel;
if(level>256){
level = m_lLevel = 255;
}
if(level<0){
level = m_lLevel = 0;
}
m_count = m_Value[level]*m_maxValue/100;
double percentile = 0;
for(int i=0;i<=level;i++)
percentile += m_Value[i]*m_maxValue/100;//*m_maxValue/100;
m_percentile = percentile*100/(double)(m_width*m_height);
UpdateData(FALSE);
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?