2010-08-18 101 views
3

如何使用CImage从BYTE *数组加载图像? 我的解决方法,直到现在只是简单地创建一个临时文件,但有时候这个操作非常昂贵... 有可能是图书馆,但我不想链接到其他图书馆,我所需要的只是获取图像大小并有效地显示到屏幕,是的CImage我需要为...使用ATL CImage从内存缓冲区加载图像

P-> pbData是一个BYTE *阵列和p> dwDataLen是保持数组大小

我的代码一个DWORD:

ATL::CAtlTemporaryFile TempFile; 
TempFile.Create(NULL, GENERIC_WRITE | GENERIC_READ); 
TempFile.Write(p->pbData, p->dwDataLen); 
TempFile.HandsOff(); 
ATL::CImage m_image; 
m_image.Load(TempFile.TempFileName()); 
    TempFile.Close(); 
int h = m_image.GetHeight(); 
int w = m_image.GetWidth(); 
// rest of code here 

    m_image.Destroy(); 
m_image.ReleaseGDIPlus();` 

回答

2

你可以用CImage :: Load(IStream *)函数来做到这一点。你可以从CreateStreamOnHGlobal()获取IStream,或者创建你自己的。

请注意,使用该文件实际上是最好的解决方案。 CImage创建一个内存映射文件来按需加载图像中的像素。当你从内存加载时,你需要加倍的内存,你会对分页文件施加压力。如果图像很大,你会遇到麻烦。

3
bool Create(BYTE* heap, DWORD heap_len, CImage& img) 
{ 
    bool ret = false; 
    HGLOBAL hGlobal = ::GlobalAlloc(GHND, heap_len); 
    LPBYTE lpByte = (LPBYTE)::GlobalLock(hGlobal); 
    CopyMemory(lpByte, heap, heap_len); 
    ::GlobalUnlock(hGlobal); 
    IStream* pStream = NULL; 
    if (SUCCEEDED(::CreateStreamOnHGlobal(hGlobal, FALSE, &pStream))) 
    { 
     img.Destroy(); 
     img.Load(pStream); 
     pStream->Release(); 
     ret = true; 
    } 
    GlobalFree(hGlobal); 
    return ret; 
} 
0
HRESULT Load(
    IStream* pStream 
) throw(); 

pStream 一个指针,指向包含名的图像文件加载的流。

所以上述解决方案不能工作,除非堆缓冲区包含文件路径..;)

+1

首先,它不是一个有效的答案。然后,您所指的方法是在内部调用['GdiPlus :: Bitmap'](https://msdn.microsoft.com/zh-cn/library/ms536319)构造函数,它确实需要流,而不仅仅是文件名。 – 2016-03-01 15:46:55

相关问题