📄 demoview.cpp
字号:
GrayTrans graytrans(pDib->GetDimensions(),pDib->m_nBitCount,
pDib->m_lpColorTable, pDib->m_pImgData);
//灰度变彩色格式
graytrans.GrayToColor();
//建立一个新视图,显示分割结果
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(graytrans.GetDimensions(),graytrans.m_nBitCountOut,graytrans.m_lpColorTableOut, graytrans.m_pImgDataOut);
pView->OnInitialUpdate();
pDocNew->SetModifiedFlag(TRUE);
pDocNew->UpdateAllViews(pView);
}
void CDemoView::OnLinearStrecth()
{
//获取文档类中m_dib的指针,访问当前DIB数据
CDemoDoc *pDoc=GetDocument();
ImgCenterDib *pDib=pDoc->GetPDib();
//异常判断
if(pDib->m_nBitCount!=24&&pDib->m_nBitCount!=8){
::MessageBox(0,"只处理彩色和灰度图像",MB_OK,0);
return ;
}
//线性拉伸参数设置对话框
linearStretchParamDlg dlgPara;
if(dlgPara.DoModal()==IDOK){
//获取用户设置的两个拉伸转折点
CPoint point[2];
point[0].x=dlgPara.m_firstPointX;
point[0].y=dlgPara.m_firstPointY;
point[1].x=dlgPara.m_secondPointX;
point[1].y=dlgPara.m_secondPointY;
//判断参数的合理性
if(point[0].x<0||point[0].x>255||point[1].x<0||point[1].x>255
||point[0].y<0||point[0].y>255||point[1].y<0||point[1].y>255
||point[0].x>point[1].x){
::MessageBox(0,"参数不合理",MB_OK,0);
return;
}
//定义灰度变换的类对象
GrayTrans graytrans(pDib->GetDimensions(),pDib->m_nBitCount,
pDib->m_lpColorTable, pDib->m_pImgData);
//线性拉伸
graytrans.LinearStrech(point);
//新建窗口显示
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(graytrans.GetDimensions(),graytrans.m_nBitCountOut,graytrans.m_lpColorTableOut, graytrans.m_pImgDataOut);
pView->OnInitialUpdate();
pDocNew->SetModifiedFlag(TRUE);
pDocNew->UpdateAllViews(pView);
}
}
void CDemoView::OnDuiShuStretch()
{
//获取文档类中m_dib的指针,访问当前DIB数据
CDemoDoc *pDoc=GetDocument();
ImgCenterDib *pDib=pDoc->GetPDib();
//异常判断
if(pDib->m_nBitCount!=24&&pDib->m_nBitCount!=8){
::MessageBox(0,"只处理彩色和灰度图像",MB_OK,0);
return ;
}
NonlinearStretchDlg dlgPara;
//对数拉伸参数初始化
dlgPara.m_a=0;
dlgPara.m_b=(float)0.033;
dlgPara.m_c=(float)2;
if(dlgPara.DoModal()==IDOK){
if(dlgPara.m_b==0||dlgPara.m_c==1){
::MessageBox(0,"b不能为0,且c不能为1",MB_OK,0);
return;
}
//定义灰度变换的类对象
GrayTrans graytrans(pDib->GetDimensions(),pDib->m_nBitCount,
pDib->m_lpColorTable, pDib->m_pImgData);
//传递对数拉伸参数,进行非线性拉伸
graytrans.DuiShuStrech(dlgPara.m_a, dlgPara.m_b, dlgPara.m_c);
//新建窗口显示
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(graytrans.GetDimensions(),graytrans.m_nBitCountOut,graytrans.m_lpColorTableOut, graytrans.m_pImgDataOut);
pView->OnInitialUpdate();
pDocNew->SetModifiedFlag(TRUE);
pDocNew->UpdateAllViews(pView);
}
}
void CDemoView::OnZhiShuStretch()
{
//获取文档类中m_dib的指针,访问当前DIB数据
CDemoDoc *pDoc=GetDocument();
ImgCenterDib *pDib=pDoc->GetPDib();
//异常判断
if(pDib->m_nBitCount!=24&&pDib->m_nBitCount!=8){
::MessageBox(0,"只处理彩色和灰度图像",MB_OK,0);
return ;
}
NonlinearStretchDlg dlgPara;
//指数拉伸参数初始化
dlgPara.m_a=(float)128;
dlgPara.m_b=2;
dlgPara.m_c=(float)0.6;
if(dlgPara.DoModal()==IDOK){
//定义灰度变换的类对象
GrayTrans graytrans(pDib->GetDimensions(),pDib->m_nBitCount,
pDib->m_lpColorTable, pDib->m_pImgData);
//传递指数拉伸参数,进行非线性拉伸
graytrans.ZhiShuStrech(dlgPara.m_a, dlgPara.m_b, dlgPara.m_c);
//新建窗口显示
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(graytrans.GetDimensions(),graytrans.m_nBitCountOut,graytrans.m_lpColorTableOut, graytrans.m_pImgDataOut);
pView->OnInitialUpdate();
pDocNew->SetModifiedFlag(TRUE);
pDocNew->UpdateAllViews(pView);
}
}
void CDemoView::OnHistgramAver()
{
//获取文档类中m_dib的指针,访问当前DIB数据
CDemoDoc *pDoc=GetDocument();
ImgCenterDib *pDib=pDoc->GetPDib();
//只处理灰度图像
if(pDib->m_nBitCount!=8){
::MessageBox(0,"只处理灰度图像",MB_OK,0);
return ;
}
//将pDib中的图像数据作为输入数据,调用带参数的构造函数,
//定义Histogram类的对象hist
Histogram hist(pDib->GetDimensions(),pDib->m_nBitCount,
pDib->m_lpColorTable, pDib->m_pImgData);
//直方图均衡
hist.histAve();
//新建视图窗口,显示变换结果
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(hist.GetDimensions(),hist.m_nBitCount,hist.m_lpColorTable, hist.m_pImgDataOut);
pView->OnInitialUpdate();
pDocNew->SetModifiedFlag(TRUE);
pDocNew->UpdateAllViews(pView);
}
void CDemoView::OnHistogramDraw()
{
//获取文档类中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 ;
}
//直方图绘制对话框
HistogramDrawDlg dlgHist;
dlgHist.m_histogramDib.ReplaceDib(pDib->GetDimensions(),pDib->m_nBitCount,
pDib->m_lpColorTable, pDib->m_pImgData);
//显示直方图
dlgHist.DoModal();
}
void CDemoView::OnFft()
{
//获取文档类中m_dib的指针,访问当前DIB数据
CDemoDoc *pDoc=GetDocument();
ImgCenterDib *pDib=pDoc->GetPDib();
//只处理灰度图像
if(pDib->m_nBitCount!=8){
::MessageBox(0,"只处理灰度图像",MB_OK,0);
return ;
}
//判断图像大小是否为2的幂次的方阵
int isValidateFlag=1;
int width=pDib->GetDimensions().cx;
int height=pDib->GetDimensions().cy;
int i=1;
while(i<width)
i=i*2;
if(i!=width)//图像宽不是2的幂次方
isValidateFlag=0;
i=1;
while(i<height)
i=i*2;
if(i!=height)//图像高不是2的幂次方
isValidateFlag=0;
if(isValidateFlag==0){
::MessageBox(0,"输入图像的宽和高应为2的幂次方",MB_OK,0);
return ;
}
//输入图像数据给transform_FFT类对象FFTTrans
FFTTrans.InputImgData(pDib->GetDimensions(),pDib->m_nBitCount,
pDib->m_lpColorTable, pDib->m_pImgData);
//快速傅立叶变换
FFTTrans.Fourier();
//新建视图窗口,显示变换结果
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(FFTTrans.GetDimensions(),FFTTrans.m_nBitCountOut,
FFTTrans.m_lpColorTable, FFTTrans.m_pImgDataOut);
pView->OnInitialUpdate();
pDocNew->SetModifiedFlag(TRUE);
pDocNew->UpdateAllViews(pView);
}
void CDemoView::OnIfft()
{
//傅立叶反变换
FFTTrans.IFourier();
//新建视图窗口,显示图像恢复的结果
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(FFTTrans.GetDimensions(),FFTTrans.m_nBitCountOut,
FFTTrans.m_lpColorTable, FFTTrans.m_pImgDataOut);
pView->OnInitialUpdate();
pDocNew->SetModifiedFlag(TRUE);
pDocNew->UpdateAllViews(pView);
}
void CDemoView::OnFFTEx()
{
//获取文档类中m_dib的指针,访问当前DIB数据
CDemoDoc *pDoc=GetDocument();
ImgCenterDib *pDib=pDoc->GetPDib();
//只处理灰度图像
if(pDib->m_nBitCount!=8){
::MessageBox(0,"只处理灰度图像",MB_OK,0);
return ;
}
//输入图像数据给transform_FFT类对象FFTTrans
FFTTrans.InputImgData(pDib->GetDimensions(),pDib->m_nBitCount,
pDib->m_lpColorTable, pDib->m_pImgData);
//调用FourierEx()函数进行快速傅立叶变换,该函数不要求输入图像为2的幂次的方阵
FFTTrans.FourierEx();
//新建视图窗口,显示变换结果
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(FFTTrans.GetDimensions(),FFTTrans.m_nBitCountOut,
FFTTrans.m_lpColorTable, FFTTrans.m_pImgDataOut);
pView->OnInitialUpdate();
pDocNew->SetModifiedFlag(TRUE);
pDocNew->UpdateAllViews(pView);
}
void CDemoView::OnIFFTEx()
{
//傅立叶反变换
FFTTrans.IFourierEx();
//新建视图窗口,显示图像恢复的结果
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(FFTTrans.GetDimensions(),FFTTrans.m_nBitCountOut,
FFTTrans.m_lpColorTable, FFTTrans.m_pImgDataOut);
pView->OnInitialUpdate();
pDocNew->SetModifiedFlag(TRUE);
pDocNew->UpdateAllViews(pView);
}
void CDemoView::OnMove()
{
//获取文档类中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 ;
}
//平移参数设置对话框
GeometryMoveDlg dlgPara;
if(dlgPara.DoModal()==IDOK){
//定义GeometryTrans类的对象geoTrans,用当前DIB对其初始化
GeometryTrans geoTrans(pDib->GetDimensions(),pDib->m_nBitCount,
pDib->m_lpColorTable, pDib->m_pImgData);
//将dlgPara.m_OffsetX, dlgPara.m_OffsetY作为平移量,对图像平移
geoTrans.Move(dlgPara.m_OffsetX, dlgPara.m_OffsetY);
//新建视图窗口,显示变换结果
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::OnHorizontalMirror()
{
//获取文档类中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.MirrorHori();
//新建视图窗口,显示变换结果
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::OnVerticalMirror()
{
//获取文档类中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.MirrorVerti();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -