📄 data_compress_systemview.cpp
字号:
// 判断DIB是否为空
if (pDoc->GetHDIB() == NULL)
{
// 直接返回
return;
}
// 获取Palette
CPalette* pPal = pDoc->GetDocPalette();
if (pPal != NULL)
{
// 获取MainFrame
CMainFrame* pAppFrame = (CMainFrame*) AfxGetApp()->m_pMainWnd;
ASSERT_KINDOF(CMainFrame, pAppFrame);
CClientDC appDC(pAppFrame);
// All views but one should be a background palette.
// wParam contains a handle to the active view, so the SelectPalette
// bForceBackground flag is FALSE only if wParam == m_hWnd (this view)
CPalette* oldPalette = appDC.SelectPalette(pPal, ((HWND)wParam) != m_hWnd);
if (oldPalette != NULL)
{
UINT nColorsChanged = appDC.RealizePalette();
if (nColorsChanged > 0)
pDoc->UpdateAllViews(NULL);
appDC.SelectPalette(oldPalette, TRUE);
}
}
}
///////////////////////////////////////////
// 计算窗口视图大小,以计算滚动条设置 //
///////////////////////////////////////////
void CData_Compress_SystemView::CalcWindowRect(LPRECT lpClientRect, UINT nAdjustType)
{
CScrollView::CalcWindowRect(lpClientRect, nAdjustType);
ASSERT(GetDocument() != NULL);
SetScrollSizes(MM_TEXT, GetDocument()->GetDocSize());
}
void CData_Compress_SystemView::OnActivateView(BOOL bActivate, CView* pActivateView, CView* pDeactiveView)
{
CScrollView::OnActivateView(bActivate, pActivateView, pDeactiveView);
if (bActivate)
{
ASSERT(pActivateView == this);
OnDoRealize((WPARAM)m_hWnd, 0); // same as SendMessage(WM_DOREALIZE);
}
}
///////////////////////////////////////////
// 复制当前DIB到剪贴版 //
///////////////////////////////////////////
void CData_Compress_SystemView::OnEditCopy()
{
// 获取文档
CData_Compress_SystemDoc* pDoc = GetDocument();
// 打开剪贴板
if (OpenClipboard())
{
// 更改光标形状
BeginWaitCursor();
// 清空剪贴板
EmptyClipboard();
// 复制当前图像到剪贴板
SetClipboardData (CF_DIB, pDoc->m_clsDIB.CopyHandle((HANDLE) pDoc->GetHDIB()) );
// 关闭剪贴板
CloseClipboard();
// 恢复光标
EndWaitCursor();
}
}
void CData_Compress_SystemView::OnUpdateEditCopy(CCmdUI* pCmdUI)
{
// 如果当前DIB对象不空,复制菜单项有效
pCmdUI->Enable(GetDocument()->GetHDIB() != NULL);
}
///////////////////////////////////////////
// 从剪贴版粘贴DIB到当前视图 //
///////////////////////////////////////////
void CData_Compress_SystemView::OnEditPaste()
{
// 创建新DIB
HDIB hNewDIB = NULL;
// 获取文档
CData_Compress_SystemDoc* pDoc = GetDocument();
// 打开剪贴板
if (OpenClipboard())
{
// 更改光标形状
BeginWaitCursor();
// 读取剪贴板中的图像
hNewDIB = (HDIB) pDoc->m_clsDIB.CopyHandle(::GetClipboardData(CF_DIB));
// 关闭剪贴板
CloseClipboard();
// 判断是否读取成功
if (hNewDIB != NULL)
{
// 替换DIB,同时释放旧DIB对象
pDoc->ReplaceHDIB(hNewDIB);
// 更新DIB大小和调色板
pDoc->InitDIBData();
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
// 重新设置滚动视图大小
SetScrollSizes(MM_TEXT, pDoc->GetDocSize());
// 实现新的调色板
OnDoRealize((WPARAM)m_hWnd,0);
// 更新视图
pDoc->UpdateAllViews(NULL);
}
// 恢复光标
EndWaitCursor();
}
}
void CData_Compress_SystemView::OnUpdateEditPaste(CCmdUI* pCmdUI)
{
// 如果当前剪贴板中有DIB对象,粘贴菜单项有效
pCmdUI->Enable(::IsClipboardFormatAvailable(CF_DIB));
}
///////////////////////////////////////////
// 放大当前视图 //
///////////////////////////////////////////
void CData_Compress_SystemView::OnGeomZoomin()
{
// 创建新DIB
HDIB hNewDIB = NULL;
// 获取文档
CData_Compress_SystemDoc* pDoc = GetDocument();
// 初始化脏标记为FALSE
pDoc->SetModifiedFlag(FALSE);
// 重新装载文件
pDoc->OnFileReopen();
// 放大倍数乘2
pDoc->m_fZoomRatio *= 2;
// 调用ZoomDIB()函数获取缩小后的DIB
CGeoTrans clsGeoTrans;
hNewDIB = clsGeoTrans.ZoomDIB(pDoc->GetHDIB(), pDoc->m_fZoomRatio);
// 判断缩放是否成功
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);
}
}
///////////////////////////////////////////
// 缩小当前视图 //
///////////////////////////////////////////
void CData_Compress_SystemView::OnGeomZoomout()
{
// 创建新DIB
HDIB hNewDIB = NULL;
// 获取文档
CData_Compress_SystemDoc* pDoc = GetDocument();
// 初始化脏标记为FALSE
pDoc->SetModifiedFlag(FALSE);
// 重新装载文件
pDoc->OnFileReopen();
// 放大倍数除2
pDoc->m_fZoomRatio /= 2;
// 调用ZoomDIB()函数获取缩小后的DIB
CGeoTrans clsGeoTrans;
hNewDIB = clsGeoTrans.ZoomDIB(pDoc->GetHDIB(), pDoc->m_fZoomRatio);
// 判断缩放是否成功
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);
}
}
/////////////////////////////////////////////////////////////////////////////
// //
// 图像处理与分析 //
// //
/////////////////////////////////////////////////////////////////////////////
///////////////////////////[灰度处理部分]////////////////////////////////////////////
///////////////////////////////////////////
// 将彩色位图转化为灰度图像 //
///////////////////////////////////////////
void CData_Compress_SystemView::OnTogray()
{
// 获取文档
CData_Compress_SystemDoc* pDoc = GetDocument();
// 进行灰度转化
CGrayProc clsGrayProc;
clsGrayProc.ToGray(pDoc->GetHDIB());
// 重画视图
Invalidate();
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
}
///////////////////////////////////////////
// 对图像实施反色变换处理 //
///////////////////////////////////////////
void CData_Compress_SystemView::OnPointInvert()
{
// 获取文档
CData_Compress_SystemDoc* pDoc = GetDocument();
// 进行反色处理
CGrayProc clsGrayProc;
clsGrayProc.PointInvert(pDoc->GetHDIB());
// 重画视图
Invalidate();
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
}
///////////////////////////////////////////
// 对图像进行灰度分布均衡化处理 //
///////////////////////////////////////////
void CData_Compress_SystemView::OnPointEqua()
{
// 获取文档
CData_Compress_SystemDoc* pDoc = GetDocument();
// 进行灰度分布均衡化处理
CGrayProc clsGrayProc;
clsGrayProc.PointEqua(pDoc->GetHDIB());
// 重画视图
Invalidate();
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
}
///////////////////////////////////////////
// 查看图像的灰度直方图 //
///////////////////////////////////////////
void CData_Compress_SystemView::OnViewYIntensity()
{
// 循环变量
int i;
// 获取文档
CData_Compress_SystemDoc* pDoc = GetDocument();
// 各颜色分量的灰度分布密度
float fPs_Y[256];
// 计算灰度分布密度
CGrayProc clsGrayProc;
clsGrayProc.GetIntensity(pDoc->GetHDIB(), fPs_Y);
CDlgIntensity dlg;
// 传递灰度分布密度数据给面板类
for (i = 0; i <256; i++)
dlg.m_fIntensity[i] = fPs_Y[i];
// 显示面板
dlg.DoModal();
}
void CData_Compress_SystemView::OnViewRIntensity()
{
// 循环变量
int i;
// 获取文档
CData_Compress_SystemDoc* pDoc = GetDocument();
// 各颜色分量的灰度分布密度
float fPs_R[256];
float fPs_G[256];
float fPs_B[256];
// 计算灰度分布密度
CGrayProc clsGrayProc;
clsGrayProc.GetIntensity(pDoc->GetHDIB(), fPs_R, fPs_G, fPs_B);
CDlgIntensity dlg;
// 传递灰度分布密度数据给面板类
for (i = 0; i <256; i++)
dlg.m_fIntensity[i] = fPs_R[i];
// 显示面板
dlg.DoModal();
}
void CData_Compress_SystemView::OnViewGIntensity()
{
// 循环变量
int i;
// 获取文档
CData_Compress_SystemDoc* pDoc = GetDocument();
// 各颜色分量的灰度分布密度
float fPs_R[256];
float fPs_G[256];
float fPs_B[256];
// 计算灰度分布密度
CGrayProc clsGrayProc;
clsGrayProc.GetIntensity(pDoc->GetHDIB(), fPs_R, fPs_G, fPs_B);
CDlgIntensity dlg;
// 传递灰度分布密度数据给面板类
for (i = 0; i <256; i++)
dlg.m_fIntensity[i] = fPs_G[i];
// 显示面板
dlg.DoModal();
}
void CData_Compress_SystemView::OnViewBIntensity()
{
// 循环变量
int i;
// 获取文档
CData_Compress_SystemDoc* pDoc = GetDocument();
// 各颜色分量的灰度分布密度
float fPs_R[256];
float fPs_G[256];
float fPs_B[256];
// 计算灰度分布密度
CGrayProc clsGrayProc;
clsGrayProc.GetIntensity(pDoc->GetHDIB(), fPs_R, fPs_G, fPs_B);
CDlgIntensity dlg;
// 传递灰度分布密度数据给面板类
for (i = 0; i <256; i++)
dlg.m_fIntensity[i] = fPs_B[i];
// 显示面板
dlg.DoModal();
}
///////////////////////////////////////////
// 灰度折线变换 //
///////////////////////////////////////////
void CData_Compress_SystemView::OnPointStre()
{
// 循环变量
int i;
// 各颜色分量的灰度分布密度
float fPs_Y[256];
// 获取文档
CData_Compress_SystemDoc* pDoc = GetDocument();
// 计算灰度分布密度
CGrayProc clsGrayProc;
clsGrayProc.GetIntensity(pDoc->GetHDIB(), fPs_Y);
// 创建对话框
CDlgPointStre dlg;
dlg.m_pDoc = pDoc;
// 传递灰度分布密度数据给面板类
for (i = 0; i <256; i++)
dlg.m_fIntensity[i] = fPs_Y[i];
// 显示对话框,由用户进行灰度折线变换
dlg.DoModal();
}
///////////////////////////////////////////
// 灰度窗口变换 //
///////////////////////////////////////////
void CData_Compress_SystemView::OnPointWind()
{
// 循环变量
int i;
// 各颜色分量的灰度分布密度
float fPs_Y[256];
// 获取文档
CData_Compress_SystemDoc* pDoc = GetDocument();
// 计算灰度分布密度
CGrayProc clsGrayProc;
clsGrayProc.GetIntensity(pDoc->GetHDIB(), fPs_Y);
// 创建对话框
CDlgPointWin dlg;
dlg.m_pDoc = pDoc;
// 传递灰度分布密度数据给面板类
for (i = 0; i <256; i++)
dlg.m_fIntensity[i] = fPs_Y[i];
// 显示对话框,由用户进行灰度折线变换
dlg.DoModal();
}
///////////////////////////////////////////
// 灰度带通变换 //
///////////////////////////////////////////
void CData_Compress_SystemView::OnPointDt()
{
// 循环变量
int i;
// 各颜色分量的灰度分布密度
float fPs_Y[256];
// 获取文档
CData_Compress_SystemDoc* pDoc = GetDocument();
// 计算灰度分布密度
CGrayProc clsGrayProc;
clsGrayProc.GetIntensity(pDoc->GetHDIB(), fPs_Y);
// 创建对话框
CDlgPointDT dlg;
dlg.m_pDoc = pDoc;
// 传递灰度分布密度数据给面板类
for (i = 0; i <256; i++)
dlg.m_fIntensity[i] = fPs_Y[i];
// 显示对话框,由用户进行灰度折线变换
dlg.DoModal();
}
///////////////////////////////////////////
// 灰度带阻变换 //
///////////////////////////////////////////
void CData_Compress_SystemView::OnPointDz()
{
// 循环变量
int i;
// 各颜色分量的灰度分布密度
float fPs_Y[256];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -