基于对话框的图片打开与显示

来源:互联网 发布:两个表格相同数据合并 编辑:程序博客网 时间:2024/05/17 02:18

(一)背景

在老师的指导下致力于计算机视觉方面的研究,语言方面选择了C++,这给我增加了难题,我只学过C语言,没学过C++,看来要开始学C++了。

对一幅图片进行灰度化、边缘检测等方面的处理,首先需要把图片显示出来。后期还要处理从摄像头获取的图片,而一般摄像头获取的图片的格式是.jpg(.jpeg)格式。为了实现jpg格式图片的打开与显示,我到图书馆翻阅了很多资料,要么有的教程讲如何显示.bmp格式的图片,要么就是显示特定目录下的.jpg格式的图片,终于找到了一篇相关的文章,它提供的方法是使用基于COM接口的Ipicture控件,但我想它虽然能暂时满足当时的需求,但会对以后的操作带来麻烦,所以还是摒弃了它。

无意间找到了图像处理的三利器之一——GDI+,发现它的功能很强大,至少在图片显示方面,因为GDI+Image类支持几乎所有的图像格式,具体包括:BMPICONGIFJPEGExifPNGTIFFWMFEMF。而且它的一个函数GetPixel也很实用,它能获取某点的RGB各分量的值,所以决定借助于GDI+显示.jpg格式的图片。

(二)配置方法

下面介绍下GDI+Visual C++ 2005中的配置方法(Visual C++ 2005中已经包含了GDI+开发包)

1在项目属性中添加GDI+静态链接库(假设项目名为Test

打开项目,选择【项目】—【Test属性】命令,打开“项目属性”对话框。展开“配置属性”,选择“链接器”下的“输入”,然后在“附加依赖项”中添加“gdiplus.lib”。如果添加多个库文件,中间用空格隔开。

现在完成了“Debug”模式下GDI+的配置,此时Debug模式下生成的程序就能正常编译了。要想在“Release”模式下程序也能正常编译,只要选择对话框左上角“配置”下的“Release”选项,然后重复刚才的添加方法即可。

2、添加必要代码

1)打开“解决方案资源管理器”,打开“stdafx.h”文件,在其中添加如下代码:

#include <gdiplus.h>

using namespace Gdiplus;

2打开“类视图”,选中应用程序类CTestApp,为其添加两个成员变量。

private:

          ULONG_PTR m_GdiplusToken;

          GdiplusStartupInput m_GdiplusStartupInput;

3CTestApp类的InitInstance函数中添加如下代码:

//GDI+图像库初始化

     GdiplusStartup(&m_GdiplusToken,&m_GdiplusStartupInput,NULL);

4重写CTestApp类的ExitInstance函数,并添加如下代码:

int CPhotoIDEApp::ExitInstance()

{

          //关闭GDI+图像库

          GdiplusShutdown(m_GdiplusToken);

return CWinApp::ExitInstance();

}

到此配置过程全部结束。

Visual C++ 6.0中使用GDI+

1、由于Visual C++ 6.0不包含GDI+的开发包,所以需要下载一个GDI+ SDKGDI+的开发包可以在下面提供的例程中得到。

2、在项目属性中添加GDI+静态链接库

打开工程,选择【Project】—【Setting】命令,打开“项目属性”对话框,然后选择“Link”标签,在“Object/library modules”中输入“gdiplus.lib”。

同样,如果想在“Release”模式下使用GDI+,可以单击“Setting For”下拉列表框,选择“Win32 Release”,然后重复刚才的添加方法即可。

3、添加必要代码

除第一步不同外,其它配置方法与VC 2005的配置方法相同。Visual C++ 6.0需要在stdafx.h中添加如下代码:

#ifndef ULONG_PTR

#define ULONG_PTR unsigned long*

#include "GdiPlus.h"

using namespace Gdiplus;

#endif

到此,GDI+的工程设置已经完成了,如果你还没有配置得当,可以发邮件至cndongliang@126.com,或在博文后边留言,我会尽力帮您解决问题。

 

 

(三)编写打开对话框函数

首先在TestDlg.h中的构造函数中添加CString类型的变量m_filename,用于保存要打开的文件的文件名。

void CTestDlg::OnOpen()

{

     // TODO: 在此添加控件通知处理程序代码

CFileDialog dlg(TRUE,"jpg","*.jpg",OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"JPEG文件(*.jpg)|*.jpg|GIF文件(*.gif)|*.gif||",NULL);

     if(dlg.DoModal()==IDOK)

     {

         m_filename=dlg.GetFileName();

         Invalidate(false);

     }       

}

(四)OnPaint函数中添加显示图片的代码

CDC* pDC=GetDC();

     Graphics graph(pDC->GetSafeHdc());

 

     CRect winrect;

     GetClientRect(winrect);

 

     Rect rect(150,80,400,300);

 

     Image image(m_filename.AllocSysString());

     graph.DrawImage(&image,rect);

     ReleaseDC(pDC);

完整的代码请点击下面的链接下载,其中包括GDI+开发包(有问题请发送邮件至cndongliang@126.com,大家共同探讨)

http://download.csdn.net/source/1647741