📄 pichistrogram.cpp
字号:
// PicHistrogram.cpp : implementation file
//
#include "stdafx.h"
#include "RSImageStar.h"
#include "PicHistrogram.h"
#include "RSImageStarDoc.h"
#include "RSImageStarView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CPicHistrogram
extern CRSImageStarView *m_pView;
CPicHistrogram::CPicHistrogram()
{
nChannel=0;
RedrawFlag=true;
}
CPicHistrogram::~CPicHistrogram()
{
}
BEGIN_MESSAGE_MAP(CPicHistrogram, CStatic)
//{{AFX_MSG_MAP(CPicHistrogram)
ON_WM_PAINT()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CPicHistrogram message handlers
void CPicHistrogram::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
GetWindowRect(rect);
ScreenToClient(rect);
long size;
size=m_pView->m_pDoc->size.cx*m_pView->m_pDoc->size.cy;
int x,y,height,width;
height=rect.Height();
width=rect.Width();
int min;
int max;
switch(nChannel)
{
case 0:
min=m_pView->m_pDoc->curptr->dib->nMinRed;
max=m_pView->m_pDoc->curptr->dib->nMaxRed;
break;
case 1:
min=m_pView->m_pDoc->curptr->dib->nMinGreen;
max=m_pView->m_pDoc->curptr->dib->nMaxGreen;
break;
case 2:
min=m_pView->m_pDoc->curptr->dib->nMinBlue;
max=m_pView->m_pDoc->curptr->dib->nMaxBlue;
break;
default:
break;
}
int count,MinValue,MaxValue=0;
MinValue=1000;
count=0;
int i,flag=int(size*0.004);
switch(nChannel)
{
case 0:
for(i=min;i<max;i++)
{
if(m_pView->m_pDoc->curptr->dib->nRedChannel[i]!=0)
{
if(m_pView->m_pDoc->curptr->dib->nRedChannel[i]>flag)
count++;
if(MinValue>m_pView->m_pDoc->curptr->dib->nRedChannel[i])
MinValue=m_pView->m_pDoc->curptr->dib->nRedChannel[i];
}
}
break;
case 1:
for(i=min;i<max;i++)
{
if(m_pView->m_pDoc->curptr->dib->nGreenChannel[i]!=0)
{
if(m_pView->m_pDoc->curptr->dib->nGreenChannel[i]>flag)
count++;
if(MinValue>m_pView->m_pDoc->curptr->dib->nGreenChannel[i])
MinValue=m_pView->m_pDoc->curptr->dib->nGreenChannel[i];
}
}
break;
case 2:
for(i=min;i<max;i++)
{
if(m_pView->m_pDoc->curptr->dib->nBlueChannel[i]!=0)
{
if(m_pView->m_pDoc->curptr->dib->nBlueChannel[i]>flag)
count++;
if(MinValue>m_pView->m_pDoc->curptr->dib->nBlueChannel[i])
MinValue=m_pView->m_pDoc->curptr->dib->nBlueChannel[i];
}
}
break;
default:
break;
}
if(count==0)
count=flag;
else
count=int(size/count);
if(count<(MinValue*height))
count=MinValue*height;
switch(nChannel)
{
case 0:
for(i=min;i<=max;i++)
{
if(MaxValue<m_pView->m_pDoc->curptr->dib->nRedChannel[i])
if(m_pView->m_pDoc->curptr->dib->nRedChannel[i]<=count)
MaxValue=m_pView->m_pDoc->curptr->dib->nRedChannel[i];
}
break;
case 1:
for(i=min;i<=max;i++)
{
if(MaxValue<m_pView->m_pDoc->curptr->dib->nGreenChannel[i])
if(m_pView->m_pDoc->curptr->dib->nGreenChannel[i]<=count)
MaxValue=m_pView->m_pDoc->curptr->dib->nGreenChannel[i];
}
break;
case 2:
for(i=min;i<=max;i++)
{
if(MaxValue<m_pView->m_pDoc->curptr->dib->nBlueChannel[i])
if(m_pView->m_pDoc->curptr->dib->nBlueChannel[i]<=count)
MaxValue=m_pView->m_pDoc->curptr->dib->nBlueChannel[i];
}
break;
default:
break;
}
float scale,scale1;
scale=float(height)/(MaxValue);
scale1=float(width/256.0);
dc.SelectStockObject(NULL_BRUSH);
dc.Rectangle(rect.left-1,rect.top-1,rect.right+1,rect.bottom+1);
switch(nChannel)
{
case 0:
for(i=min;i<=max;i++)
{
y=int(scale*m_pView->m_pDoc->curptr->dib->nRedChannel[i]+0.5);
x=int(i*scale1+0.5);
dc.MoveTo(x,height);
if(y>height)
y=height;
dc.LineTo(x,(height-y));
}
break;
case 1:
for(i=min;i<=max;i++)
{
y=int(scale*m_pView->m_pDoc->curptr->dib->nGreenChannel[i]+0.5);
x=int(i*scale1+0.5);
dc.MoveTo(x,height);
if(y>height)
y=height;
dc.LineTo(x,(height-y));
}
break;
case 2:
for(i=min;i<=max;i++)
{
y=int(scale*m_pView->m_pDoc->curptr->dib->nBlueChannel[i]+0.5);
x=int(i*scale1+0.5);
dc.MoveTo(x,height);
if(y>height)
y=height;
dc.LineTo(x,(height-y));
}
break;
default:
break;
}
// Do not call CStatic::OnPaint() for painting messages
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -