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

📄 grayview.cpp

📁 vc++6.0编译的一个程序
💻 CPP
字号:
// GrayView.cpp : implementation of the CGrayView class
//

#include "stdafx.h"
#include "Gray.h"

#include "GrayDoc.h"
#include "GrayView.h"
#include "Paramar.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif


#include "GrayProcess.h"
#include "juanji.h"
int tempa;
int tempb;
int tempc;
int tempd;
int tempe;
int tempf[3][3];
int tempalldivide;
/////////////////////////////////////////////////////////////////////////////
// CGrayView

IMPLEMENT_DYNCREATE(CGrayView,  CView)

BEGIN_MESSAGE_MAP(CGrayView,  CView)
	//{{AFX_MSG_MAP(CGrayView)
	ON_COMMAND(IDM_COLOR_TO_GRAY,  OnColorToGray)
	ON_UPDATE_COMMAND_UI(IDM_COLOR_TO_GRAY,  OnUpdateColorToGray)
	ON_COMMAND(IDM_GRAY_LINEARIZE,  OnGrayLinearize)
	ON_UPDATE_COMMAND_UI(IDM_GRAY_LINEARIZE,  OnUpdateGrayLinearize)
	ON_UPDATE_COMMAND_UI(IDM_GRAY_REVERSE,  OnUpdateGrayReverse)
	ON_COMMAND(IDM_GRAY_ROUND_OFF,  OnGrayRoundOff)
	ON_UPDATE_COMMAND_UI(IDM_GRAY_ROUND_OFF,  OnUpdateGrayRoundOff)
	ON_COMMAND(IDM_GRAY_SCALE,  OnGrayScale)
	ON_UPDATE_COMMAND_UI(IDM_GRAY_SCALE,  OnUpdateGrayScale)
	ON_COMMAND(IDM_IMAGE_RESTORE,  OnImageRestore)
	ON_UPDATE_COMMAND_UI(IDM_IMAGE_RESTORE,  OnUpdateImageRestore)
	ON_COMMAND(IDM_HISTOGRAM_BALANCE,  OnHistogramBalance)
	ON_UPDATE_COMMAND_UI(IDM_HISTOGRAM_BALANCE,  OnUpdateHistogramBalance)
	ON_COMMAND(IDM_HISTOGRAM_MATCH,  OnHistogramMatch)
	ON_UPDATE_COMMAND_UI(IDM_HISTOGRAM_MATCH,  OnUpdateHistogramMatch)
	ON_COMMAND(IDM_PROBABILITY_MATCH,  OnProbabilityMatch)
	ON_UPDATE_COMMAND_UI(IDM_PROBABILITY_MATCH,  OnUpdateProbabilityMatch)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CGrayView construction/destruction

CGrayView::CGrayView()
{
	// TODO: add construction code here
	m_nWidth = 800;
	m_nHeight = 600;
	m_dwOperation = 0L;
}

CGrayView::~CGrayView()
{
}

BOOL CGrayView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CGrayView drawing

void CGrayView::OnDraw(CDC* pDC)
{
	CGrayDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
	CDib* pDib = pDoc->m_pDib;
	if(pDib)
	{
		BeginWaitCursor();
		m_nWidth = (int)pDib->GetWidth();
		m_nHeight = (int)pDib->GetHeight(); 

		CDC memDC;
		memDC.CreateCompatibleDC(pDC);
		CBitmap ddb;
		ddb.CreateCompatibleBitmap(pDC, m_nWidth, m_nHeight);
		CBitmap* pOldBitmap = memDC.SelectObject(&ddb);

		pDib->Draw(memDC.m_hDC, 0, 0, m_nWidth, m_nHeight, 
					0, 0, m_nWidth, m_nHeight, DIB_RGB_COLORS, SRCCOPY);
		
		if(m_dwOperation == 0L)
			pDC->BitBlt(0, 0, m_nWidth, m_nHeight, &memDC, 0, 0, SRCCOPY);
		else
			MakeGray(pDC, pDib, 0, 0, m_nWidth, m_nHeight);

		memDC.SelectObject(pOldBitmap);
		ddb.DeleteObject();
		EndWaitCursor();
	}
}

/////////////////////////////////////////////////////////////////////////////
// CGrayView diagnostics

#ifdef _DEBUG
void CGrayView::AssertValid() const
{
	CView::AssertValid();
}

void CGrayView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CGrayDoc* CGrayView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CGrayDoc)));
	return (CGrayDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CGrayView message handlers

//彩色转换为灰阶表示
void CGrayView::OnColorToGray() 
{
	// TODO: Add your command handler code here
	m_dwOperation = IMAGE_GRAY_COLOR_GRAYED_OUT;
	Invalidate();
}

void CGrayView::OnUpdateColorToGray(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	if(m_dwOperation == IMAGE_GRAY_COLOR_GRAYED_OUT)
		pCmdUI ->SetCheck(TRUE);
	else
		pCmdUI ->SetCheck(FALSE);	
}

//灰度线性化
void CGrayView::OnGrayLinearize() 
{
	// TODO: Add your command handler code here

	m_dwOperation	= IMAGE_GRAY_LINEARIZE;
	//在这里添加了线性变换的区间的代码
	CParamar dpara = new CParamar;
	if (dpara.DoModal() != IDOK)
	{
		return;
	}
	delete dpara;
	Invalidate();
}

void CGrayView::OnUpdateGrayLinearize(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	if(m_dwOperation == IMAGE_GRAY_LINEARIZE)
		pCmdUI ->SetCheck(TRUE);
	else
		pCmdUI ->SetCheck(FALSE);	
}

void CGrayView::OnUpdateGrayReverse(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	if(m_dwOperation == IMAGE_GRAY_REVERSE)
		pCmdUI ->SetCheck(TRUE);
	else
		pCmdUI ->SetCheck(FALSE);	
}

void CGrayView::OnGrayRoundOff() 
{
	// TODO: Add your command handler code here
	m_dwOperation = IMAGE_GRAY_LINEAR_ROUND_OFF;
	juanji ji = new juanji;
	if (ji.DoModal() != IDOK)
	{
		return;
	}
	delete ji;
	Invalidate();
}

void CGrayView::OnUpdateGrayRoundOff(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	if(m_dwOperation == IMAGE_GRAY_LINEAR_ROUND_OFF)
		pCmdUI ->SetCheck(TRUE);
	else
		pCmdUI ->SetCheck(FALSE);
}

void CGrayView::OnGrayScale() 
{
	// TODO: Add your command handler code here
	m_dwOperation = IMAGE_GRAY_PERCENTAGE;
	Invalidate();
}

void CGrayView::OnUpdateGrayScale(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	if(m_dwOperation == IMAGE_GRAY_PERCENTAGE)
		pCmdUI ->SetCheck(TRUE);
	else
		pCmdUI ->SetCheck(FALSE);
	
}

//恢复图像
void CGrayView::OnImageRestore() 
{
	// TODO: Add your command handler code here
	m_dwOperation = 0L;
	Invalidate();
	
}

void CGrayView::OnUpdateImageRestore(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	if(m_dwOperation == 0L)
		pCmdUI ->SetCheck(TRUE);
	else
		pCmdUI ->SetCheck(FALSE);
}

//灰度直方图均衡化
void CGrayView::OnHistogramBalance() 
{
	// TODO: Add your command handler code here
	m_dwOperation = IMAGE_GRAY_HISTOGRAM_BALANCE;
	Invalidate();	
}

void CGrayView::OnUpdateHistogramBalance(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	if(m_dwOperation == IMAGE_GRAY_HISTOGRAM_BALANCE)
		pCmdUI ->SetCheck(TRUE);
	else
		pCmdUI ->SetCheck(FALSE);	
}

void CGrayView::OnHistogramMatch() 
{
	// TODO: Add your command handler code here
	m_dwOperation = IMAGE_GRAY_HISTOGRAM_MATCH;
	Invalidate();	
	
}

void CGrayView::OnUpdateHistogramMatch(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	if(m_dwOperation == IMAGE_GRAY_HISTOGRAM_MATCH)
		pCmdUI ->SetCheck(TRUE);
	else
		pCmdUI ->SetCheck(FALSE);	
	
}

//灰度概率匹配
void CGrayView::OnProbabilityMatch() 
{
	// TODO: Add your command handler code here
	m_dwOperation = IMAGE_GRAY_STATISTIC_MATCH;
	Invalidate();	
}

void CGrayView::OnUpdateProbabilityMatch(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	if(m_dwOperation == IMAGE_GRAY_STATISTIC_MATCH)
		pCmdUI ->SetCheck(TRUE);
	else
		pCmdUI ->SetCheck(FALSE);
	
}


void CGrayView::MakeGray(CDC *pDC,  CDib *pDib,  int x,  int y,  int nWidth,  int nHeight)
{
	ASSERT(pDib);
		//限制处理的区域----防止任意填写数据而使用访问无效
	if((x > (m_nWidth - 1)) || (y > (m_nHeight - 1))) return ;
	//实际处理的宽度和高度
	int w = min(nWidth, m_nWidth - x);
	int h = min(nHeight, m_nHeight - y);
	
	// 32位颜色数据
	DWORD dwSize = m_nWidth * m_nHeight * 4;
	//分配全局内存 32位源数据

	BYTE* pbyBits32 =  new BYTE[dwSize];
	if(pbyBits32 == NULL) return;
	memset(pbyBits32, 0, dwSize);

	//CDib类只提供了一个全部数据的函数
	pDib->GetDdbData32(pbyBits32);


	//对比度处理
	CGrayProcess* gp = new CGrayProcess();
	gp->SetOperation(m_dwOperation);

	//该数组只对直方图规定化起作用:
	//注意, 灰度等级是256级, 必须保证数组有256个元数
	int anFrequencies[256];
	switch(m_dwOperation)
	{
		//灰度比例化
		case IMAGE_GRAY_PERCENTAGE:
		{
			gp->SetParam1i(150);
			break;
		}
		//灰度线性化:
		case IMAGE_GRAY_LINEARIZE:
		{
			gp->SetParam4by(tempa, tempb, tempc, tempd,tempe);
			break;
		}

		//卷积
		case IMAGE_GRAY_LINEAR_ROUND_OFF:
		{
			gp->GetJuanji(tempf[0][0],tempf[0][1],tempf[0][2],tempf[1][0],tempf[1][1],tempf[1][2],
				tempf[2][0],tempf[2][1],tempf[2][2],tempalldivide);
			break;
		}
		//灰度直方图规定化(即灰度直方图匹配)
		case IMAGE_GRAY_HISTOGRAM_MATCH:
		{
			//灰度分布频数, 可以通过频率乘以总样本数得到
			//初始化
			int i = 0;
			for(i = 0;i < 256;i++)
				anFrequencies[i] = 0;
			//提供5级灰度
			//如果两个整数相等, 无论它们为0或100, 其频率都是相等的
			anFrequencies[0] = 1;
			for(i = 63;i < 256;i += 64)
				anFrequencies[i] = 1;
			gp->SetParam1iv(anFrequencies);
			
			break;
		}
		case IMAGE_GRAY_STATISTIC_MATCH:
		{
			gp->SetParam2i(100, 192);
			break;
		}

		default:break;
	}
	

	//获取数据后, 其基本参考点变为(0, 0).
	gp->MakeGray(pbyBits32, x, y, w, h, m_nWidth, m_nHeight);

	CClientDC dc(this);
	CDC memDC;
	memDC.CreateCompatibleDC(&dc);
	HBITMAP hBitmap = gp->CreateDdb(pDC->m_hDC, m_nWidth, m_nHeight, pbyBits32);
	HBITMAP hOldBitmap = (HBITMAP)memDC.SelectObject(hBitmap);
	pDC->BitBlt(0, 0, m_nWidth, m_nHeight, &memDC, 0, 0, SRCCOPY);
	::DeleteObject(hBitmap);
	memDC.SelectObject(hOldBitmap);

	delete gp;
	delete[] pbyBits32; 
	ReleaseDC(&dc);
}




⌨️ 快捷键说明

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