?? ch1_1view.cpp
字號:
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)) { // 設置臟標記 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();
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -