📄 demoview.cpp
字号:
//新建视图窗口,显示变换结果
CMainFrame* pFrame = (CMainFrame *)(AfxGetApp()->m_pMainWnd);
pFrame->SendMessage(WM_COMMAND, ID_FILE_NEW);
CDemoView* pView=(CDemoView*)pFrame->MDIGetActive()->GetActiveView();
CDemoDoc* pDocNew=pView->GetDocument();
ImgCenterDib *dibNew=pDocNew->GetPDib();
dibNew->ReplaceDib(geoTrans.GetDimensions(),geoTrans.m_nBitCountOut,
geoTrans.m_lpColorTable, geoTrans.m_pImgDataOut);
pView->OnInitialUpdate();
pDocNew->SetModifiedFlag(TRUE);
pDocNew->UpdateAllViews(pView);
}
void CDemoView::OnZhuanZhi()
{
//获取文档类中m_dib的指针,访问当前DIB数据
CDemoDoc *pDoc=GetDocument();
ImgCenterDib *pDib=pDoc->GetPDib();
//只处理灰度和彩色图像
if(pDib->m_nBitCount!=8&&pDib->m_nBitCount!=24){
::MessageBox(0,"只处理灰度和彩色图像",MB_OK,0);
return ;
}
//定义GeometryTrans类的对象geoTrans,用当前DIB对其初始化
GeometryTrans geoTrans(pDib->GetDimensions(),pDib->m_nBitCount,
pDib->m_lpColorTable, pDib->m_pImgData);
//图像转置
geoTrans.ZhuanZhi();
//新建视图窗口,显示变换结果
CMainFrame* pFrame = (CMainFrame *)(AfxGetApp()->m_pMainWnd);
pFrame->SendMessage(WM_COMMAND, ID_FILE_NEW);
CDemoView* pView=(CDemoView*)pFrame->MDIGetActive()->GetActiveView();
CDemoDoc* pDocNew=pView->GetDocument();
ImgCenterDib *dibNew=pDocNew->GetPDib();
dibNew->ReplaceDib(geoTrans.GetDimensions(),geoTrans.m_nBitCountOut,
geoTrans.m_lpColorTable, geoTrans.m_pImgDataOut);
pView->OnInitialUpdate();
pDocNew->SetModifiedFlag(TRUE);
pDocNew->UpdateAllViews(pView);
}
void CDemoView::OnClockwise90()
{
//获取文档类中m_dib的指针,访问当前DIB数据
CDemoDoc *pDoc=GetDocument();
ImgCenterDib *pDib=pDoc->GetPDib();
//只处理灰度和彩色图像
if(pDib->m_nBitCount!=8&&pDib->m_nBitCount!=24){
::MessageBox(0,"只处理灰度和彩色图像",MB_OK,0);
return ;
}
//定义GeometryTrans类的对象geoTrans,用当前DIB对其初始化
GeometryTrans geoTrans(pDib->GetDimensions(),pDib->m_nBitCount,
pDib->m_lpColorTable, pDib->m_pImgData);
//顺时针90度
geoTrans.Clockwise90();
//新建视图窗口,显示变换结果
CMainFrame* pFrame = (CMainFrame *)(AfxGetApp()->m_pMainWnd);
pFrame->SendMessage(WM_COMMAND, ID_FILE_NEW);
CDemoView* pView=(CDemoView*)pFrame->MDIGetActive()->GetActiveView();
CDemoDoc* pDocNew=pView->GetDocument();
ImgCenterDib *dibNew=pDocNew->GetPDib();
dibNew->ReplaceDib(geoTrans.GetDimensions(),geoTrans.m_nBitCountOut,
geoTrans.m_lpColorTable, geoTrans.m_pImgDataOut);
pView->OnInitialUpdate();
pDocNew->SetModifiedFlag(TRUE);
pDocNew->UpdateAllViews(pView);
}
void CDemoView::OnAnticlockwise90()
{
//获取文档类中m_dib的指针,访问当前DIB数据
CDemoDoc *pDoc=GetDocument();
ImgCenterDib *pDib=pDoc->GetPDib();
//只处理灰度和彩色图像
if(pDib->m_nBitCount!=8&&pDib->m_nBitCount!=24){
::MessageBox(0,"只处理灰度和彩色图像",MB_OK,0);
return ;
}
//定义GeometryTrans类的对象geoTrans,用当前DIB对其初始化
GeometryTrans geoTrans(pDib->GetDimensions(),pDib->m_nBitCount,
pDib->m_lpColorTable, pDib->m_pImgData);
//逆时针90度
geoTrans.Anticlockwise90();
//新建视图窗口,显示变换结果
CMainFrame* pFrame = (CMainFrame *)(AfxGetApp()->m_pMainWnd);
pFrame->SendMessage(WM_COMMAND, ID_FILE_NEW);
CDemoView* pView=(CDemoView*)pFrame->MDIGetActive()->GetActiveView();
CDemoDoc* pDocNew=pView->GetDocument();
ImgCenterDib *dibNew=pDocNew->GetPDib();
dibNew->ReplaceDib(geoTrans.GetDimensions(),geoTrans.m_nBitCountOut,
geoTrans.m_lpColorTable, geoTrans.m_pImgDataOut);
pView->OnInitialUpdate();
pDocNew->SetModifiedFlag(TRUE);
pDocNew->UpdateAllViews(pView);
}
void CDemoView::OnRotate180()
{
//获取文档类中m_dib的指针,访问当前DIB数据
CDemoDoc *pDoc=GetDocument();
ImgCenterDib *pDib=pDoc->GetPDib();
//只处理灰度和彩色图像
if(pDib->m_nBitCount!=8&&pDib->m_nBitCount!=24){
::MessageBox(0,"只处理灰度和彩色图像",MB_OK,0);
return ;
}
//定义GeometryTrans类的对象geoTrans,用当前DIB对其初始化
GeometryTrans geoTrans(pDib->GetDimensions(),pDib->m_nBitCount,
pDib->m_lpColorTable, pDib->m_pImgData);
//旋转180度
geoTrans.Rotate180();
//新建视图窗口,显示变换结果
CMainFrame* pFrame = (CMainFrame *)(AfxGetApp()->m_pMainWnd);
pFrame->SendMessage(WM_COMMAND, ID_FILE_NEW);
CDemoView* pView=(CDemoView*)pFrame->MDIGetActive()->GetActiveView();
CDemoDoc* pDocNew=pView->GetDocument();
ImgCenterDib *dibNew=pDocNew->GetPDib();
dibNew->ReplaceDib(geoTrans.GetDimensions(),geoTrans.m_nBitCountOut,
geoTrans.m_lpColorTable, geoTrans.m_pImgDataOut);
pView->OnInitialUpdate();
pDocNew->SetModifiedFlag(TRUE);
pDocNew->UpdateAllViews(pView);
}
void CDemoView::OnZoom()
{
//获取文档类中m_dib的指针,访问当前DIB数据
CDemoDoc *pDoc=GetDocument();
ImgCenterDib *pDib=pDoc->GetPDib();
//只处理灰度和彩色图像
if(pDib->m_nBitCount!=8&&pDib->m_nBitCount!=24){
::MessageBox(0,"只处理灰度和彩色图像",MB_OK,0);
return ;
}
//原图像尺寸
CSize oldImgSize=pDib->GetDimensions();
//缩放参数设置对话框
Zoomdlg dlgPara;
//缩放参数设置对话框中原图像尺寸变量赋值
dlgPara.m_oldHeight=oldImgSize.cy;
dlgPara.m_oldWidth=oldImgSize.cx;
if(dlgPara.DoModal()==IDOK){
//定义GeometryTrans类的对象geoTrans,用当前DIB对其初始化
GeometryTrans geoTrans(pDib->GetDimensions(),pDib->m_nBitCount,
pDib->m_lpColorTable, pDib->m_pImgData);
//根据指定的新图的大小对图像进行缩放缩放
geoTrans.Zoom(dlgPara.m_newWidth, dlgPara.m_newHeight,
dlgPara.m_interpolationSelect);
//新建视图窗口,显示处理结果
CMainFrame* pFrame = (CMainFrame *)(AfxGetApp()->m_pMainWnd);
pFrame->SendMessage(WM_COMMAND, ID_FILE_NEW);
CDemoView* pView=(CDemoView*)pFrame->MDIGetActive()->GetActiveView();
CDemoDoc* pDocNew=pView->GetDocument();
ImgCenterDib *dibNew=pDocNew->GetPDib();
dibNew->ReplaceDib(geoTrans.GetDimensions(),geoTrans.m_nBitCountOut,
geoTrans.m_lpColorTable, geoTrans.m_pImgDataOut);
pView->OnInitialUpdate();
pDocNew->SetModifiedFlag(TRUE);
pDocNew->UpdateAllViews(pView);
}
}
void CDemoView::OnRotate()
{
//获取文档类中m_dib的指针,访问当前DIB数据
CDemoDoc *pDoc=GetDocument();
ImgCenterDib *pDib=pDoc->GetPDib();
//只处理灰度和彩色图像
if(pDib->m_nBitCount!=8&&pDib->m_nBitCount!=24){
::MessageBox(0,"只处理灰度和彩色图像",MB_OK,0);
return ;
}
//旋转参数设置对话框
RotateSetDlg dlgPara;
if(dlgPara.DoModal()==IDOK){
//定义GeometryTrans类的对象geoTrans,用当前DIB对其初始化
GeometryTrans geoTrans(pDib->GetDimensions(),pDib->m_nBitCount,
pDib->m_lpColorTable, pDib->m_pImgData);
//调用Rotate函数进行图像旋转,将角度和插值方式参数传进函数
geoTrans.Rotate(dlgPara.m_rotateAngle, dlgPara.m_interpolationSelect);
//新建视图窗口,显示处理结果
CMainFrame* pFrame = (CMainFrame *)(AfxGetApp()->m_pMainWnd);
pFrame->SendMessage(WM_COMMAND, ID_FILE_NEW);
CDemoView* pView=(CDemoView*)pFrame->MDIGetActive()->GetActiveView();
CDemoDoc* pDocNew=pView->GetDocument();
ImgCenterDib *dibNew=pDocNew->GetPDib();
dibNew->ReplaceDib(geoTrans.GetDimensions(),geoTrans.m_nBitCountOut,
geoTrans.m_lpColorTable, geoTrans.m_pImgDataOut);
pView->OnInitialUpdate();
pDocNew->SetModifiedFlag(TRUE);
pDocNew->UpdateAllViews(pView);
}
}
/***********************************************************************
* 函数名称:
* ValidBinaryMorphMask()
*
*函数参数:
* int *maskBuf -结构元素缓冲区
* int maskW -结构元素的宽
* int maskH -结构元素的高
*
*返回值:
* 无
*
*说明:击中击不中变换,0代表背景,255代表目标
***********************************************************************/
bool CDemoView::ValidBinaryMorphMask(int *maskBuf, int maskW, int maskH)
{
int i, j, count=0, flag=1;
for(i=0;i<maskH;i++){
for(j=0;j<maskW;j++){
if(maskBuf[i*maskW+j]==1)
count++;
if(maskBuf[i*maskW+j]!=0&&maskBuf[i*maskW+j]!=1)
flag=0;
}
}
//如果结构元素中有非0和1的数或者1的个数少于1,则为无效输入,否则为有
//效结构元素
if(flag==0||count<1)
return 0;
else
return 1;
}
void CDemoView::OnErosionForBinary()
{
//获取文档类中m_dib的指针,访问当前DIB数据
CDemoDoc *pDoc=GetDocument();
ImgCenterDib *pDib=pDoc->GetPDib();
//只处理灰度图像
if(pDib->m_nBitCount!=8){
::MessageBox(0,"只处理灰度图像",MB_OK,0);
return ;
}
//判断是否二值图像
int i, j;
CSize size=pDib->GetDimensions();
int lineByte=(size.cx+3)/4*4;
int flag=1;
for(i=0;i<size.cy;i++){
for(j=0; j<size.cx;j++){
//如果图像的数据像素灰度值既不为0也不为255,则非二值图像
if(*(pDib->m_pImgData+i*lineByte+j)!=0
&&*(pDib->m_pImgData+i*lineByte+j)!=255){
flag=0;
break;
}
}
}
//非二值图像
if(!flag){
::MessageBox(0,"需要输入二值图像",MB_OK,0);
return ;
}
//定义形态学类的对象morph,并用当前DIB为其初始化
Morphology morph(size,pDib->m_nBitCount,pDib->m_lpColorTable, pDib->m_pImgData);
//形态学结构元素选择对话框
MaskDefineDlg dlgPara;
//缺省的结构元素模板
dlgPara.m_defineMask[7]=1;
dlgPara.m_defineMask[11]=1;
dlgPara.m_defineMask[12]=1;
dlgPara.m_defineMask[13]=1;
dlgPara.m_defineMask[17]=1;
if(dlgPara.DoModal()==IDOK){
//验证结构元素的有效性
if(ValidBinaryMorphMask(dlgPara.m_defineMask,5,5)==0){
::MessageBox(0,"结构元素输入有误,只能是0和1的数,且至少有一个以上的1!",MB_OK,0);
return;
}
//输入结构元素
morph.InputMask(dlgPara.m_defineMask,5,5);
//二值腐蚀
morph.BinaryErosion();
//新建视图,显示处理结果
CMainFrame* pFrame = (CMainFrame *)(AfxGetApp()->m_pMainWnd);
pFrame->SendMessage(WM_COMMAND, ID_FILE_NEW);
CDemoView* pView=(CDemoView*)pFrame->MDIGetActive()->GetActiveView();
CDemoDoc* pDocNew=pView->GetDocument();
ImgCenterDib *dibNew=pDocNew->GetPDib();
dibNew->ReplaceDib(morph.GetDimensions(),morph.m_nBitCountOut,morph.m_lpColorTableOut, morph.m_pImgDataOut);
pView->OnInitialUpdate();
pDocNew->SetModifiedFlag(TRUE);
pDocNew->UpdateAllViews(pView);
}
}
void CDemoView::OnDilationForBinary()
{
//获取文档类中m_dib的指针,访问当前DIB数据
CDemoDoc *pDoc=GetDocument();
ImgCenterDib *pDib=pDoc->GetPDib();
//只处理灰度图像
if(pDib->m_nBitCount!=8){
::MessageBox(0,"只处理灰度图像",MB_OK,0);
return ;
}
//判断是否二值图像
int i, j;
CSize size=pDib->GetDimensions();
int lineByte=(size.cx+3)/4*4;
int flag=1;
for(i=0;i<size.cy;i++){
for(j=0; j<size.cx;j++){
//如果图像的数据像素灰度值既不为0也不为255,则非二值图像
if(*(pDib->m_pImgData+i*lineByte+j)!=0
&&*(pDib->m_pImgData+i*lineByte+j)!=255){
flag=0;
break;
}
}
}
//非二值图像
if(!flag){
::MessageBox(0,"需要输入二值图像",MB_OK,0);
return ;
}
//定义形态学类的对象morph,并用当前DIB为其初始化
Morphology morph(size,pDib->m_nBitCount,pDib->m_lpColorTable, pDib->m_pImgData);
//形态学结构元素选择对话框
MaskDefineDlg dlgPara;
//缺省的结构元素模板
dlgPara.m_defineMask[7]=1;
dlgPara.m_defineMask[11]=1;
dlgPara.m_defineMask[12]=1;
dlgPara.m_defineMask[13]=1;
dlgPara.m_defineMask[17]=1;
if(dlgPara.DoModal()==IDOK){
//验证结构元素的有效性
if(ValidBinaryMorphMask(dlgPara.m_defineMask,5,5)==0){
::MessageBox(0,"结构元素输入有误,只能是0和1的数,且至少有一个以上的1!",MB_OK,0);
return;
}
//输入结构元素
morph.InputMask(dlgPara.m_defineMask,5,5);
//二值膨胀
morph.BinaryDilation();
//新建视图,显示处理结果
CMainFrame* pFrame = (CMainFrame *)(AfxGetApp()->m_pMainWnd);
pFrame->SendMessage(WM_COMMAND, ID_FILE_NEW);
CDemoView* pView=(CDemoView*)pFrame->MDIGetActive()->GetActiveView();
CDemoDoc* pDocNew=pView->GetDocument();
ImgCenterDib *dibNew=pDocNew->GetPDib();
dibNew->ReplaceDib(morph.GetDimensions(),morph.m_nBitCountOut,morph.m_lpColorTableOut, morph.m_pImgDataOut);
pView->OnInitialUpdate();
pDocNew->SetModifiedFlag(TRUE);
pDocNew->UpdateAllViews(pView);
}
}
void CDemoView::OnOpenForBinary()
{
//获取文档类中m_dib的指针,访问当前DIB数据
CDemoDoc *pDoc=GetDocument();
ImgCenterDib *pDib=pDoc->GetPDib();
//只处理灰度图像
if(pDib->m_nBitCount!=8){
::MessageBox(0,"只处理灰度图像",MB_OK,0);
return ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -