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

📄 imageprocessingview.cpp

📁 含《Visual c++数字图像处理典型算法及实现》这本书里所有源代码
💻 CPP
字号:
// ImageProcessingView.cpp : implementation of the CImageProcessingView class
//

#include "stdafx.h"
#include "ImageProcessing.h"

#include "ImageProcessingDoc.h"
#include "ImageProcessingView.h"
#include  "GlobalApi.h"
#include  "DlgCoding.h"
#include <complex>
using namespace std;


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

/////////////////////////////////////////////////////////////////////////////
// CImageProcessingView

IMPLEMENT_DYNCREATE(CImageProcessingView, CScrollView)

BEGIN_MESSAGE_MAP(CImageProcessingView, CScrollView)
	//{{AFX_MSG_MAP(CImageProcessingView)
	ON_COMMAND(ID_CODING_SHANFINO, OnCodingShanfino)
	ON_COMMAND(ID_CODING_ARITH, OnCodingArith)
	ON_COMMAND(ID_CODING_BITPLANE, OnCodingBitplane)
	ON_COMMAND(ID_CODING_HUFFMAN, OnCodingHuffman)
	ON_COMMAND(ID_CODING_LOADIMG, OnCodingLoadimg)
	ON_COMMAND(ID_CODING_WRITEIMG, OnCodingWriteimg)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CScrollView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CImageProcessingView construction/destruction

CImageProcessingView::CImageProcessingView()
{
	// 为小波变换设置的参数
	// 临时存放小波变换系数内存
	m_pDbImage = NULL;	
	
	// 设置当前层数
	m_nDWTCurDepth = 0;

	// 设置小波基紧支集长度
	m_nSupp = 1;
}

CImageProcessingView::~CImageProcessingView()
{
	// 释放已分配内存
	if(m_pDbImage){
		delete[]m_pDbImage;
		m_pDbImage = NULL;
	}
}

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

	return CScrollView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CImageProcessingView drawing

void CImageProcessingView::OnDraw(CDC* pDC)
{
	CImageProcessingDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	
	CSize sizeDibDisplay;		
	

	
	if(!pDoc->m_pDibInit->IsEmpty()){	
		sizeDibDisplay = pDoc->m_pDibInit->GetDimensions();
		pDoc->m_pDibInit->Draw(pDC,CPoint(0,0),sizeDibDisplay);	
	}	

}

void CImageProcessingView::OnInitialUpdate()
{
	CScrollView::OnInitialUpdate();

	CImageProcessingDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	
	CSize sizeTotal = pDoc->m_pDibInit->GetDimensions();
	SetScrollSizes(MM_TEXT, sizeTotal);

	GetParentFrame()->RecalcLayout();
	ResizeParentToFit();

}

/////////////////////////////////////////////////////////////////////////////
// CImageProcessingView printing

BOOL CImageProcessingView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CImageProcessingView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CImageProcessingView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CImageProcessingView diagnostics

#ifdef _DEBUG
void CImageProcessingView::AssertValid() const
{
	CScrollView::AssertValid();
}

void CImageProcessingView::Dump(CDumpContext& dc) const
{
	CScrollView::Dump(dc);
}

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

/////////////////////////////////////////////////////////////////////////////
// CImageProcessingView message handlers






void CImageProcessingView::OnCodingHuffman() 
{
	// 哈夫曼编码表
	
	// 获取文档
	CImageProcessingDoc * pDoc = GetDocument();
	
	// 指向源图象象素的指针
	unsigned char *	lpSrc;
		
	// 图象的高度和宽度
	LONG	lHeight;
	LONG	lWidth;
	
	// 图象每行的字节数
	LONG	lLineBytes;
	
	// 图象象素总数
	LONG	lCountSum;
	
	// 循环变量
	LONG	i;
	LONG	j;
	
	// 数组指针用来保存各个灰度值出现概率
	double * dProba;
	
	// 当前图象颜色数目
	int		nColorNum;

	//  获得图象CDib类的指针
	CDib * pDib = pDoc->m_pDibInit;
			
	//图象数据的指针
	LPBYTE  lpDIBBits = pDib->m_lpImage;

	// 头文件信息
	LPBITMAPINFOHEADER lpBMIH=pDib->m_lpBMIH;

	// 判断是否是8-bpp位图(只处理8-bpp位图的霍夫曼编码)
	if (lpBMIH->biBitCount != 8)
	{
		// 提示用户
		MessageBox("目前只支持256色位图的霍夫曼编码!", "系统提示" ,
			MB_ICONINFORMATION | MB_OK);
						
		// 返回
		return;
	}
	
	// 更改光标形状
	BeginWaitCursor();
	
	/********************************************************************
	   开始计算各个灰度级出现的概率	

	   如果需要对指定的序列进行哈夫曼编码,
	   只要将这一步改成给各个灰度级概率赋值即可
	**********************************************************************
	*/
	
	//  由头文件信息得到图象的比特数,从而得到颜色信息
	nColorNum = (int)pow(2,lpBMIH->biBitCount);

	// 分配内存
	dProba = new double[nColorNum];
	
	//得到图象的宽度和高度
	CSize   SizeDim;
	SizeDim = pDib->GetDimensions();
	lWidth = SizeDim.cx;
	lHeight = SizeDim.cy;

	// 计算图象象素总数
	lCountSum = lHeight * lWidth;
	
	//得到实际的Dib图象存储大小
	CSize   SizeRealDim;
	SizeRealDim = pDib->GetDibSaveDim();

	// 计算图象每行的字节数
	lLineBytes = SizeRealDim.cx;
	
	// 赋零值
	for (i = 0; i < nColorNum; i ++)
	{
		dProba[i] = 0.0;
	}
	
	// 计算各个灰度值的计数
	for (i = 0; i < lHeight; i ++)
	{
		for (j = 0; j < lWidth; j ++)
		{
			// 指向图象指针
			lpSrc = lpDIBBits + lLineBytes * i + j;
			
			// 计数加1
			dProba[*(lpSrc)] = dProba[*(lpSrc)] + 1;
		}
	}
		
	
	// 计算各个灰度值出现的概率
	for (i = 0; i < nColorNum; i ++)
	{
		dProba[i] = dProba[i] / (FLOAT)lCountSum;
	}
	
	/***************************************************
	 构建霍夫曼编码的码表
	 并用对话框显示霍夫曼码表
	****************************************************/
	
	// 创建对话框
	CDlgHuffman dlgCoding;
	
	// 初始化变量值
	dlgCoding.dProba = dProba;
	dlgCoding.nColorNum = nColorNum;
	
	// 显示对话框
	dlgCoding.DoModal();
		
	// 恢复光标
	EndWaitCursor();
	
}

