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

📄 adjusthuedlg.cpp

📁 c语言实现的遥感图像处理的一些基本操作
💻 CPP
字号:
// AdjustHueDlg.cpp : implementation file
//

#include "stdafx.h"
#include "RSImageStar.h"
#include "AdjustHueDlg.h"
#include "MainFrm.h"
#include "RSImageStarDoc.h"
#include "RSImageStarView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CAdjustHueDlg dialog


CAdjustHueDlg::CAdjustHueDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CAdjustHueDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CAdjustHueDlg)
	m_check = FALSE;
	m_slid2pos = 0;
	m_slid1pos = 0;
    m_nslid1=100;
	m_nslid2=100;
	//}}AFX_DATA_INIT
}


void CAdjustHueDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAdjustHueDlg)
	DDX_Control(pDX, IDC_SLIDER2, m_slid2);
	DDX_Control(pDX, IDC_SLIDER1, m_slid1);
	DDX_Check(pDX, IDC_CHECK1, m_check);
	DDX_Text(pDX, IDC_EDIT2, m_slid2pos);
	DDV_MinMaxInt(pDX, m_slid2pos, -100, 100);
	DDX_Text(pDX, IDC_EDIT1, m_slid1pos);
	DDV_MinMaxInt(pDX, m_slid1pos, -100, 100);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CAdjustHueDlg, CDialog)
	//{{AFX_MSG_MAP(CAdjustHueDlg)
	ON_WM_HSCROLL()
	ON_BN_CLICKED(IDC_CHECK1, OnCheck1)
	ON_WM_DESTROY()
	ON_EN_CHANGE(IDC_EDIT1, OnChangeEdit1)
	ON_EN_CHANGE(IDC_EDIT2, OnChangeEdit2)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CAdjustHueDlg message handlers



void CAdjustHueDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
	// TODO: Add your message handler code here and/or call default
	CFrameWnd* lpFrameWnd = STATIC_DOWNCAST(CFrameWnd, AfxGetMainWnd());
	if( lpFrameWnd == NULL ) return;
    CRSImageStarView* lpView = (CRSImageStarView*)lpFrameWnd->GetActiveFrame()->GetActiveView();
    if(lpView)
	{
	   m_nslid1=m_slid1.GetPos();
	   m_nslid2=m_slid2.GetPos();
	   if(lpView->m_pDoc->m_Dib!=NULL)
	   {
	      switch(pScrollBar->GetDlgCtrlID())
		  {
		    case IDC_SLIDER1:
			   str.Format("%d",(m_nslid1-100));
			   pEdit1->SetWindowText(str);
			   if(m_check)
			   {
			       if(nSBCode!=SB_THUMBTRACK)
				   {
				      AdjustBrightness(m_nslid1);
			          if(m_nslid2!=100)
                         AdjustContrast(m_nslid2);
				   }
			   }
			   break;
			case IDC_SLIDER2:
			   str.Format("%d",(m_nslid2-100));
			   pEdit2->SetWindowText(str);
			   if(m_check)
			      if(nSBCode!=SB_THUMBTRACK)
			          AdjustContrast(m_nslid2);
			   break;
		  }
	      lpView->Invalidate(false);
	   }
	}
	CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
}

