?? ch1_1view.cpp
字號:
SetScrollSizes(MM_TEXT, pDoc->GetDocSize());
// 更新視圖
pDoc->UpdateAllViews(NULL);
}
else
{
// 提示用戶
MessageBox("分配內存失敗!", "系統提示" , MB_ICONINFORMATION | MB_OK);
}
// 解除鎖定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 恢復光標
EndWaitCursor();
}
void CCh1_1View::OnGeomZoom()
{
// 圖像縮放
// 獲取文檔
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;
}
// 縮放比率
float fXZoomRatio;
float fYZoomRatio;
// 創建對話框
CDlgGeoZoom dlgPara;
// 初始化變量值
dlgPara.m_XZoom = 0.5;
dlgPara.m_YZoom = 0.5;
// 顯示對話框,提示用戶設定平移量
if (dlgPara.DoModal() != IDOK)
{
// 返回
return;
}
// 獲取用戶設定的平移量
fXZoomRatio = dlgPara.m_XZoom;
fYZoomRatio = dlgPara.m_YZoom;
// 刪除對話框
delete dlgPara;
// 創建新DIB
HDIB hNewDIB = NULL;
// 更改光標形狀
BeginWaitCursor();
// 調用ZoomDIB()函數轉置DIB
hNewDIB = (HDIB) ZoomDIB(lpDIB, fXZoomRatio, fYZoomRatio);
// 判斷縮放是否成功
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::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))
{
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -