?? 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 + -