如何使用CImage从BYTE *数组加载图像?
到目前为止,我的解决方法是仅创建一个临时文件,但是有时此操作非常昂贵...
可能有一些库,但是我不想链接到其他库,我所需要的只是获得图像大小并有效地显示在屏幕上,而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();`

最佳答案

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;
}

关于c++ - 使用ATL CImage从内存缓冲区加载图像,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3514275/

10-09 05:57