首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用CImage.Save (InMemory)

使用CImage.Save (InMemory)
EN

Stack Overflow用户
提问于 2015-07-29 02:30:10
回答 1查看 1.2K关注 0票数 0

我正在处理一个MFC应用程序中的一些图片,我意识到CImage类(来自MFC)有两种保存类型:保存到文件和保存到IStream接口。我正在尝试使用那个IStream接口来保存到内存,使用CImage类的约定特性,而不使用其他库(例如,bmp到jpg的转换)。我不想保存文件,只想使用内存缓冲区。CImage对象已与图片文件一起加载。

但我不能使用这个IStream接口,因为我不能从那个类创建对象,也不知道如何创建缓冲区以用于保存(IStream* pStream...)功能。

任何一个例子都会很有帮助。

谢谢,维托

EN

回答 1

Stack Overflow用户

发布于 2015-07-29 11:42:41

首先,你应该把你的图片添加到一个资源id中,然后这样做:

代码语言:javascript
复制
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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31684400

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档