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

标签 c++ windows gdi+ gdi

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();

关于c++ - 如何使用 GDI+ 库解码内存中的 jpeg?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39312201/

相关文章:

c# - 在 Windows Metro Apps C# 中合并两个 sqlite 数据库

asp.net - System.Drawing错误: Can or Cannot it be used in an ASP.网络应用程序

c++ - GDI+:灰度 PNG 加载为 PixelFormat32bppARGB

c# - ASP.Net上的jpegoptim- “error opening temporary file”

c++ - 有什么方法可以从 Visual Studio 2017 中的 Catch C++ 测试中获取代码覆盖率指标?

c++ - "undefined reference to ` FT_Load_Glyph '"和其他使用 CMAKE 的 SDL2_ttf 函数

c++ - 使与 IPv6 或 IPv4 的连接变得容易?

.net - 从图元文件到 JPEG/GIF 的 GDI+ 图像转换结果为黑色背景

python - 我无法使用 ctypes 访问 C++ 类属性

.net - 将 char* 传递给 .Net 的最佳方式