现在的位置: 首页 > 综合 > 正文

在MFC中调用GDI+显示图像Mat图像

2013年10月13日 ⁄ 综合 ⁄ 共 1334字 ⁄ 字号 评论关闭

在网上找了找,发现使用GDI+是个好放方法。

首先是设定GDI+,

参考http://www.cnblogs.com/pzxbc/archive/2011/11/17/2252490.html中的做法,一步一步来的,

 1.在Stdafx.h头文件中添加如下代码

#include <GdiPlus.h>
#pragma comment(lib, "Gdiplus.lib")

  2.在CGdiplusTestApp类中,添加两个变量,用于GDI+初始化函数。

private:
Gdiplus::GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;

  3.在CGdiplusTestApp类中重载InitInstance(),具体就是选中CGdiplusTestApp类,然后看属性,里面就有重载了, 在CGdiplusTestApp::InitInstance()函数中添加如下代码

// Initialize GDI+.
Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

  4.重载CGdiplusTestApp的ExitInstance()函数,然后添加GDI+关闭函数。

Gdiplus::GdiplusShutdown(gdiplusToken);

(5)然后就是获取窗口的句柄了,如果是对话框,参考http://www.cctry.com/thread-7897-1-1.html中的做法:

pWnd=GetDlgItem(IDC_STATIC);
CDC* pDC;
pDC=pWnd->GetDC();

(6)下面是显示图片了,参考http://www.cnblogs.com/pzxbc/archive/2011/11/17/2252908.html

//载入图像
IplImage* srcImage = cvLoadImage("lena.jpg");
//创建Bitmap对象
Gdiplus::Bitmap bitmap(srcImage->width, srcImage->height, srcImage->widthStep,
PixelFormat24bppRGB, (BYTE*)srcImage->imageData);

Gdiplus::Graphics graphics(pDC->GetSafeHdc());
graphics.DrawImage(&bitmap, 0, 0);

这里使用的是IplImage类型的图片,试验表明Mat也是可以的,因为具体传参是传的数据部分,如果是Mat类型,则上面创建Bitmap对象的时候改为

Gdiplus::Bitmap bitmap(rgbImage.cols, rgbImage.rows, rgbImage.cols * rgbImage.channels(), //每一行的字节数
PixelFormat24bppRGB, (BYTE*)rgbImage.data);

其中rgbImage为已经有的Mat图像。顺便提一下,如果Mat是16位的,则最好用imread和imwrite来读取和保存。

抱歉!评论已关闭.