BOOL CAdjustHueDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();
	m_slid1.SetRange(0,200,false);
	m_slid2.SetRange(0,200,false);
	m_slid1.SetPos(100);
	m_slid2.SetPos(100);

	CFrameWnd* lpFrameWnd = STATIC_DOWNCAST(CFrameWnd, AfxGetMainWnd());
	if( lpFrameWnd == NULL ) return 0;
    CRSImageStarView* lpView = (CRSImageStarView*)lpFrameWnd->GetActiveFrame()->GetActiveView();
    if(lpView->m_pDoc->m_Dib->m_hPreDib==NULL)
		return false;
	DWORD dwSize = GlobalSize(lpView->m_pDoc->m_Dib->m_hPreDib);
    ASSERT(dwSize);
  	LPBYTE lpDib = (LPBYTE) ::GlobalLock(lpView->m_pDoc->m_Dib->m_hPreDib);
    ASSERT(lpDib);
	if( m_hDib != NULL )
    {
		GlobalUnlock( m_hDib );
        GlobalFree( m_hDib );
        m_hDib = NULL;
    }
	m_hDib      = ::GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, dwSize);
   	LPBYTE lpfile = (LPBYTE) ::GlobalLock(m_hDib);
	if( m_hDib1 != NULL )
    {
		GlobalUnlock( m_hDib1 );
        GlobalFree( m_hDib1 );
        m_hDib1 = NULL;
    }
	m_hDib1      = ::GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, dwSize);
   	LPBYTE lpfile1 = (LPBYTE) ::GlobalLock(m_hDib1);
	memcpy(lpfile,lpDib,dwSize); 
	memcpy(lpfile1,lpDib,dwSize); 
    ::GlobalUnlock(lpView->m_pDoc->m_Dib->m_hPreDib);
    ::GlobalUnlock(m_hDib);
    ::GlobalUnlock(m_hDib1);
    m_slid1pos=0;
	m_slid2pos=0;

	pEdit1=(CEdit*)GetDlgItem(IDC_EDIT1);
	pEdit2=(CEdit*)GetDlgItem(IDC_EDIT2);

	CButton* button= (CButton*)GetDlgItem(IDC_CHECK1);
    m_check=true;
	lpView->m_PreView=true;
    button->SetCheck(m_check);
	// TODO: Add extra initialization here

	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

void CAdjustHueDlg::OnCheck1() 
{
	// TODO: Add your control notification handler code here
    m_check=m_check?false:true;
	CFrameWnd* lpFrameWnd = STATIC_DOWNCAST(CFrameWnd, AfxGetMainWnd());
	if( lpFrameWnd == NULL ) return;
    CRSImageStarView* lpView = (CRSImageStarView*)lpFrameWnd->GetActiveFrame()->GetActiveView();
	if(!m_check)
	{
       lpView->m_PreView=false;
	   lpView->Invalidate();
	}
	else
	{
	    if(m_nslid1!=100)
		   AdjustBrightness(m_nslid1);
		if(m_nslid2!=100)
             AdjustContrast(m_nslid2);    
		lpView->m_PreView=true;
	    lpView->Invalidate();
	}
}

BOOL CAdjustHueDlg::AdjustBrightness(int Percentage)
{
  if (m_hDib == NULL)
    return FALSE;

  if (Percentage < 0)
    return FALSE;
  BOOL bSuccess = TRUE;
  CFrameWnd* lpFrameWnd = STATIC_DOWNCAST(CFrameWnd, AfxGetMainWnd());
  if( lpFrameWnd == NULL ) return 0;
  CRSImageStarView* lpView = (CRSImageStarView*)lpFrameWnd->GetActiveFrame()->GetActiveView();
 
   LPBYTE lpDib = (LPBYTE) ::GlobalLock(lpView->m_pDoc->m_Dib->m_hPreDib);
   ASSERT(lpDib);
   LPBITMAPINFO lpbmi=(LPBITMAPINFO)lpDib;
   int numcolor=lpView->m_pDoc->m_Dib->GetColorMapNum(lpbmi->bmiHeader.biBitCount);
   int DibInfoSize = sizeof(BITMAPINFOHEADER) + numcolor*sizeof(RGBQUAD);
   LPBYTE lpdata=lpDib+DibInfoSize;

   int width=lpbmi->bmiHeader.biWidth;
   int width1=(lpbmi->bmiHeader.biWidth*lpbmi->bmiHeader.biBitCount/8+3)&~3;
   int height=lpbmi->bmiHeader.biHeight;

   LPBYTE lpfile = (LPBYTE) ::GlobalLock(m_hDib);
   LPBITMAPINFO lpbmi1=(LPBITMAPINFO)lpfile;

   LPBYTE lpdata1=lpfile+DibInfoSize;
   float scale=float(Percentage/100.0);
   if(lpbmi->bmiHeader.biBitCount>8)
   {
	   for (int y=0;y<height; y++)
	   {
	       RGBTRIPLE* pixptr = (RGBTRIPLE*)(lpdata1);
	       RGBTRIPLE* pixptr1 = (RGBTRIPLE*)(lpdata);
		   for (int x=0;x<width; x++)
		   {
			   pixptr1[x].rgbtRed = min(int(pixptr[x].rgbtRed*scale),255);
			   pixptr1[x].rgbtGreen =min(int(pixptr[x].rgbtGreen*scale),255);
			   pixptr1[x].rgbtBlue =min(int(pixptr[x].rgbtBlue*scale), 255);
		   }
		   lpdata+=width1;
		   lpdata1+=width1;
	   }
	   DWORD dwSize = GlobalSize(m_hDib1);
       ASSERT(dwSize);
   	   LPBYTE lpfile1 = (LPBYTE) ::GlobalLock(m_hDib1);
	   memcpy(lpfile1,lpDib,dwSize); 
       ::GlobalUnlock(m_hDib1);
   }
   else
   {
      for(int i= 0; i < numcolor; i++)
	  {
		  lpbmi->bmiColors[i].rgbBlue  =min(int(lpbmi1->bmiColors[i].rgbBlue*scale),255);
		  lpbmi->bmiColors[i].rgbGreen =min(int(lpbmi1->bmiColors[i].rgbGreen*scale),255);
		  lpbmi->bmiColors[i].rgbRed   =min(int(lpbmi1->bmiColors[i].rgbRed*scale),255);
	  }
   	   LPBYTE lpfile1 = (LPBYTE) ::GlobalLock(m_hDib1);
       LPBITMAPINFO lpbmi2=(LPBITMAPINFO)lpfile1;
       for( i= 0; i < numcolor; i++)
		   lpbmi2->bmiColors[i]=lpbmi->bmiColors[i];
       ::GlobalUnlock(m_hDib1);
  }
  ::GlobalUnlock(lpView->m_pDoc->m_Dib->m_hPreDib);
  ::GlobalUnlock(m_hDib);
  return bSuccess;
}

