在网上找了找,发现使用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来读取和保存。