如何使用GDI+库解码内存中的jpeg

How to use GDI+ library to decode a jpeg in memory?

本文关键字:jpeg 内存 解码 何使用 GDI+      更新时间:2023-10-16

GDI+提供了一个Image类,您可以使用这个类读取一种格式的图像文件,然后将该文件保存为另一种格式。但是如果我只想解码一个jpeg文件(已经加载到内存中),我该怎么做呢?

您可以使用SHCreateMemStreamGdiplus::Image::FromStream

#include <Window.h>
#include <Gdiplus.h>
#include <Shlwapi.h>
#include <atlbase.h>
...
CComPtr<IStream> stream;
stream.Attach(SHCreateMemStream(buf, bufsize));
Gdiplus::Image *image = Gdiplus::Image::FromStream(stream);

其中buf包含jpeg数据(或任何其他兼容的图像格式),bufsize是该数据的长度。

SHCreateMemStream需要"Shlwapi.lib"

的例子:

void foo(HDC hdc)
{
    //Read jpeg from input file in to buf:
    HANDLE hfile = CreateFile(L"test.jpg", 
        GENERIC_READ, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    if (!hfile) return;
    DWORD bufsize = GetFileSize(hfile, NULL);
    BYTE *buf = new BYTE[bufsize];
    DWORD temp;
    ReadFile(hfile, buf, bufsize, &temp, 0);
    //convert buf to IStream    
    CComPtr<IStream> stream;
    stream.Attach(SHCreateMemStream(buf, bufsize));
    //Read from IStream    
    Gdiplus::Bitmap *image = Gdiplus::Bitmap::FromStream(stream);
    if (image)
    {
        Gdiplus::Graphics g(hdc);
        g.DrawImage(image, 0, 0);
        delete image;
    }
    delete[]buf;
    CloseHandle(hfile);
}

编辑:在注释中提到的更容易的方法:

IStream* stream = SHCreateMemStream(buf, bufsize);
Gdiplus::Image *image = Gdiplus::Image::FromStream(stream);
...
stream->Release();