BOOL CAdjustHueDlg::AdjustContrast(int Percentage)
{
  if (m_hDib == NULL)
    return FALSE;

  if (Percentage < 0)
    return FALSE;
   BOOL bSuccess = TRUE;
   CFrameWnd* lpFrameWnd = STATIC_DOWNCAST(CFrameWnd, AfxGetMainWnd());
   if( lpFrameWnd == NULL ) return 0;
   CRSImageStarView* lpView = (CRSImageStarView*)lpFrameWnd->GetActiveFrame()->GetActiveView();
 
   LPBYTE lpDib = (LPBYTE) ::GlobalLock(lpView->m_pDoc->m_Dib->m_hPreDib);
   ASSERT(lpDib);
   LPBITMAPINFO lpbmi=(LPBITMAPINFO)lpDib;
   int numcolor=lpView->m_pDoc->m_Dib->GetColorMapNum(lpbmi->bmiHeader.biBitCount);
   int DibInfoSize = sizeof(BITMAPINFOHEADER) + numcolor*sizeof(RGBQUAD);
   LPBYTE lpdata=lpDib+DibInfoSize;

   int width=lpbmi->bmiHeader.biWidth;
   int width1=(lpbmi->bmiHeader.biWidth*lpbmi->bmiHeader.biBitCount/8+3)&~3;
   int height=lpbmi->bmiHeader.biHeight;

   LPBYTE lpfile = (LPBYTE) ::GlobalLock(m_hDib1);
   LPBITMAPINFO lpbmi1=(LPBITMAPINFO)lpfile;

   LPBYTE lpdata1=lpfile+DibInfoSize;
   float scale=float(Percentage/100.0);

   if(lpbmi->bmiHeader.biBitCount>8)
   {
	   for (int y=0;y<height; y++)
	   {
		   RGBTRIPLE* pixptr = (RGBTRIPLE*)(lpdata1);
		   RGBTRIPLE* pixptr1 = (RGBTRIPLE*)(lpdata);	
		   for (int x=0;x<width; x++)
		   {
			   int value=128 + int((pixptr[x].rgbtRed - 128)*scale);
			   if(value<0)
				   value=0;
			   pixptr1[x].rgbtRed = min(value, 255);
			   value=128 + int((pixptr[x].rgbtGreen - 128)*scale);
			   if(value<0)
				   value=0;
			   pixptr1[x].rgbtGreen = min(value, 255);
			   value=128 + int((pixptr[x].rgbtBlue - 128)*scale);
			   if(value<0)
				   value=0;
			   pixptr1[x].rgbtBlue = min(value, 255);
		   }
		   lpdata+=width1;
		   lpdata1+=width1;
	   }
  }
  else
  {
      for(int i= 0; i < numcolor; i++)
	  {
		  int value=128 + int((lpbmi1->bmiColors[i].rgbRed - 128)*scale);
		  if(value<0)
			  value=0;
		  lpbmi->bmiColors[i].rgbRed = min(value, 255);
		  value=128 + int((lpbmi1->bmiColors[i].rgbGreen - 128)*scale);
		  if(value<0)
			  value=0;
		  lpbmi->bmiColors[i].rgbGreen = min(value, 255);
		  value=128 + int((lpbmi1->bmiColors[i].rgbBlue - 128)*scale);
		  if(value<0)
			  value=0;
		  lpbmi->bmiColors[i].rgbBlue = min(value, 255);
	  }
  }
  ::GlobalUnlock(lpView->m_pDoc->m_Dib->m_hPreDib);
  ::GlobalUnlock(m_hDib1);
  return bSuccess;
}


