最近写了一个用对话框显示图片的程序,这里将学习到的东西整理一下:

编程环境: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位的位图却不能显示,不知道为什么(希望讨论呀)。

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

  1. MFC对话框中显示图片的四种方法

    先分类如下: (一) 非动态显示图片(即图片先通过资源管理器载入,有一个固定ID) (二) 动态载入图片(即只需要在程序中指定图片的路径即可载入) 为方便说明,我们已经建好一个基于对话框的工程,名为T ...

  2. 在MFC对话框中显示html网页

    最近在写一个小软件,想在MFC对话框中显示帮助文档,都是html格式的,上网找了好多资料,用一个CHtmlCtrl类的东西,但是网上找的这个类放在VS2005下编译不过去,老是提示错误.于是几经修改, ...

  3. html中插入音乐播放器,网页中插入音乐播放器WMA 方法有两种:object和embed

    网页中插入音乐播放器(详细,全面,加图) 通常有三种方法,使用普通的html方法有两种:object和embed.另一种是用flash编写的播放器,这种方法兼容性级好,但难度较大,较复杂. 其中obj ...

  4. html 直接播放wma,网页中插入音乐播放器WMA 方法有两种:object和embed

    网页中插入音乐播放器(详细,全面,加图) 通常有三种方法,使用普通的html方法有两种:object和embed.另一种是用flash编写的播放器,这种方法兼容性级好,但难度较大,较复杂. 其中obj ...

  5. PDF中的图片如何提取出来?分享两种提取方法

    怎么把PDF文件中的图片提取出来呢?PDF文件大家在学习或者是办公中都会经常使用到.我们在做一份文件时,往往是需要查找资料来补充内容的,很多时候我们查找出的资料是PDF文件格式,如果发现里面的图片做到 ...

  6. java 中字符串比较方法_java中常用的字符串的比较方法(两种)

    比较字符串比较常用的两个方法是运算符"="和String的equals方法. 使用"="比较两个字符串,是比较两个对象的的"地址"是否一致, ...

  7. 判断互质数的九种方法(两种定义+三种质数+两种相邻+两种裂项)

    a < ∣ b ∣ a<\vert b\vert a<∣b∣ 定义:  a⊥b 当且仅当 (a,b)=1  a⊥b当且仅当 xa+yb=1(存在x,y是正整数) 质数:  a和 ...

  8. asp.net中显示DataGrid控件列序号的几种方法

    在aps.net中多数据绑定的控件很多,论功能来说,应该属DataGrid最为齐全,但它没有提供现成的显示记录序号的功能,不过我们可以通过它所带的一些参数来间接得到序号,下面来看看怎样得到和显示序号值 ...

  9. 调用opencv3.x 库,在MFC中显示图片

    调用opencv3.x 库,在MFC中显示图片 使用opencv和MFC显示图片的方法大致分为以下几种: 1:将opencv的显示对话框嵌入到MFC窗口. 2:使用CvvImage类显示图片. 3:将 ...

最新文章

  1. 7 成中国职场人厌班,我们为什么会陷入职业倦怠?
  2. linux elf 文件查看工具 readelf
  3. 基于Kubernetes1.20.1版本开发调试环境搭建
  4. 【sock_stream和sock_dgram】、 【AF_INET和AF_UNIX】
  5. VS2005 自动生成属性(转)
  6. N皇后问题的两个最高效的算法
  7. java异常处理试题答案_JAVA异常处理试题及答案
  8. logback-spring.xml配置文件
  9. vue 项目构建失败 Unhandled rejection Error 的原因 sass解析异常
  10. 华为出售荣耀为不实消息,赵明曾在内部否认;迅雷前CEO陈磊涉嫌职务侵占罪被调查 ;Python 3.9发布|极客头条...
  11. Java Servlet Filter
  12. VMware 运行出现“由于应用程序配置不正确,应用程序未能启动。重新安装应用程序可能会纠正这个问题”解决方案
  13. mysql pxc缺点_MYSQL高可用之PXC
  14. 介词for和with 和of的用法_to for of with的用法区别
  15. 如何通过织云 Lite 愉快地玩转 TSW
  16. 别被别人抢走了你的时间!
  17. Stroke:脑白质微结构完整性可预测脑卒中预后功能恢复情况
  18. 全球与中国光刻机运行现状与发展趋势预测报告2022-2028年
  19. 晒晒我的“无法操作”的“发财计划”
  20. IAR For ARM 历史版本下载链接

热门文章

  1. 闪迪u盘适合装linux,3分钟轻体验告诉你这款闪迪U盘值不值得买
  2. go 语言中 struct 中 json 是代表什么意思
  3. 2021-10-26为什么单相短路和两相接地短路 的阻抗Zf的位置不同
  4. 运用计算机考试ppt,职称计算机考试PowerPoint模拟试题
  5. 判断路由器优劣的3个方面
  6. 无神经网络车牌识别(2)--特征提取与特征匹配
  7. 转:自动化测试的7个步骤
  8. Android报错:Using WebView from more than one process at once with the same data directory is not...
  9. QIIME2 分析微生物组测序数据
  10. 智慧环保在GIS系统中的应用体现