void CImageProcessingView::OnCodingShanfino() 
{
	// 香农-弗诺编码表
	
	// 获取文档
	CImageProcessingDoc * pDoc = GetDocument();
	
	// 指向源图象象素的指针
	unsigned char *	lpSrc;
		
	// 图象的高度
	LONG	lHeight;
	LONG	lWidth;
	
	// 图象每行的字节数
	LONG	lLineBytes;
	
	// 获取当前DIB颜色数目
	int		nColorNum;
	
	// 图象象素总数
	LONG	lCountSum;
	
	// 循环变量
	LONG	i;
	LONG	j;
	
	// 保存各个灰度值出现概率的数组指针
	double * dProba;	

	//  获得图象CDib类的指针
	CDib * pDib = pDoc->m_pDibInit;
			
	//图象数据的指针
	LPBYTE  lpDIBBits = pDib->m_lpImage;

	// 头文件信息
	LPBITMAPINFOHEADER lpBMIH=pDib->m_lpBMIH;

	// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的香农-费诺编码)
	if (lpBMIH->biBitCount != 8)
	{
		// 提示用户
		MessageBox("目前只支持256色位图的香农-费诺编码!", "系统提示" ,
			MB_ICONINFORMATION | MB_OK);
						
		// 返回
		return;
	}
	
	// 更改光标形状
	BeginWaitCursor();
	
	/******************************************************************************
	// 开始计算各个灰度级出现的概率	
	//
	// 如果需要对指定的序列进行香农-弗诺编码,
	//只要将这一步改成给各个灰度级概率赋值即可
	*****************************************************************************
	*/
	//  灰度值总数的计算
	nColorNum = (int)pow(2,lpBMIH->biBitCount);

	// 分配内存
	dProba = new double[nColorNum];
	
	//得到图象的宽度和高度
	CSize   SizeDim;
	SizeDim = pDib->GetDimensions();
	lWidth = SizeDim.cx;
	lHeight = SizeDim.cy;

	// 计算图象象素总数
	lCountSum = lHeight * lWidth;
	
	//得到实际的Dib图象存储大小
	CSize   SizeRealDim;
	SizeRealDim = pDib->GetDibSaveDim();

	// 计算图象每行的字节数
	lLineBytes = SizeRealDim.cx;

	// 计算图象象素总数
	lCountSum = lHeight * lWidth;
	
	// 重置计数为0
	for (i = 0; i < nColorNum; i ++)
	{
		dProba[i] = 0.0;
	}
	
	// 计算各个灰度值的计数(对于非256色位图,此处给数组dProba赋值方法将不同)
	for (i = 0; i < lHeight; i ++)
	{
		for (j = 0; j < lWidth; j ++)
		{
			// 指向图象指针
			lpSrc = lpDIBBits + lLineBytes * i + j;
			
			// 计数加1
			dProba[*(lpSrc)] = dProba[*(lpSrc)]+ 1;
		}
	}
	
	
	// 计算各个灰度值出现的概率
	for (i = 0; i < nColorNum; i ++)
	{
		dProba[i] /= (double)lCountSum;
	}
	
	/***************************************************
	 构建香农-费诺编码的码表
	 并用对话框显示香农-费诺码表
	****************************************************/	
	
	// 创建对话框
	CDlgShannon dlgPara;
	
	// 初始化变量值
	dlgPara.m_dProba = dProba;
	dlgPara.m_nColorNum = nColorNum;
	
	// 显示对话框
	dlgPara.DoModal();

	//释放内存
	delete dProba;
		
	// 恢复光标
	EndWaitCursor();
}

void CImageProcessingView::OnCodingArith() 
{
	CDlgArith dlgCoding;
	
	// 显示对话框
	dlgCoding.DoModal();
	
}

void CImageProcessingView::OnCodingBitplane() 
{
	// 创建对话框
	CDlgBitPlane dlgCoding;	
	
	// 显示对话框
	dlgCoding.DoModal();	
	
	BYTE bBitNum = dlgCoding.m_BItNumber;

	// 获取文档
	CImageProcessingDoc * pDoc = GetDocument();
		
	//  获得图象CDib类的指针
	CDib * pDib = pDoc->m_pDibInit;
	
	// 头文件信息
	LPBITMAPINFOHEADER lpBMIH=pDib->m_lpBMIH;

	// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的位平面分解)
	if (lpBMIH->biBitCount != 8)
	{
		// 提示用户
		MessageBox("目前只支持256色位图的位平面分解!", "系统提示" ,
			MB_ICONINFORMATION | MB_OK);
						
		// 返回
		return;
	}
	DIBBITPLANE(pDib,bBitNum);

	// 设置脏标记
	pDoc->SetModifiedFlag(TRUE);
		
	// 更新视图
	pDoc->UpdateAllViews(NULL);
	
}

void CImageProcessingView::OnCodingWriteimg() 
{
	// 对当前图象进行DPCM编码(存为IMG格式文件)
	
	// 获取文档
	CImageProcessingDoc * pDoc = GetDocument();
		
	//  获得图象CDib类的指针
	CDib * pDib = pDoc->m_pDibInit;
			
	//图象数据的指针
	LPBYTE  lpDIBBits = pDib->m_lpImage;

	// 头文件信息
	LPBITMAPINFOHEADER lpBMIH=pDib->m_lpBMIH;

	// 判断是否是8-bpp位图(处理8-bpp位图的DPCM编码)
	if (lpBMIH->biBitCount != 8)
	{
		// 提示用户
		MessageBox("目前只支持256色位图的DPCM编码!", "系统提示" ,
			MB_ICONINFORMATION | MB_OK);
						
		// 返回
		return;
	}
	
	// 更改光标形状
	BeginWaitCursor();
	
	// 文件保存路径
	CString strFilePath;
	
	// 获取原始文件名
	strFilePath = pDoc->GetPathName();
	
	// 更改后缀为IMG
	if (strFilePath.Right(4).CompareNoCase(".BMP") == 0)
	{	
		strFilePath = strFilePath.Left(strFilePath.GetLength()-3) + "IMG";
	}
	else
	{
		strFilePath += ".IMG";
	}

	// 创建SaveAs对话框
	CFileDialog dlg(FALSE, "IMG", strFilePath, 
					OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, 
		            "IMG图象文件 (*.IMG) | *.IMG|所有文件 (*.*) | *.*||", NULL);
	
	// 提示用户选择保存的路径
	if (dlg.DoModal() != IDOK)
	{
		// 恢复光标
		EndWaitCursor();
	
		return;
	}
	
	// 获取用户指定的文件路径
	strFilePath = dlg.GetPathName();
	
	// CFile和CFileException对象
	CFile file;
	CFileException fe;
	
	// 尝试创建指定的IMG文件
	if (!file.Open(strFilePath, CFile::modeCreate |
	  CFile::modeReadWrite | CFile::shareExclusive, &fe))
	{
		MessageBox("打开指定IMG文件时失败!", "系统提示" , 
			MB_ICONINFORMATION | MB_OK);
	
		return;
	}
	
	// 调用WRITE2IMG()函数将当前的DIB保存为IMG文件
	if (::WRITE2IMG(pDib, file))
	{
		MessageBox("成功保存为IMG文件!", "系统提示" , 
			MB_ICONINFORMATION | MB_OK);
	}
	else
	{
		MessageBox("保存为IMG文件失败!", "系统提示" , 
			MB_ICONINFORMATION | MB_OK);
	}	
		
	// 恢复光标
	EndWaitCursor();
	
}


void CImageProcessingView::OnCodingLoadimg() 
{
	// 读入IMG文件
	
	// 获取文档
	CImageProcessingDoc * pDoc = GetDocument();
		
	//  获得图象CDib类的指针
	CDib * pDib = pDoc->m_pDibInit;

	// 文件路径
	CString strFilePath;
	
	// 创建Open对话框
	CFileDialog dlg(TRUE, "PCX", NULL,
					OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, 
					"IMG图象文件 (*.PCX) | *.IMG|所有文件 (*.*) | *.*||", NULL);
	
	// 提示用户选择保存的路径
	if (dlg.DoModal() != IDOK)
	{
		// 返回
		return;
	}
	
	// 获取用户指定的文件路径
	strFilePath = dlg.GetPathName();
	
	// CFile和CFileException对象
	CFile file;
	CFileException fe;
	
	// 尝试打开指定的PCX文件
	if (!file.Open(strFilePath, CFile::modeRead | CFile::shareDenyWrite, &fe))
	{
		// 提示用户
		MessageBox("打开指定PCX文件时失败!", "系统提示" , 
			MB_ICONINFORMATION | MB_OK);
		
		// 返回
		return;
	}
	
	// 更改光标形状
	BeginWaitCursor();

	// 调用LOADIMG()函数读取指定的IMG文件
	BOOL Succ = LOADIMG(pDib, file);

	if (Succ == TRUE)
	{
		// 提示用户
		MessageBox("成功读取IMG文件!", "系统提示" , 
			MB_ICONINFORMATION | MB_OK);
		
	}
	else
	{
		// 提示用户
		MessageBox("读取IMG文件失败!", "系统提示" , 
			MB_ICONINFORMATION | MB_OK);
	}

	// 更新视图
	pDoc->UpdateAllViews(NULL);
	
	// 恢复光标
	EndWaitCursor();
	
}

⌨️ 快捷键说明

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