📄 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 + -