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 + -
显示快捷键?