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