利用GDI+ 从内存读取jpeg,画到窗口。

MFC使用GDI+编程设置


VC2005“项目/*属性”菜单项,打开项目的属性页窗口,先选“所有配置”,再选“配置属性/链接器/输入”项,在右边上部的“附加依赖项”栏的右边,键入GdiPlus.lib 后按“应用”钮,最后按“确定”钮关闭对话框。

在需要用到GDI+的文件头加上下面两句
#include <gdiplus.h>
using namespace Gdiplus;


在应用程序类应用程序类(CGDIPlusDemoApp) 头文件中声明一个成员变量:
ULONG_PTR m_gdiplusToken;    // ULONG PTR 为int64 类型

并在该类的初始化函数CGDIPlusDemoApp::InitInstance() 中加入以下代码来对GDI+进行初始化:

GdiplusStartupInput gdiplusStartupInput;
GdiplusStartup(&m_gdiplusToken, &gdiplusStartupInput, NULL);

注意:这两个语句必须加在应用程序类的InitInstance函数中的
CWinApp:: InitInstance ();
语句之前,不然以后会造成视图窗口不能自动重画、程序中不能使用字体等等一系列问题。


还要在CGDIPlusDemoApp::ExitInstance() 函数(重写)中加入以下代码来关闭GDI +:
GdiplusShutdown(m_gdiplusToken);

上面是所需步骤..


然后利用GDI+中的IPicture对象,IStream对象实现画图


            HDC hdc = ::GetDC(m_hWnd);//获得窗口DC
             IPicture* pPic;
                IStream* pStm;		

            memcpy(buffer+pos,buffer_last+10,LastDataPacket);//得到保存jpeg的buff


		HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE,lSzie);
		LPVOID pvData = NULL;
		pvData = GlobalLock(hGlobal);
		memcpy(pvData,buffer,lSzie);
		GlobalUnlock(hGlobal);
		CreateStreamOnHGlobal(hGlobal,TRUE,&pStm);//赋值给Istream对象
		ULARGE_INTEGER  pSeek;
		LARGE_INTEGER  dlibMove  ={0};
		pStm->Seek(dlibMove,STREAM_SEEK_SET,&pSeek);
		OleLoadPicture(pStm,lSzie,TRUE,IID_IPicture,(LPVOID*)&pPic);//赋值给Ipicture对象


		OLE_XSIZE_HIMETRIC hmWidth; 
		OLE_YSIZE_HIMETRIC hmHeight; 
		pPic->get_Width(&hmWidth);
		pPic->get_Height(&hmHeight);
		pPic->Render(hdc,0,0,320,200,0,hmHeight,hmWidth,-hmHeight,NULL);//画图到对应DC上

		GlobalFree(hGlobal);


		free(buffer_last);
		free(buffer);
	}


	free(recvbuf);
	pPic->Release();
	pStm->Release();





你可能感兴趣的:(利用GDI+ 从内存读取jpeg,画到窗口。)