如何使用GDI+库解码内存中的jpeg
How to use GDI+ library to decode a jpeg in memory?
GDI+提供了一个Image类,您可以使用这个类读取一种格式的图像文件,然后将该文件保存为另一种格式。但是如果我只想解码一个jpeg文件(已经加载到内存中),我该怎么做呢?
您可以使用SHCreateMemStream
和Gdiplus::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++中的稳定内存中
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- Win32编译器选项和内存分配
- 当vector是tje全局变量时,c++中vector的内存管理
- 带内存和隔离功能的SQLite
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 迭代时从向量和内存中删除对象
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 为什么示例代码访问IUnknown中已删除的内存
- 如何在C++类内存结构中创建"spacer"?
- 从构造函数抛出异常时如何克服内存泄漏
- 如何使用LEADTOOLS 19将图像效果应用于内存缓冲区中的JPEG
- 在内存中将屏幕截图位图转换为jpeg
- 将Mat压缩到Jpeg中,并将结果保存到内存中
- 如何在程序的内存中搜索图像/png/jpeg/任何其他类型并显示它
- 使用boost::gil从内存中读取JPEG图像
- 使用std::string在内存中移动jpeg是否安全?
- 如何使用GDI+库解码内存中的jpeg