利用MFC的Picture控件归一大小显示图像

句柄名设置为 OnBnClickedReadimg,主要的响应操作包括 弹出对话框选择图片文件、读入图片文件、对图片统一缩放至256*256的大小、显示图像,代码如下:

    // TODO: Add your control notification handler code here
    CFileDialog dlg(
        TRUE, _T("*.bmp"), NULL,
        OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY,
        _T("image files (*.bmp; *.jpg) |*.bmp; *.jpg | All Files (*.*) |*.*||"), NULL
        );                                        // 选项图片的约定
    dlg.m_ofn.lpstrTitle = _T("Open Image");    // 打开文件对话框的标题名
    if( dlg.DoModal() != IDOK )                    // 判断是否获得图片
        return;
    
    CString mPath = dlg.GetPathName();            // 获取图片路径

    IplImage* ipl = cvLoadImage( mPath, 1 );    // 读取图片、缓存到一个局部变量 ipl 中
    if( !ipl )                                    // 判断是否成功载入图片
        return;
    if( TheImage )                                // 对上一幅显示的图片数据清零
        cvZero( TheImage );
    
    ResizeImage( ipl );    // 对读入的图片进行缩放,使其宽或高最大值者刚好等于 256,再复制到 TheImage 中
    ShowImage( TheImage, IDC_ShowImg );            // 调用显示图片函数    
    cvReleaseImage( &ipl );                        // 释放 ipl 占用的内存

其中包含了两个新的成员函数 ResizeImage 和 ShowImage,前者的作用是对读入的不同大小的图像进行缩放,再通过设置 ROI 的方式将图像存入 256*256 的 TheImage 中;后者是将图像 TheImage 显示到图片显示控件 IDC_ShouImg 窗口的正中部位。为了实现这两个功能,首先在 Class View 面板右击 CmymfcDlg,选择 Add –> Add Function,创建两个函数:void ShowImage( IplImage* img, UINT ID ) 和 void ResizeImage(IplImage* img)。以下是这两个函数的实现代码:

void CmymfcDlg::ResizeImage(IplImage* img)
{
    // 读取图片的宽和高
    int w = img->width;
    int h = img->height;

    // 找出宽和高中的较大值者
    int max = (w > h)? w: h;

    // 计算将图片缩放到TheImage区域所需的比例因子
    float scale = (float) ( (float) max / 256.0f );
    
    // 缩放后图片的宽和高
    int nw = (int)( w/scale );
    int nh = (int)( h/scale );

    // 为了将缩放后的图片存入 TheImage 的正中部位,需计算图片在 TheImage 左上角的期望坐标值
    int tlx = (nw > nh)? 0: (int)(256-nw)/2;
    int tly = (nw > nh)? (int)(256-nh)/2: 0;

    // 设置 TheImage 的 ROI 区域,用来存入图片 img
    cvSetImageROI( TheImage, cvRect( tlx, tly, nw, nh) );

    // 对图片 img 进行缩放,并存入到 TheImage 中
    cvResize( img, TheImage );

    // 重置 TheImage 的 ROI 准备读入下一幅图片
    cvResetImageROI( TheImage );
}

void CmymfcDlg::ShowImage( IplImage* img, UINT ID )    // ID 是Picture Control控件的ID号
{
    CDC* pDC = GetDlgItem( ID ) ->GetDC();        // 获得显示控件的 DC
    HDC hDC = pDC ->GetSafeHdc();                // 获取 HDC(设备句柄) 来进行绘图操作

    CRect rect;
    GetDlgItem(ID) ->GetClientRect( &rect );
    int rw = rect.right - rect.left;            // 求出图片控件的宽和高
    int rh = rect.bottom - rect.top;
    int iw = img->width;                        // 读取图片的宽和高
    int ih = img->height;
    int tx = (int)(rw - iw)/2;                    // 使图片的显示位置正好在控件的正中
    int ty = (int)(rh - ih)/2;
    SetRect( rect, tx, ty, tx+iw, ty+ih );

    CvvImage cimg;
    cimg.CopyOf( img );                            // 复制图片
    cimg.DrawToHDC( hDC, &rect );                // 将图片绘制到显示控件的指定区域内

    ReleaseDC( pDC );
}

函数 ResizeImage 是参考了学习笔记(5)中单窗口显示多幅图像的函数 cvShowMultiImages 修改而成的,函数 ShowImage 则是参考了帖子《OpenCV如何把图像显示到MFC的picture控件上》的代码,另外下面几个帖子也可以参考:

1、《MFC picture control 畫框的問題》 
2、《MFC picture control控件实现(隐藏)文字显示》 
3、《MFC在Picture Control中显示图片(jpg)遇到的问题》 
4、《vc怎样在picture control中显示jpg,jif,bmp格式图象》 
5、《使用Picture Control显示BMP图片


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值