Загрузка изображения из буфера памяти с помощью ATL CImage - PullRequest
3 голосов
/ 18 августа 2010

Как я могу загрузить изображение из массива BYTE * с помощью CImage? Мой обходной путь до сих пор состоит в том, чтобы просто создать временный файл, но иногда эта операция очень дорогая ... Вероятно, есть библиотеки для этого, но я не хочу ссылаться на другие библиотеки, все, что мне нужно, это получить размер изображения и эффективно отобразить его на экране, и 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();` 

Ответы [ 3 ]

3 голосов
/ 26 декабря 2012
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;
}
2 голосов
/ 18 августа 2010

Вы можете сделать это с помощью функции CImage :: Load (IStream *).Вы можете получить IStream из CreateStreamOnHGlobal () или создать свой собственный.

Остерегайтесь того, что использование файла - действительно лучшее решение.CImage создает отображенный в память файл для загрузки пикселей с изображения.Когда вы загружаете из памяти, вам нужно удвоить память, и вы окажете давление на файл подкачки.И у вас возникнут проблемы, если изображение будет большим.

0 голосов
/ 01 марта 2016
HRESULT Load(
   IStream* pStream
) throw();

pStream Указатель на поток, содержащий имя файла изображения для загрузки.

Таким образом, приведенные выше решения не могут работать, если буфер кучи не состоит из пути к файлу ..;)

...