📄 histogramdlg.cpp
字号:
// HistogramDlg.cpp : implementation file
//
#include "stdafx.h"
#include "RSIP.h"
#include "HistogramDlg.h"
#include "math.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// HistogramDlg dialog
HistogramDlg::HistogramDlg(CWnd* pParent /*=NULL*/)
: CDialog(HistogramDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(HistogramDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
m_bTrace = FALSE;
}
void HistogramDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(HistogramDlg)
DDX_Control(pDX, IDC_CHUNNEL_COMBO, m_ChunnelList);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(HistogramDlg, CDialog)
//{{AFX_MSG_MAP(HistogramDlg)
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_MOUSEMOVE()
ON_WM_PAINT()
ON_CBN_SELCHANGE(IDC_CHUNNEL_COMBO, OnSelchangeChunnelCombo)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// HistogramDlg message handlers
void HistogramDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
RECT Rect;
SetRect(&Rect,7,26,174,98);
MapDialogRect(&Rect);
if(point.x<Rect.left || point.x>Rect.right ||
point.y<Rect.top || point.y>Rect.bottom)
return;
m_bTrace = TRUE;
SetCapture();
m_nBeginValue = point.x;
m_nJustValue = point.x;
CDialog::OnLButtonDown(nFlags, point);
}
void HistogramDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
if(!m_bTrace)
return;
ReleaseCapture();
m_bTrace = FALSE;
RECT Rect;
SetRect(&Rect,7,26,174,98);
MapDialogRect(&Rect);
InvalidateRect(&Rect);
CDialog::OnLButtonUp(nFlags, point);
}
void HistogramDlg::OnMouseMove(UINT nFlags, CPoint point)
{
RECT Rect;
SetRect(&Rect,7,26,174,98);
MapDialogRect(&Rect);
if(point.x<Rect.left || point.x>Rect.right ||
point.y<Rect.top || point.y>Rect.bottom)
return;
double dXRatio = 255.0/(Rect.right-Rect.left);
int nChannel;
if(m_nImageType == IMAGE_SINGLEBAND)
nChannel = 0;
else
nChannel = m_ChunnelList.GetCurSel();
if(m_bTrace)
{
CClientDC dc(this);
dc.SetROP2(R2_NOT);
int i;
if(m_nJustValue<point.x)
{
for(int i=m_nJustValue; i<point.x; i++)
{
dc.MoveTo(i,Rect.top);
dc.LineTo(i,Rect.bottom);
}
}
else
{
for(int i=point.x; i<m_nJustValue; i++)
{
dc.MoveTo(i,Rect.top);
dc.LineTo(i,Rect.bottom);
}
}
char szText[16];
DWORD dwCount = 0;
int nLevel1 = int((m_nBeginValue-Rect.left)*dXRatio+0.5);
int nLevel2 = int((point.x-Rect.left)*dXRatio+0.5);
if(nLevel1<nLevel2)
{
sprintf(szText,"%d..%d",nLevel1,nLevel2);
for(i=nLevel1; i<nLevel2; i++)
dwCount += m_pdwHistogram[nChannel*256+i];
}
else
{
sprintf(szText,"%d..%d",nLevel2,nLevel1);
for(i=nLevel2; i<nLevel1; i++)
dwCount += m_pdwHistogram[nChannel*256+i];
}
SetDlgItemText(1024,szText);
SetDlgItemInt(1025,dwCount);
sprintf(szText,"%.6f",(double)dwCount/m_dwPixels*100.0);
SetDlgItemText(1026,szText);
m_nJustValue = point.x;
}
else
{
int nLevel = int((point.x-Rect.left)*dXRatio+0.5);
SetDlgItemInt(1024,nLevel);
SetDlgItemInt(1025,m_pdwHistogram[nChannel*256+nLevel]);
char szText[16];
sprintf(szText,"%.6f",(double)m_pdwHistogram[nChannel*256+nLevel]/m_dwPixels*100.0);
SetDlgItemText(1026,szText);
}
CDialog::OnMouseMove(nFlags, point);
}
void HistogramDlg::OnPaint()
{
CPaintDC dc(this); // device context for painting
RECT Rect;
SetRect(&Rect,7,26,174,98);
MapDialogRect(&Rect);
double dMaxRatio = 0;
double dXRatio = (double)(Rect.right-Rect.left)/255;
int nChannel;
if(m_nImageType == IMAGE_SINGLEBAND)
nChannel = 0;
else
nChannel = m_ChunnelList.GetCurSel();
for(int i=0; i<256; i++)
{
if(dMaxRatio<m_pdwHistogram[nChannel*256+i])
dMaxRatio = m_pdwHistogram[nChannel*256+i];
}
dMaxRatio = (Rect.bottom-Rect.top)/dMaxRatio;
for(i=0; i<256; i++)
{
dc.MoveTo(int(i*dXRatio+Rect.left),int(Rect.bottom-dMaxRatio*m_pdwHistogram[nChannel*256+i]));
dc.LineTo(int(i*dXRatio+Rect.left),Rect.bottom);
}
SetRect(&Rect,7,97,174,110);
MapDialogRect(&Rect);
if(m_nImageType==IMAGE_SINGLEBAND)
{
CPen Pen;
CPen *pOldPen;
for(i=0;i<256;i++)
{
Pen.CreatePen(PS_SOLID,1,RGB(i,i,i));
pOldPen = dc.SelectObject(&Pen);
dc.MoveTo(int(i*dXRatio+Rect.left),Rect.bottom);
dc.LineTo(int(i*dXRatio+Rect.left),Rect.top);
dc.SelectObject(pOldPen);
Pen.DeleteObject();
}
}
else
{
CPen Pen;
CPen *pOldPen;
for(i=0; i<256; i++)
{
if(nChannel==0)
Pen.CreatePen(PS_SOLID,1,RGB(i,0,0));
else if(nChannel==1)
Pen.CreatePen(PS_SOLID,1,RGB(0,i,0));
else
Pen.CreatePen(PS_SOLID,1,RGB(0,0,i));
pOldPen = dc.SelectObject(&Pen);
dc.MoveTo(int(i*dXRatio+Rect.left),Rect.bottom);
dc.LineTo(int(i*dXRatio+Rect.left),Rect.top);
dc.SelectObject(pOldPen);
Pen.DeleteObject();
}
}
}
void HistogramDlg::OnSelchangeChunnelCombo()
{
RECT Rect;
SetRect(&Rect,7,26,174,111);
MapDialogRect(&Rect);
InvalidateRect(&Rect);
int nChannel = m_ChunnelList.GetCurSel();
char szText[16];
double dCount = 0;
for(int i=0;i<256;i++)
{
dCount += i*m_pdwHistogram[nChannel*256+i];
}
double dMean = (double)dCount/m_dwPixels;
sprintf(szText,"%.6f",dMean);
SetDlgItemText(1020,szText);
dCount=0;
for(i=0;i<256;i++)
{
dCount = dCount+(i-dMean)*(i-dMean)*m_pdwHistogram[nChannel*256+i];
}
sprintf(szText,"%.6f",sqrt(dCount/m_dwPixels));
SetDlgItemText(1021,szText);
dCount=0;
for(i=0; i<256; i++)
{
dCount += m_pdwHistogram[nChannel*256+i];
if(dCount>=m_dwPixels/2)
break;
}
SetDlgItemInt(1022,i);
}
BOOL HistogramDlg::OnInitDialog()
{
CDialog::OnInitDialog();
if(m_nImageType == IMAGE_COMBINE)
{
m_ChunnelList.AddString("红");
m_ChunnelList.AddString("绿");
m_ChunnelList.AddString("蓝");
m_ChunnelList.SetCurSel(0);
}
else
m_ChunnelList.EnableWindow(FALSE);
SetDlgItemInt(1023,m_dwPixels);
char szText[16];
double dCount = 0;
for(int i=0; i<256; i++)
{
dCount += i*m_pdwHistogram[i];
}
double dMean = (double)dCount/m_dwPixels;
sprintf(szText,"%.6f",dMean);
SetDlgItemText(1020,szText);
dCount=0;
for(i=0; i<256; i++)
{
dCount = dCount+(i-dMean)*(i-dMean)*m_pdwHistogram[i];
}
sprintf(szText,"%.6f",sqrt(dCount/m_dwPixels));
SetDlgItemText(1021,szText);
dCount=0;
for(i=0; i<256; i++)
{
dCount += m_pdwHistogram[i];
if(dCount >= m_dwPixels/2)
break;
}
SetDlgItemInt(1022,i);
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -