?? ch1_1view.cpp
字號:
EndWaitCursor();
}
void CCh1_1View::OnFILE256ToGray()
{
// 將256色位圖轉換成灰度圖
// 獲取文檔
CCh1_1Doc* pDoc = GetDocument();
// 指向DIB的指針
LPSTR lpDIB;
// 鎖定DIB
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
// 顏色表中的顏色數目
WORD wNumColors;
// 獲取DIB中顏色表中的顏色數目
wNumColors = ::DIBNumColors(lpDIB);
// 判斷是否是8-bpp位圖
if (wNumColors != 256)
{
// 提示用戶
MessageBox("非256色位圖!", "系統提示" , MB_ICONINFORMATION | MB_OK);
// 解除鎖定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 返回
return;
}
// 更改光標形狀
BeginWaitCursor();
// 指向DIB象素指針
LPSTR lpDIBBits;
// 指向DIB象素的指針
BYTE * lpSrc;
// 循環變量
LONG i;
LONG j;
// 圖像寬度
LONG lWidth;
// 圖像高度
/* LONG lHeight;
// 圖像每行的字節數
LONG lLineBytes;
// 指向BITMAPINFO結構的指針(Win3.0)
LPBITMAPINFO lpbmi;
// 指向BITMAPCOREINFO結構的指針
LPBITMAPCOREINFO lpbmc;
// 表明是否是Win3.0 DIB的標記
BOOL bWinStyleDIB;
// 獲取指向BITMAPINFO結構的指針(Win3.0)
lpbmi = (LPBITMAPINFO)lpDIB;
// 獲取指向BITMAPCOREINFO結構的指針
lpbmc = (LPBITMAPCOREINFO)lpDIB;
// 灰度映射表
BYTE bMap[256];
// 判斷是否是WIN3.0的DIB
bWinStyleDIB = IS_WIN30_DIB(lpDIB);
// 計算灰度映射表(保存各個顏色的灰度值),并更新DIB調色板
for (i = 0; i < 256; i ++)
{
if (bWinStyleDIB)
{
// 計算該顏色對應的灰度值
bMap[i] = (BYTE)(0.299 * lpbmi->bmiColors[i].rgbRed +
0.587 * lpbmi->bmiColors[i].rgbGreen +
0.114 * lpbmi->bmiColors[i].rgbBlue + 0.5);
// 更新DIB調色板紅色分量
lpbmi->bmiColors[i].rgbRed = i;
// 更新DIB調色板綠色分量
lpbmi->bmiColors[i].rgbGreen = i;
// 更新DIB調色板藍色分量
lpbmi->bmiColors[i].rgbBlue = i;
// 更新DIB調色板保留位
lpbmi->bmiColors[i].rgbReserved = 0;
}
else
{
// 計算該顏色對應的灰度值
bMap[i] = (BYTE)(0.299 * lpbmc->bmciColors[i].rgbtRed +
0.587 * lpbmc->bmciColors[i].rgbtGreen +
0.114 * lpbmc->bmciColors[i].rgbtBlue + 0.5);
// 更新DIB調色板紅色分量
lpbmc->bmciColors[i].rgbtRed = i;
// 更新DIB調色板綠色分量
lpbmc->bmciColors[i].rgbtGreen = i;
// 更新DIB調色板藍色分量
lpbmc->bmciColors[i].rgbtBlue = i;
}
}
// 找到DIB圖像象素起始位置
lpDIBBits = ::FindDIBBits(lpDIB);
// 獲取圖像寬度
lWidth = ::DIBWidth(lpDIB);
// 獲取圖像高度
lHeight = ::DIBHeight(lpDIB);
// 計算圖像每行的字節數
lLineBytes = WIDTHBYTES(lWidth * 8);
// 更換每個象素的顏色索引(即按照灰度映射表換成灰度值)
// 每行
for(i = 0; i < lHeight; i++)
{
// 每列
for(j = 0; j < lWidth; j++)
{
// 指向DIB第i行,第j個象素的指針
lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + j;
// 變換
*lpSrc = bMap[*lpSrc];
}
}
// 替換當前調色板為灰度調色板
pDoc->GetDocPalette()->SetPaletteEntries(0, 256, (LPPALETTEENTRY) ColorsTable[0]);
// 設置臟標記
pDoc->SetModifiedFlag(TRUE);
// 實現新的調色板
OnDoRealize((WPARAM)m_hWnd,0);
// 更新視圖
pDoc->UpdateAllViews(NULL);
// 解除鎖定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 恢復光標
EndWaitCursor();
}
//////////////////////////////////////////////////////////////////////////////////////
// 圖像正交變換
//
void CCh1_1View::OnFreqFour()
{
// 圖像付立葉變換
// 獲取文檔
CCh1_1Doc* pDoc = GetDocument();
// 指向DIB的指針
LPSTR lpDIB;
// 指向DIB象素指針
LPSTR lpDIBBits;
// 鎖定DIB
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
// 找到DIB圖像象素起始位置
lpDIBBits = ::FindDIBBits(lpDIB);
// 判斷是否是8-bpp位圖(這里為了方便,只處理8-bpp位圖的付立葉變換,其它的可以類推)
if (::DIBNumColors(lpDIB) != 256)
{
// 提示用戶
MessageBox("目前只支持256色位圖的付立葉變換!", "系統提示" ,
MB_ICONINFORMATION | MB_OK);
// 解除鎖定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 返回
return;
}
// 更改光標形狀
BeginWaitCursor();
// 調用Fourier()函數進行付立葉變換
if (::Fourier(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB)))
{
// 設置臟標記
pDoc->SetModifiedFlag(TRUE);
// 更新視圖
pDoc->UpdateAllViews(NULL);
}
else
{
// 提示用戶
MessageBox("分配內存失敗!", "系統提示" , MB_ICONINFORMATION | MB_OK);
}
// 解除鎖定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 恢復光標
EndWaitCursor();
}
void CCh1_1View::OnFreqDct()
{
// 圖像離散余弦變換
// 獲取文檔
CCh1_1Doc* pDoc = GetDocument();
// 指向DIB的指針
LPSTR lpDIB;
// 指向DIB象素指針
LPSTR lpDIBBits;
// 鎖定DIB
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
// 找到DIB圖像象素起始位置
lpDIBBits = ::FindDIBBits(lpDIB);
// 判斷是否是8-bpp位圖(這里為了方便,只處理8-bpp位圖的離散余弦變換,其它的可以類推)
if (::DIBNumColors(lpDIB) != 256)
{
// 提示用戶
MessageBox("目前只支持256色位圖的離散余弦變換!", "系統提示" ,
MB_ICONINFORMATION | MB_OK);
// 解除鎖定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 返回
return;
}
// 更改光標形狀
BeginWaitCursor();
// 調用DIBDct()函數進行離散余弦變換
if (::DIBDct(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB)))
{
// 設置臟標記
pDoc->SetModifiedFlag(TRUE);
// 更新視圖
pDoc->UpdateAllViews(NULL);
}
else
{
// 提示用戶
MessageBox("分配內存失敗!", "系統提示" , MB_ICONINFORMATION | MB_OK);
}
// 解除鎖定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 恢復光標
EndWaitCursor();
}
void CCh1_1View::OnFreqWalh()
{
// 圖像沃爾什-哈達瑪變換
// 獲取文檔
CCh1_1Doc* pDoc = GetDocument();
// 指向DIB的指針
LPSTR lpDIB;
// 指向DIB象素指針
LPSTR lpDIBBits;
// 鎖定DIB
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
// 找到DIB圖像象素起始位置
lpDIBBits = ::FindDIBBits(lpDIB);
// 判斷是否是8-bpp位圖(這里為了方便,只處理8-bpp位圖的沃爾什-哈達瑪變換,其它的可以類推)
if (::DIBNumColors(lpDIB) != 256)
{
// 提示用戶
MessageBox("目前只支持256色位圖的沃爾什-哈達瑪變換!", "系統提示" ,
MB_ICONINFORMATION | MB_OK);
// 解除鎖定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 返回
return;
}
// 更改光標形狀
BeginWaitCursor();
// 調用DIBWalsh()或者DIBWalsh1()函數進行變換
if (::DIBWalsh1(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB)))
{
// 設置臟標記
pDoc->SetModifiedFlag(TRUE);
// 更新視圖
pDoc->UpdateAllViews(NULL);
}
else
{
// 提示用戶
MessageBox("分配內存失敗!", "系統提示" , MB_ICONINFORMATION | MB_OK);
}
// 解除鎖定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 恢復光標
EndWaitCursor();
}
//////////////////////////////////////////////////////////////////////////////////////
// 形態學變換
//
void CCh1_1View::OnMorphErosion()
{
//腐蝕運算
// 獲取文檔
CCh1_1Doc* pDoc = GetDocument();
// 指向DIB的指針
LPSTR lpDIB;
// 指向DIB象素指針
LPSTR lpDIBBits;
// 鎖定DIB
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
// 判斷是否是8-bpp位圖(這里為了方便,只處理8-bpp位圖的腐蝕,其它的可以類推)
if (::DIBNumColors(lpDIB) != 256)
{
MessageBox("目前只支持256色位圖的腐蝕!", "系統提示" , MB_ICONINFORMATION | MB_OK);
// 解除鎖定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 返回
return;
}
int nMode;
// 創建對話框
cDlgMorphErosion dlgPara;
// 初始化變量值
dlgPara.m_nMode = 0;
// 顯示對話框,提示用戶設定腐蝕方向
if (dlgPara.DoModal() != IDOK)
{
// 返回
return;
}
// 獲取用戶設定的腐蝕方向
nMode = dlgPara.m_nMode;
int structure[3][3];
if (nMode == 2)
{
structure[0][0]=dlgPara.m_nStructure1;
structure[0][1]=dlgPara.m_nStructure2;
structure[0][2]=dlgPara.m_nStructure3;
structure[1][0]=dlgPara.m_nStructure4;
structure[1][1]=dlgPara.m_nStructure5;
structure[1][2]=dlgPara.m_nStructure6;
structure[2][0]=dlgPara.m_nStructure7;
structure[2][1]=dlgPara.m_nStructure8;
structure[2][2]=dlgPara.m_nStructure9;
}
// 刪除對話框
delete dlgPara;
// 更改光標形狀
BeginWaitCursor();
// 找到DIB圖像象素起始位置
lpDIBBits = ::FindDIBBits(lpDIB);
// 調用ErosionDIB()函數腐蝕DIB
if (ErosionDIB(lpDIBBits, WIDTHBYTES(::DIBWidth(lpDIB) * 8), ::DIBHeight(lpDIB), nMode , structure))
{
// 設置臟標記
pDoc->SetModifiedFlag(TRUE);
// 更新視圖
pDoc->UpdateAllViews(NULL);
}
else
{
// 提示用戶
MessageBox("分配內存失敗或者圖像中含有0和255之外的像素值!", "系統提示" , MB_ICONINFORMATION | MB_OK);
}
// 解除鎖定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 恢復光標
EndWaitCursor();
}
void CCh1_1View::OnMorphOpen()
{
//開運算
// 獲取文檔
CCh1_1Doc* pDoc = GetDocument();
// 指向DIB的指針
LPSTR lpDIB;
// 指向DIB象素指針
LPSTR lpDIBBits;
// 鎖定DIB
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
// 判斷是否是8-bpp位圖(這里為了方便,只處理8-bpp位圖的開運算,其它的可以類推)
if (::DIBNumColors(lpDIB) != 256)
{
// 提示用戶
MessageBox("目前只支持256色位圖的開運算!", "系統提示" , MB_ICONINFORMATION | MB_OK);
// 解除鎖定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 返回
return;
}
int nMode;
// 創建對話框
cDlgMorphOpen dlgPara;
// 初始化變量值
dlgPara.m_nMode = 0;
// 顯示對話框,提示用戶設定開運算方向
if (dlgPara.DoModal() != IDOK)
{
// 返回
return;
}
// 獲取用戶設定的開運算方向
nMode = dlgPara.m_nMode;
int structure[3][3];
if (nMode == 2)
{
structure[0][0]=dlgPara.m_nStructure1;
structure[0][1]=dlgPara.m_nStructure2;
structure[0][2]=dlgPara.m_nStructure3;
structure[1][0]=dlgPara.m_nStructure4;
structure[1][1]=dlgPara.m_nStructure5;
structure[1][2]=dlgPara.m_nStructure6;
structure[2][0]=dlgPara.m_nStructure7;
structure[2][1]=dlgPara.m_nStructure8;
structure[2][2]=dlgPara.m_nStructure9;
}
// 刪除對話框
delete dlgPara;
// 更改光標形狀
BeginWaitCursor();
// 找到DIB圖像象素起始位置
lpDIBBits = ::FindDIBBits(lpDIB);
// 調用ErosionDIB()函數開運算DIB
//if (OpenDIB(lpDIBBits, WIDTHBYTES(::DIBWidth(lpDIB) * 8), ::DIBHeight(lpDIB), nMode , structure))
if (OpenDIB(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB), nMode , structure))
{
// 設置臟標記
pDoc->SetModifiedFlag(TRUE);
// 更新視圖
pDoc->UpdateAllViews(NULL);
}
else
{
// 提示用戶
MessageBox("分配內存失敗或者圖像中含有0和255之外的像素值!", "系統提示" , MB_ICONINFORMATION | MB_OK);
}
// 解除鎖定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 恢復光標
EndWaitCursor();
}
void CCh1_1View::OnMorphThining()
{
//閉運算
// 獲取文檔
CCh1_1Doc* pDoc = GetDocument();
// 指向DIB的指針
LPSTR lpDIB;
// 指向DIB象素指針
LPSTR lpDIBBits;
// 鎖定DIB
/*
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
// 判斷是否是8-bpp位圖(這里為了方便,只處理8-bpp位圖的閉運算,其它的可以類推)
if (::DIBNumColors(lpDIB) != 256)
{
// 提示用戶
MessageBox("目前只支持256色位圖的細化運算!", "系統提示" , MB_ICONINFORMATION | MB_OK);
// 解除鎖定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 返回
return;
}
// 更改光標形狀
BeginWaitCursor();
// 找到DIB圖像象素起始位置
lpDIBBits = ::FindDIBBits(lpDIB);
// 調用ThiningDIB()函數對DIB進行閉運算
if (ThiningDIB(lpDIBBits, WIDTHBYTES(::DIBWidth(lpDIB) * 8), ::DIBHeight(lpDIB)))
{
// 設置臟標記
pDoc->SetModifiedFlag(TRUE);
// 更新視圖
pDoc->UpdateAllViews(NULL);
}
else
{
// 提示用戶
MessageBox("分配內存失敗或者圖像中含有0和255之外的像素值!", "系統提示" , MB_ICONINFORMATION | MB_OK);
}
// 解除鎖定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 恢復光標
EndWaitCursor();
}
void CCh1_1View::OnMorphClose()
{
//閉運算
// 獲取文檔
CCh1_1Doc* pDoc = GetDocument();
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -