📄 imageprocessingview.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 + -