⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pichistrogram.cpp

📁 c语言实现的遥感图像处理的一些基本操作
💻 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 + -