我正在使用MFC应用程序中的一些图片,我意识到CImage类(来自MFC)有两种类型的保存,一个文件和一个IStream接口。我正在尝试使用该IStream接口保存到内存,使用CImage类的约定功能,而无需另外的库(例如bmp到jpg转换)。我不想保存文件,只需使用内存缓冲区。 CImage对象已加载图片文件。
但是我无法使用这个IStream接口,因为我无法从该类创建一个对象,也没有意识到如何创建缓冲区以用于该Save(IStream * pStream ...)功能。
任何例子都会非常有用。
谢谢, 维托尔
答案 0 :(得分:0)
首先,您应该将您的图片添加到资源ID中,并执行以下操作:
BOOL ImageFromIDResource(UINT nID, LPCTSTR sTR, CImage * & pImg)
{
HINSTANCE hInst = AfxGetResourceHandle();
HRSRC hRsrc = ::FindResource(hInst, MAKEINTRESOURCE(nID), sTR); // type
if (!hRsrc)
return FALSE;
// load resource into memory
DWORD len = SizeofResource(hInst, hRsrc);
BYTE* lpRsrc = (BYTE*)LoadResource(hInst, hRsrc);
if (!lpRsrc)
return FALSE;
// Allocate global memory on which to create stream
HGLOBAL m_hMem = GlobalAlloc(GMEM_FIXED, len);
BYTE* pmem = (BYTE*)GlobalLock(m_hMem);
memcpy(pmem, lpRsrc, len);
IStream* pstm = NULL;
CreateStreamOnHGlobal(m_hMem, FALSE, &pstm);
// load from stream
//pImg = Gdiplus::Image::FromStream(pstm);
pImg = new CImage();
pImg->Load(pstm);
DWORD err = GetLastError();
// free/release stuff
GlobalUnlock(m_hMem);
pstm->Release();
FreeResource(lpRsrc);
return TRUE;
}