1 在新插入的对话框中添加两个Picture Control和两个Button
2 打开图像代码和显示图像代码和前面两篇博文类似
BEGIN_MESSAGE_MAP(CEdgeDetDlg, CDialogEx) ON_WM_PAINT() ON_BN_CLICKED(IDC_OPEN_BTN, &CEdgeDetDlg::OnClickedOpenBtn) ON_BN_CLICKED(IDC_EDGE_DETECTION_BTN, &CEdgeDetDlg::OnClickedEdgeDetectionBtn) END_MESSAGE_MAP() // CEdgeDetDlg 消息处理程序 void CEdgeDetDlg::OnClickedOpenBtn() { // TODO: 在此添加控件通知处理程序代码 CFileDialog dlg(TRUE,_T(".bmp"),_T("*.jpg"),OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, _T("Bit Map(*.bmp)|*.bmp|JPEG Map(*.jpg)|*.jpg||")); if(dlg.DoModal() == IDOK) { if(!yuantu.IsNull()) { yuantu.Destroy(); } yuantu.Load(dlg.GetPathName()); Invalidate(FALSE); } } //边缘检测 void CEdgeDetDlg::OnClickedEdgeDetectionBtn() { if (yuantu.IsNull()) { MessageBox(_T("还未打开图像"),_T("系统提示"),MB_OK); return; } if(!bianyuantu.IsNull()) { bianyuantu.Destroy(); } int i,j,temp; int pixel[4]; int width = yuantu.GetWidth(); int height = yuantu.GetHeight(); int widthBytes = yuantu.GetPitch(); bianyuantu.Create(width,height,yuantu.GetBPP()); if(yuantu.IsIndexed()) { yuantu.GetColorTable(0,256,colorTable); bianyuantu.SetColorTable(0,256,colorTable); } BYTE *pYuantuData = (BYTE*)yuantu.GetBits(); BYTE *pBianyuantuData =(BYTE*)bianyuantu.GetBits(); for(j=0;j<height-1;j++) { for(i=0;i<width-1;i++) { pixel[0]=pYuantuData[j*widthBytes+i]; pixel[1]=pYuantuData[j*widthBytes+i+1]; pixel[2]=pYuantuData[(j+1)*widthBytes+i]; pixel[3]=pYuantuData[(j+1)*widthBytes+i+1]; temp=(int)sqrt((double)((pixel[0]-pixel[3])*(pixel[0]-pixel[3]) +(pixel[1]-pixel[2])*(pixel[1]-pixel[2]))); pBianyuantuData[j*widthBytes+i]=temp; } } Invalidate(FALSE); } void CEdgeDetDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // 使图标在工作区矩形中居中 int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // 绘制图标 dc.DrawIcon(x, y, m_hIcon); } else { CDialogEx::OnPaint(); if(!yuantu.IsNull()) { CWnd* pWndYuantu = this->GetDlgItem(IDC_YUANTU); CDC* pdc = pWndYuantu->GetDC(); yuantu.Draw(pdc->GetSafeHdc(), 0, 0); pWndYuantu->ReleaseDC(pdc); } if(!bianyuantu.IsNull()) { CWnd* pWndBianyuantu = this->GetDlgItem(IDC_BIANYUANTU); CDC* pdc = pWndBianyuantu->GetDC(); bianyuantu.Draw(pdc->GetSafeHdc(), 0, 0); pWndBianyuantu->ReleaseDC(pdc); } } }
测试时用的是灰度图像,实现效果如下:
时间: 2024-08-29 08:15:54