从内存加载图像,GDI+

Mar*_*tin 4 c++ graphics gdi+ load image

这是一个快速而简单的问题:使用 C++ 中的 GDI+,我将如何从内存中的像素数据加载图像?

小智 7

使用 SHCreateMemStream,它需要一个指向数据的指针和数据的大小。

IStream *pStream = SHCreateMemStream((BYTE *) InputBuffer, Size);
// Do what you want
pStream->Release();
Run Code Online (Sandbox Code Playgroud)


gdu*_*bar 5

可能不像您希望的那么容易,但是您可以使用像素数据在内存中创建一个 BMP 文件:

如有必要,将您的像素数据转换为位图友好的格式。如果您已经拥有 24 位 RGB 像素数据,则很可能不需要转换。

创建(在内存中)一个 BITMAPFILEHEADER 结构,后跟一个 BITMAPIINFO 结构。

现在您已经获得了所需的东西,您需要将其放入 IStream 以便 GDI+ 能够理解它。可能最简单(虽然不是最高效)的方法是:

  1. 使用 BITMAPFILEHEADER 的大小、BITMAPINFO 和您的像素数据调用 GlobalAlloc()。
  2. 依次将 BITMAPFILEHEADER、BITMAPIINFO 和像素数据复制到新内存中(调用 GlobalLock 获取新内存指针)。
  3. 调用 CreateStreamOnHGlobal() 以获取内存中 BMP 的 IStream。

现在,调用 GDI+ Image::FromStream() 方法将您的图像加载到 GDI+ 中。

祝你好运!


Pet*_*ull 5

有一个位图构造函数,它直接接受一个 BITMPINFO 和一个指向像素数据的指针,例如:

BITMAPINFO bmi;
memset(&bmi, 0, sizeof(bmi));
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biWidth = 32;
bmi.bmiHeader.biHeight = 32;
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biCompression = BI_RGB;
bmi.bmiHeader.biBitCount = 24;
char data[32 * 32 * 3];
// Write pixels to 'data' however you want...
Gdiplus::Bitmap* myImage = new Gdiplus::Bitmap(&bmi, data);
Run Code Online (Sandbox Code Playgroud)

对于 RGB 图像来说没问题,如果它是调色板图像,您需要为 RGBQUADS 等分配一个具有足够空间的 BITMAPIINFO。