void CAdjustHueDlg::OnDestroy() 
{
	CDialog::OnDestroy();
	
	// TODO: Add your message handler code here
    if(m_hDib!=NULL)
	{
        GlobalUnlock(m_hDib);
		GlobalFree(m_hDib);
		m_hDib=NULL;
	}
    if(m_hDib1!=NULL)
	{
		GlobalUnlock(m_hDib1);
		GlobalFree(m_hDib1);
		m_hDib1=NULL;
	}
	CFrameWnd* lpFrameWnd = STATIC_DOWNCAST(CFrameWnd, AfxGetMainWnd());
	if( lpFrameWnd == NULL ) return ;
    CRSImageStarView* lpView = (CRSImageStarView*)lpFrameWnd->GetActiveFrame()->GetActiveView();
	lpView->m_PreView=false; 
}


void CAdjustHueDlg::OnChangeEdit1() 
{
	// TODO: If this is a RICHEDIT control, the control will not
	// send this notification unless you override the CDialog::OnInitDialog()
	// function and call CRichEditCtrl().SetEventMask()
	// with the ENM_CHANGE flag ORed into the mask.
	
	// TODO: Add your control notification handler code here
	CFrameWnd* lpFrameWnd = STATIC_DOWNCAST(CFrameWnd, AfxGetMainWnd());
	if( lpFrameWnd == NULL ) return;
    CRSImageStarView* lpView = (CRSImageStarView*)lpFrameWnd->GetActiveFrame()->GetActiveView();
    if(lpView==NULL)
		return;
    UpdateData(TRUE);
    if(m_nslid1!=(100+m_slid1pos))
	{
		m_nslid1=(100+m_slid1pos);
	    m_slid1.SetPos(m_nslid1);
		if(m_check)
		{
           AdjustBrightness(m_nslid1);
		   lpView->Invalidate(false);
		}
	}	
}

void CAdjustHueDlg::OnChangeEdit2() 
{
	// TODO: If this is a RICHEDIT control, the control will not
	// send this notification unless you override the CDialog::OnInitDialog()
	// function and call CRichEditCtrl().SetEventMask()
	// with the ENM_CHANGE flag ORed into the mask.
	
	// TODO: Add your control notification handler code here
	CFrameWnd* lpFrameWnd = STATIC_DOWNCAST(CFrameWnd, AfxGetMainWnd());
	if( lpFrameWnd == NULL ) return;
    CRSImageStarView* lpView = (CRSImageStarView*)lpFrameWnd->GetActiveFrame()->GetActiveView();
    if(lpView==NULL)
		return;
    UpdateData(TRUE);
    if(m_nslid2!=(100+m_slid2pos))
	{
		m_nslid2=(100+m_slid2pos);
	    m_slid2.SetPos(m_nslid2);
		if(m_check)
		{
           AdjustContrast(m_nslid2);
		   lpView->Invalidate(false);
		}
	}	
	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -