创建按钮,为按钮添加点击事件,点击按钮后会弹出文件选择框。选择图像所在文件进行显示:
第一种方法:
void Ctest3Dlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
CString strFilePath, strFileName;
CFileDialog fileDlg(TRUE, _T("png"), NULL, 0, _T("image Files(*.bmp; *.jpg;*.png)|*.JPG;*.PNG;*.BMP|All Files (*.*) |*.*|"), this);
fileDlg.DoModal();
strFilePath = fileDlg.GetPathName(); //文件路径
strFileName = fileDlg.GetFileName(); //文件名
if (strFilePath == _T(""))
{
return;
}
CImage image;
image.Load(strFilePath);
CRect rectControl; //控件矩形对象
image1.GetClientRect(rectControl);
CDC *pDc = image1.GetDC(); //设备上下文对象的类
rectControl = CRect(rectControl.TopLeft(), CSize((int)rectControl.Width(), (int)rectControl.Height()));
image1.SetBitmap(NULL); //清空picture
image.Draw(pDc->m_hDC, rectControl); //将图片绘制到Picture控件表示的矩形区域
image.Destroy();
image1.ReleaseDC(pDc);
}
第二种方法:
//Mat类型转CImage类型
void MatToCImage(Mat &mat, CImage &cImage)
{
//create new CImage
int width = mat.cols;
int height = mat.rows;
int channels = mat.channels();
cImage.Destroy(); //clear
cImage.Create(width, height, 8 * channels); //默认图像像素单通道占用1个字节
//copy values
uchar* ps;
uchar* pimg = (uchar*)cImage.GetBits(); //A pointer to the bitmap buffer
int step = cImage.GetPitch();
for (int i = 0; i < height; ++i)
{
ps = (mat.ptr<uchar>(i));
for (int j = 0; j < width; ++j)
{
if (channels == 1) //gray
{
*(pimg + i * step + j) = ps[j];
}
else if (channels == 3) //color
{
for (int k = 0; k < 3; ++k)
{
*(pimg + i * step + j * 3 + k) = ps[j * 3 + k];
}
}
}
}
}
void Ctest3Dlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
int cxl, cyl;
Mat rgbImageL1, rgbImageL;//opencv图片
rgbImageL = imread("E:/中策/0308/030801/1.bmp");
CImage rgbImageL2;
CRect rectl, pic_rectl;
int widthl, heightl;
//改变图片大小适应picture控件
GetDlgItem(IDC_PIC)->GetClientRect(&pic_rectl);
widthl = pic_rectl.right;
heightl = pic_rectl.bottom;
resize(rgbImageL, rgbImageL1, Size(widthl, heightl));
MatToCImage(rgbImageL1, rgbImageL2);//OpenCV中Mat对象转MFC的CImage类的函数(见我另一篇博文)
//获取图片的宽 高度
cxl = rgbImageL2.GetWidth();
cyl = rgbImageL2.GetHeight();
//获取Picture Control控件的大小
GetDlgItem(IDC_PIC)->GetWindowRect(&rectl);
//将客户区选中到控件表示的矩形区域内
ScreenToClient(&rectl);
//窗口移动到控件表示的区域
GetDlgItem(IDC_PIC)->MoveWindow(rectl.left, rectl.top, cxl, cyl, TRUE);
CWnd *pWnd = NULL;
pWnd = GetDlgItem(IDC_PIC);//获取控件句柄
pWnd->GetClientRect(&rectl);//获取句柄指向控件区域的大小
CDC *pDc = NULL;
pDc = pWnd->GetDC();//获取picture的DC
rgbImageL2.Draw(pDc->m_hDC, rectl);//将图片绘制到picture表示的区域内
ReleaseDC(pDc);
}