在MFC对话框中显示图片的三种方法(有两种使用OpenCv)

OpenCV学习 同时被 2 个专栏收录
3 篇文章 0 订阅
4 篇文章 0 订阅
最近写了一个用对话框显示图片的程序,这里将学习到的东西整理一下:
编程环境:VC6.0+OpenCv1.0
准备工作:用VC6.0生成一个对话框外壳(全被采用默认设置),然后在对话框中添加一个静态控件令其ID为IDC_BITMAP,用Wizard为这个控件添加一个Contol 类型的变量:m_Img;再添加一个按钮caption为“打开图片”ID =  IDC_OPEN,双击按钮在OnOpen()函数中添加如下内容:
方法一(这个方法仅能显示位图(.bmp)):
在OnOpen函数中添加:
strFilter += "All Files(*.*)|*.*|"; CFileDialog bmifileDlg(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST,strFilter); 
  if(bmifileDlg.DoModal() == IDOK) 
  {
this->m_Img.ModifyStyle(0,SS_BITMAP); 
  HBITMAP hBmp =(HBITMAP)::LoadImage(0,bmifileDlg.GetPathName(),IMAGE_BITMAP
,0,0,LR_LOADFROMFILE); 
      this->m_Img.SetBitmap(hBmp);
运行效果如下图1所示

图1
方法二(用OpenCv):
现在C...Dlg类中添加FillBmpInfo(PBITMAPINFO pBmpInfo,int nWidth,int nHeight,int nBitCount)函数
函数实现如下:
FillBmpInfo(PBITMAPINFO pBmpInfo,int nWidth,int nHeight,int nBitCount)
pBmpInfo->bmiHeader.biWidth = nWidth;
pBmpInfo->bmiHeader.biHeight = -abs(nHeight);//这里添加符号不知道为什么,不过你可以去掉运 行看看
pBmpInfo->bmiHeader.biBitCount = nBitCount;
pBmpInfo->bmiHeader.biPlanes = 1;
pBmpInfo->bmiHeader.biCompression = BI_RGB;
pBmpInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
int i;
if(nBitCount == 8)//8位位图有调色板
{
RGBQUAD ColorTable[256];
for(i = 0;i < 256;i ++)
{
ColorTable[i].rgbBlue = ColorTable[i].rgbGreen =
ColorTable[i].rgbRed =   (BYTE)i;
ColorTable[i].rgbReserved = (BYTE)0;
}
memcpy(pBmpInfo->bmiColors,ColorTable,1024);
}
以下是OnOpen函数的实现:
BITMAPINFO BmpInfo;//StrechDIBits函数中需要
IplImage *pImg = NULL;
CString strFilter ="bmp file(*.bmp;*.dib)|*.bmp;*dib|";
strFilter += "All Files(*.*)|*.*|";
CFileDialog bmifileDlg(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_PATHMUSTEXIST|  OFN_FILEMUSTEXIST,strFilter);
if(bmifileDlg.DoModal() == IDOK)
{
pImg = cvLoadImage(bmifileDlg.GetPathName(),CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR);//读图像文件
if (!pImg)
{
MessageBox("读取文件失败!","tips:",MB_OK);
return;
}
HDC hdc = ::GetDC(m_Img.m_hWnd);
::StretchDIBits(hdc,0,0,pImg->width,pImg->height,0,0,pImg->width,pImg->height,pImg->imageData,&BmpInfo,DIB_RGB_COLORS,SRCCOPY);
if(pImg)
cvReleaseImage(&pImg);
运行程序结果如图2所示:
图2
方法三(OpenCv):
在OnOpen函数中添加
IplImage *pImg = NULL;
BITMAPINFO BmpInfo;//StrechDIBits中需要
CString strFilter ="bmp file(*.bmp;*.dib)|*.bmp;*dib|";
strFilter += "All Files(*.*)|*.*|";
CFileDialog bmifileDlg(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST,strFilter);
if(bmifileDlg.DoModal() == IDOK)
{
pImg = cvLoadImage(bmifileDlg.GetPathName(),CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR);//读图像文件
if (!pImg)
{
MessageBox("读取文件失败!","tips:",MB_OK);
return;
}
CvvImage image;
HDC Hdc = GetDlgItem(IDC_BITMAP)->GetDC()->GetSafeHdc();
CRect rect;
m_Img.GetClientRect(&rect);
image.CopyOf(pImg);
image.DrawToHDC(Hdc, &rect);
if(pImg)
cvReleaseImage(&pImg);
image.Destroy();
}
运行程序效果如下图3:



图3
可以看到方法三中图像有点失真。
方法2,3都能显示多种图像文件,但是8位的位图却不能显示,不知道为什么(希望讨论呀)。
  • 3
    点赞
  • 1
    评论
  • 18
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

评论 1 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

Wordsky

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值