首先,本文適合那些由網絡傳輸得到的JPEG、GIF圖像顯示,因為這些圖像都是以“BYTE數組”這種形式傳輸。
直接給出函數,不說廢話了!
//-----------以下兩句放在頭文件定義的地方
#include "Gdiplus.h"
using namespace Gdiplus;
//-----------以下代碼修改一下變量為自己的變量,即刻使用
void Readfrombuffer(char* video_data,int size)
{
GdiplusStartupInput m_gdiPlusInPut;
ULONG_PTR m_gdiPlusToken;
GdiplusStartup( &m_gdiPlusToken, &m_gdiPlusInPut, NULL ); //初始化GDI+
IPicture *pPic;
IStream *pStm ;
//分配全局存儲空間
HGLOBAL hGlobal=GlobalAlloc(GMEM_MOVEABLE,size);
LPVOID pvData=NULL ;
//鎖定分配內存塊
pvData=GlobalLock(hGlobal);
//復制數據包video_data到pvData
memcpy(pvData,video_data,size);
GlobalUnlock(hGlobal);
CreateStreamOnHGlobal(hGlobal,TRUE,&pStm);
ULARGE_INTEGER pSeek;
LARGE_INTEGER dlibMove ={ 0 } ;
pStm->Seek(dlibMove,STREAM_SEEK_SET ,&pSeek);
Sleep(15);
//裝入圖形文件
if(FAILED(OleLoadPicture(pStm,size,TRUE,IID_IPicture,(LPVOID*)&pPic)))
{//附:如果video_data這個數組包含的圖像有錯,則OleLoadPicture 容易產生讀寫內存錯誤
pPic->Release();
pStm->Release();
return ;
}
Image img(pStm,0);
Graphics mGraphics(GetDC(hwnd));
mGraphics.DrawImage(&img, 0, 0, Video_Width, Video_Height);
img.~Image();//會出錯
mGraphics.~Graphics();
pPic->Release();
pStm->Release();
GdiplusShutdown(m_gdiPlusToken); //銷毀GDI+
}