📄 ch1_1view.cpp
字号:
// 获取用户设定的平移量 fA = dlgPara.m_fA; fB = dlgPara.m_fB; // 删除对话框 delete dlgPara; // 更改光标形状 BeginWaitCursor(); // 调用LinerTrans()函数进行线性变换 LinerTrans(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB), fA, fB); // 设置脏标记 pDoc->SetModifiedFlag(TRUE); // 更新视图 pDoc->UpdateAllViews(NULL); // 解除锁定 ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); // 恢复光标 EndWaitCursor(); }void CCh1_1View::OnPointThre() { // 阈值变换 // 获取文档 CCh1_1Doc* pDoc = GetDocument(); // 指向DIB的指针 LPSTR lpDIB; // 指向DIB象素指针 LPSTR lpDIBBits; // 参数对话框 CDlgPointThre dlgPara; // 阈值 BYTE bThre; // 锁定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; } // 初始化变量值 dlgPara.m_bThre = 128; // 显示对话框,提示用户设定阈值 if (dlgPara.DoModal() != IDOK) { // 返回 return; } // 获取用户设定的阈值 bThre = dlgPara.m_bThre; // 删除对话框 delete dlgPara; // 更改光标形状 BeginWaitCursor(); // 调用ThresholdTrans()函数进行阈值变换 ThresholdTrans(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB), bThre); // 设置脏标记 pDoc->SetModifiedFlag(TRUE); // 更新视图 pDoc->UpdateAllViews(NULL); // 解除锁定 ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); // 恢复光标 EndWaitCursor();}void CCh1_1View::OnPointWind() { // 窗口变换 // 获取文档 CCh1_1Doc* pDoc = GetDocument(); // 指向DIB的指针 LPSTR lpDIB; // 指向DIB象素指针 LPSTR lpDIBBits; // 创建对话框 CDlgPointWin dlgPara; // 窗口下限 BYTE bLow; // 窗口上限 BYTE bUp; // 锁定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; } // 初始化变量值 dlgPara.m_bLow = 0; dlgPara.m_bUp = 255; // 显示对话框,提示用户设定窗口上下限 if (dlgPara.DoModal() != IDOK) { // 返回 return; } // 获取用户设定的窗口上下限 bLow = dlgPara.m_bLow; bUp = dlgPara.m_bUp; // 删除对话框 delete dlgPara; // 更改光标形状 BeginWaitCursor(); // 调用WindowTrans()函数进行窗口变换 WindowTrans(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB), bLow, bUp); // 设置脏标记 pDoc->SetModifiedFlag(TRUE); // 更新视图 pDoc->UpdateAllViews(NULL); // 解除锁定 ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); // 恢复光标 EndWaitCursor();}void CCh1_1View::OnPointStre() { // 灰度拉伸 // 获取文档 CCh1_1Doc* pDoc = GetDocument(); // 指向DIB的指针 LPSTR lpDIB; // 指向DIB象素指针 LPSTR lpDIBBits; // 创建对话框 CDlgPointStre dlgPara; // 点1坐标 BYTE bX1; BYTE bY1; // 点2坐标 BYTE bX2; BYTE bY2; // 锁定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; } // 初始化变量值 dlgPara.m_bX1 = 50; dlgPara.m_bY1 = 30; dlgPara.m_bX2 = 200; dlgPara.m_bY2 = 220; // 显示对话框,提示用户设定拉伸位置 if (dlgPara.DoModal() != IDOK) { // 返回 return; } // 获取用户的设定 bX1 = dlgPara.m_bX1; bY1 = dlgPara.m_bY1; bX2 = dlgPara.m_bX2; bY2 = dlgPara.m_bY2; // 删除对话框 delete dlgPara; // 更改光标形状 BeginWaitCursor(); // 调用GrayStretch()函数进行灰度拉伸 GrayStretch(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB), bX1, bY1, bX2, bY2); // 设置脏标记 pDoc->SetModifiedFlag(TRUE); // 更新视图 pDoc->UpdateAllViews(NULL); // 解除锁定 ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); // 恢复光标 EndWaitCursor();}void CCh1_1View::OnPointEqua() { // 灰度均衡 // 获取文档 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(); // 调用InteEqualize()函数进行直方图均衡 InteEqualize(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB)); // 设置脏标记 pDoc->SetModifiedFlag(TRUE); // 更新视图 pDoc->UpdateAllViews(NULL); // 解除锁定 ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); // 恢复光标 EndWaitCursor(); }//////////////////////////////////////////////////////////////////////////////////////// 图像几何变换//void CCh1_1View::OnGeomTran() { // 平移位图 // 获取文档 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; } LONG lXOffset; LONG lYOffset; // 创建对话框 CDlgGeoTran dlgPara; // 初始化变量值 dlgPara.m_XOffset = 100; dlgPara.m_YOffset = 100; // 显示对话框,提示用户设定平移量 if (dlgPara.DoModal() != IDOK) { // 返回 return; } // 获取用户设定的平移量 lXOffset = dlgPara.m_XOffset; lYOffset = dlgPara.m_YOffset; // 删除对话框 delete dlgPara; // 更改光标形状 BeginWaitCursor(); // 找到DIB图像象素起始位置 lpDIBBits = ::FindDIBBits(lpDIB); // 调用TranslationDIB()函数平移DIB if (TranslationDIB1(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB), lXOffset, lYOffset)) { // 设置脏标记 pDoc->SetModifiedFlag(TRUE); // 更新视图 pDoc->UpdateAllViews(NULL); } else { // 提示用户 MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK); } // 解除锁定 ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); // 恢复光标 EndWaitCursor();}void CCh1_1View::OnGeomMirv() { // 垂直镜像 // 获取文档 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); // 调用MirrorDIB()函数垂直镜像DIB if (MirrorDIB(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB), FALSE)) { // 设置脏标记 pDoc->SetModifiedFlag(TRUE); // 更新视图 pDoc->UpdateAllViews(NULL); } else { // 提示用户 MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK); } // 解除锁定 ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); // 恢复光标 EndWaitCursor();}void CCh1_1View::OnGeomMirh() { // 水平镜像 // 获取文档 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); // 调用MirrorDIB()函数水平镜像DIB if (MirrorDIB(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB), TRUE)) { // 设置脏标记 pDoc->SetModifiedFlag(TRUE); // 更新视图 pDoc->UpdateAllViews(NULL); } else { // 提示用户 MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK); } // 解除锁定 ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); // 恢复光标 EndWaitCursor(); }void CCh1_1View::OnGeomTrpo() { // 图像转置 // 获取文档 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; } // 更改光标形状 BeginWaitCursor(); // 调用TransposeDIB()函数转置DIB if (TransposeDIB(lpDIB)) { // 设置脏标记 pDoc->SetModifiedFlag(TRUE); // 更新DIB大小和调色板 pDoc->InitDIBData(); // 重新设置滚动视图大小 SetScrollSizes(MM_TEXT, pDoc->GetDocSize()); // 更新视图 pDoc->UpdateAllViews(NULL); } else { // 提示用户 MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK); } // 解除锁定 ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); // 恢复光标 EndWaitCursor();}void CCh1_1View::OnGeomZoom() { // 图像缩放 // 获取文档 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; } // 缩放比率 float fXZoomRatio; float fYZoomRatio; // 创建对话框 CDlgGeoZoom dlgPara; // 初始化变量值 dlgPara.m_XZoom = 0.5; dlgPara.m_YZoom = 0.5; // 显示对话框,提示用户设定平移量 if (dlgPara.DoModal() != IDOK) { // 返回
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -