📄 ch1_1view.cpp
字号:
}void CCh1_1View::OnMorphClose() { //闭运算 // 获取文档 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; // 创建对话框 cDlgMorphClose 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); // 调用CloseDIB()函数对DIB进行闭运算 if (CloseDIB(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::OnMorphDilation() { //膨胀运算 // 获取文档 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; // 创建对话框 cDlgMorphDilation 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); // 调用DilationDIB()函数膨胀DIB if (DilationDIB(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::OnEdgeHough() { //Hough运算 // 获取文档 CCh1_1Doc* pDoc = GetDocument(); // 指向DIB的指针 LPSTR lpDIB; // 指向DIB象素指针 LPSTR lpDIBBits; // 锁定DIB lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB()); // 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的Hough变换,其它的可以类推) if (::DIBNumColors(lpDIB) != 256) { // 提示用户 MessageBox("目前只支持256色位图的运算!", "系统提示" , MB_ICONINFORMATION | MB_OK); // 解除锁定 ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); // 返回 return; } // 更改光标形状 BeginWaitCursor(); // 找到DIB图像象素起始位置 lpDIBBits = ::FindDIBBits(lpDIB); // 调用HoughDIB()函数对DIB if (HoughDIB(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB))) { // 设置脏标记 pDoc->SetModifiedFlag(TRUE); // 更新视图 pDoc->UpdateAllViews(NULL); } else { // 提示用户 MessageBox("分配内存失败或者图像中含有0和255之外的像素值!", "系统提示" , MB_ICONINFORMATION | MB_OK); } // 解除锁定 ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); // 恢复光标 EndWaitCursor(); }void CCh1_1View::OnEdgeGauss() { //Gauss边缘检测运算 // 获取文档 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); // 调用GaussDIB()函数对DIB进行边缘检测 if (GaussDIB(lpDIBBits, WIDTHBYTES(::DIBWidth(lpDIB) * 8), ::DIBHeight(lpDIB))) { // 设置脏标记 pDoc->SetModifiedFlag(TRUE); // 更新视图 pDoc->UpdateAllViews(NULL); } else { // 提示用户 MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK); } // 解除锁定 ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); // 恢复光标 EndWaitCursor(); }void CCh1_1View::OnEdgeKirsch() { //Kirsch边缘检测运算 // 获取文档 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); // 调用KirschDIB()函数对DIB进行边缘检测 if (KirschDIB(lpDIBBits, WIDTHBYTES(::DIBWidth(lpDIB) * 8), ::DIBHeight(lpDIB))) { // 设置脏标记 pDoc->SetModifiedFlag(TRUE); // 更新视图 pDoc->UpdateAllViews(NULL); } else { // 提示用户 MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK); } // 解除锁定 ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); // 恢复光标 EndWaitCursor(); }void CCh1_1View::OnEdgePrewitt() { //Prewitt边缘检测运算 // 获取文档 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); // 调用PrewittDIB()函数对DIB进行边缘检测 if (PrewittDIB(lpDIBBits, WIDTHBYTES(::DIBWidth(lpDIB) * 8), ::DIBHeight(lpDIB))) { // 设置脏标记 pDoc->SetModifiedFlag(TRUE); // 更新视图 pDoc->UpdateAllViews(NULL); } else { // 提示用户 MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK); } // 解除锁定 ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); // 恢复光标 EndWaitCursor(); }void CCh1_1View::OnEdgeRobert() { //Robert边缘检测运算 // 获取文档 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); // 调用RobertDIB()函数对DIB进行边缘检测 if (RobertDIB(lpDIBBits, WIDTHBYTES(::DIBWidth(lpDIB) * 8), ::DIBHeight(lpDIB))) { // 设置脏标记 pDoc->SetModifiedFlag(TRUE); // 更新视图 pDoc->UpdateAllViews(NULL); } else { // 提示用户 MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK); } // 解除锁定 ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); // 恢复光标 EndWaitCursor(); }void CCh1_1View::OnEdgeSobel() { //Sobel边缘检测运算 // 获取文档 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); // 调用SobelDIB()函数对DIB进行边缘检测 if (SobelDIB(lpDIBBits, WIDTHBYTES(::DIBWidth(lpDIB) * 8), ::DIBHeight(lpDIB))) { // 设置脏标记 pDoc->SetModifiedFlag(TRUE); // 更新视图 pDoc->UpdateAllViews(NULL); } else { // 提示用户 MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK); } // 解除锁定 ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); // 恢复光标 EndWaitCursor(); }void CCh1_1View::OnEdgeFill() { //种子填充运算 // 获取文档 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); // 调用FillDIB()函数对DIB进行种子填充 if (FillDIB(lpDIBBits, WIDTHBYTES(::DIBWidth(lpDIB) * 8), ::DIBHeight(lpDIB))) { // 设置脏标记 pDoc->SetModifiedFlag(TRUE); // 更新视图 pDoc->UpdateAllViews(NULL); } else { // 提示用户 MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK); } // 解除锁定 ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); // 恢复光标 EndWaitCursor(); }void CCh1_1View::OnEdgeContour() { //轮廓提取运算 // 获取文档 CCh1_1Doc* pDoc = GetDocument(); // 指向DIB的指针 LPSTR lpDIB; // 指向DIB象素指针 LPSTR lpDIBBits; // 锁定DIB lpDIB = (LPSTR) ::GlobalLock
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -