?? ch1_1view.cpp
字號:
// 解除鎖定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 恢復光標
EndWaitCursor();
}
void CCh1_1View::OnGeomRota()
{
// 圖像旋轉
// 獲取文檔
CCh1_1Doc* pDoc = GetDocument();
// 指向DIB的指針
LPSTR lpDIB;
// 鎖定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 iRotateAngle;
// 創建對話框
CDlgGeoRota dlgPara;
// 初始化變量值
dlgPara.m_iRotateAngle = 90;
// 顯示對話框,提示用戶設定旋轉角度
if (dlgPara.DoModal() != IDOK)
{
// 返回
return;
}
// 獲取用戶設定的平移量
iRotateAngle = dlgPara.m_iRotateAngle;
// 刪除對話框
delete dlgPara;
// 創建新DIB
HDIB hNewDIB = NULL;
// 更改光標形狀
BeginWaitCursor();
// 調用RotateDIB()函數旋轉DIB
hNewDIB = (HDIB) RotateDIB(lpDIB, iRotateAngle);
// 判斷旋轉是否成功
if (hNewDIB != NULL)
{
// 替換DIB,同時釋放舊DIB對象
pDoc->ReplaceHDIB(hNewDIB);
// 更新DIB大小和調色板
pDoc->InitDIBData();
// 設置臟標記
pDoc->SetModifiedFlag(TRUE);
// 重新設置滾動視圖大小
SetScrollSizes(MM_TEXT, pDoc->GetDocSize());
// 更新視圖
pDoc->UpdateAllViews(NULL);
}
else
{
// 提示用戶
MessageBox("分配內存失敗!", "系統提示" , MB_ICONINFORMATION | MB_OK);
}
// 解除鎖定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 恢復光標
EndWaitCursor();
}
//////////////////////////////////////////////////////////////////////////////////////
// 圖像增強
//
void CCh1_1View::OnEnhaSmooth()
{
// 圖像平滑
// 獲取文檔
CCh1_1Doc* pDoc = GetDocument();
// 指向DIB的指針
LPSTR lpDIB;
// 指向DIB象素指針
LPSTR lpDIBBits;
// 模板高度
int iTempH;
// 模板寬度
int iTempW;
// 模板系數
FLOAT fTempC;
// 模板中心元素X坐標
int iTempMX;
// 模板中心元素Y坐標
int iTempMY;
// 模板元素數組
FLOAT aValue[25];
// 鎖定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;
}
// 創建對話框
CDlgSmooth dlgPara;
// 給模板數組賦初值(為平均模板)*/
/*
aValue[0] = 1.0;
aValue[1] = 1.0;
aValue[2] = 1.0;
aValue[3] = 0.0;
aValue[4] = 0.0;
aValue[5] = 1.0;
aValue[6] = 1.0;
aValue[7] = 1.0;
aValue[8] = 0.0;
aValue[9] = 0.0;
aValue[10] = 1.0;
aValue[11] = 1.0;
aValue[12] = 1.0;
aValue[13] = 0.0;
aValue[14] = 0.0;
aValue[15] = 0.0;
aValue[16] = 0.0;
aValue[17] = 0.0;
aValue[18] = 0.0;
aValue[19] = 0.0;
aValue[20] = 0.0;
aValue[21] = 0.0;
aValue[22] = 0.0;
aValue[23] = 0.0;
aValue[24] = 0.0;
// 初始化對話框變量值
dlgPara.m_intType = 0;
dlgPara.m_iTempH = 3;
dlgPara.m_iTempW = 3;
dlgPara.m_iTempMX = 1;
dlgPara.m_iTempMY = 1;
dlgPara.m_fTempC = (FLOAT) (1.0 / 9.0);
dlgPara.m_fpArray = aValue;
// 顯示對話框,提示用戶設定平移量
if (dlgPara.DoModal() != IDOK)
{
// 返回
return;
}
// 獲取用戶設定的平移量
iTempH = dlgPara.m_iTempH;
iTempW = dlgPara.m_iTempW;
iTempMX = dlgPara.m_iTempMX;
iTempMY = dlgPara.m_iTempMY;
fTempC = dlgPara.m_fTempC;
// 刪除對話框
delete dlgPara;
// 更改光標形狀
BeginWaitCursor();
// 調用Template()函數平滑DIB
if (::Template(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB),
iTempH, iTempW, iTempMX, iTempMY, aValue, fTempC))
{
// 設置臟標記
pDoc->SetModifiedFlag(TRUE);
// 更新視圖
pDoc->UpdateAllViews(NULL);
}
else
{
// 提示用戶
MessageBox("分配內存失敗!", "系統提示" , MB_ICONINFORMATION | MB_OK);
}
// 解除鎖定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 恢復光標
EndWaitCursor();
}
void CCh1_1View::OnENHAMidianF()
{
// 中值濾波
// 獲取文檔
CCh1_1Doc* pDoc = GetDocument();
// 指向DIB的指針
LPSTR lpDIB;
// 指向DIB象素指針
LPSTR lpDIBBits;
// 濾波器的高度
int iFilterH;
// 濾波器的寬度
int iFilterW;
// 中心元素的X坐標
int iFilterMX;
// 中心元素的Y坐標
int iFilterMY;
// 鎖定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;
}
// 創建對話框
CDlgMidFilter dlgPara;
// 初始化變量值
dlgPara.m_iFilterType = 0;
dlgPara.m_iFilterH = 3;
dlgPara.m_iFilterW = 1;
dlgPara.m_iFilterMX = 0;
dlgPara.m_iFilterMY = 1;
// 顯示對話框,提示用戶設定平移量
if (dlgPara.DoModal() != IDOK)
{
// 返回
return;
}
// 獲取用戶的設定
iFilterH = dlgPara.m_iFilterH;
iFilterW = dlgPara.m_iFilterW;
iFilterMX = dlgPara.m_iFilterMX;
iFilterMY = dlgPara.m_iFilterMY;
// 刪除對話框
delete dlgPara;
// 更改光標形狀
BeginWaitCursor();
// 調用MedianFilter()函數中值濾波
if (::MedianFilter(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB),
iFilterH, iFilterW, iFilterMX, iFilterMY))
{
// 設置臟標記
pDoc->SetModifiedFlag(TRUE);
// 更新視圖
pDoc->UpdateAllViews(NULL);
}
else
{
// 提示用戶
MessageBox("分配內存失敗!", "系統提示" , MB_ICONINFORMATION | MB_OK);
}
// 解除鎖定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 恢復光標
EndWaitCursor();
}
void CCh1_1View::OnEnhaGradsharp()
{
// 梯度銳化
// 獲取文檔
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;
}
// 閾值
BYTE bThre;
// 創建對話框
CDlgSharpThre dlgPara;
// 初始化變量值
dlgPara.m_bThre = 10;
// 提示用戶輸入閾值
if (dlgPara.DoModal() != IDOK)
{
// 返回
return;
}
// 獲取用戶的設定
bThre = dlgPara.m_bThre;
// 刪除對話框
delete dlgPara;
// 更改光標形狀
BeginWaitCursor();
// 調用GradSharp()函數進行梯度板銳化
if (::GradSharp(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB), bThre))
{
// 設置臟標記
pDoc->SetModifiedFlag(TRUE);
// 更新視圖
pDoc->UpdateAllViews(NULL);
}
else
{
// 提示用戶
MessageBox("分配內存失敗!", "系統提示" , MB_ICONINFORMATION | MB_OK);
}
// 解除鎖定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 恢復光標
EndWaitCursor();
}
void CCh1_1View::OnEnhaSharp()
{
// 圖像銳化
// 獲取文檔
CCh1_1Doc* pDoc = GetDocument();
// 指向DIB的指針
LPSTR lpDIB;
// 指向DIB象素指針
LPSTR lpDIBBits;
// 模板高度
int iTempH;
// 模板寬度
int iTempW;
// 模板系數
FLOAT fTempC;
// 模板中心元素X坐標
int iTempMX;
// 模板中心元素Y坐標
int iTempMY;
// 模板元素數組
FLOAT aValue[9];
// 鎖定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();
// 設置拉普拉斯模板參數
iTempW = 3;
iTempH = 3;
fTempC = 1.0;
iTempMX = 1;
iTempMY = 1;
aValue[0] = -1.0;
aValue[1] = -1.0;
aValue[2] = -1.0;
aValue[3] = -1.0;
aValue[4] = 9.0;
aValue[5] = -1.0;
aValue[6] = -1.0;
aValue[7] = -1.0;
aValue[8] = -1.0;
// 調用Template()函數用拉普拉斯模板銳化DIB
if (::Template(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB),
iTempH, iTempW, iTempMX, iTempMY, aValue, fTempC))
{
// 設置臟標記
pDoc->SetModifiedFlag(TRUE);
// 更新視圖
pDoc->UpdateAllViews(NULL);
}
else
{
// 提示用戶
MessageBox("分配內存失敗!", "系統提示" , MB_ICONINFORMATION | MB_OK);
}
// 解除鎖定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 恢復光標
EndWaitCursor();
}
void CCh1_1View::OnEnhaColor()
{
// 偽彩色編碼
// 獲取文檔
CCh1_1Doc* pDoc = GetDocument();
// 保存用戶選擇的偽彩色編碼表索引
int nColor;
// 指向DIB的指針
LPSTR lpDIB;
// 鎖定DIB
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
// 判斷是否是8-bpp位圖(只處理256色位圖的偽彩色變換,其它的可以類推)
if (::DIBNumColors(lpDIB) != 256)
{
// 提示用戶
MessageBox("目前只支持256色位圖的偽彩色變換!", "系統提示" ,
MB_ICONINFORMATION | MB_OK);
// 解除鎖定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 返回
return;
}
// 參數對話框
CDlgColor dlgPara;
// 初始化變量值
if (pDoc->m_nColorIndex >= 0)
{
// 初始選中當前的偽彩色
dlgPara.m_nColor = pDoc->m_nColorIndex;
}
else
{
// 初始選中灰度偽彩色編碼表
dlgPara.m_nColor = 0;
}
// 指向名稱數組的指針
dlgPara.m_lpColorName = (LPSTR) ColorScaleName;
// 偽彩色編碼數目
dlgPara.m_nColorCount = COLOR_SCALE_COUNT;
// 名稱字符串長度
dlgPara.m_nNameLen = sizeof(ColorScaleName) / COLOR_SCALE_COUNT;
// 顯示對話框,提示用戶設定平移量
if (dlgPara.DoModal() != IDOK)
{
// 返回
return;
}
// 獲取用戶的設定
nColor = dlgPara.m_nColor;
// 刪除對話框
delete dlgPara;
// 更改光標形狀
BeginWaitCursor();
// 判斷偽彩色編碼是否改動
if (pDoc->m_nColorIndex != nColor)
{
// 調用ReplaceColorPal()函數變換調色板
::ReplaceColorPal(lpDIB, (BYTE*) ColorsTable[nColor]);
// 替換當前文檔調色板
pDoc->GetDocPalette()->SetPaletteEntries(0, 256, (LPPALETTEENTRY) ColorsTable[nColor]);
// 更新類成員變量
pDoc->m_nColorIndex = nColor;
// 設置臟標記
pDoc->SetModifiedFlag(TRUE);
// 實現新的調色板
OnDoRealize((WPARAM)m_hWnd,0);
// 更新視圖
pDoc->UpdateAllViews(NULL);
}
// 解除鎖定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 恢復光標
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -