?? ch1_1view.cpp
字號:
// 判斷偽彩色編碼是否改動 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()); // 恢復光標 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();
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -