从内存加载图像,GDI +

时间:2009-10-30 18:26:51

标签: c++ image graphics gdi+ load

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

5 个答案:

答案 0 :(得分:4)

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

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

创建(在内存中)BITMAPFILEHEADER结构,后跟BITMAPINFO结构。

现在你已经拥有了所需的东西,你需要把它放到IStream中,这样GDI +才能理解它。可能最简单(但不是最高效)的方法是:

  1. 使用BITMAPFILEHEADER,BITMAPINFO和像素数据的大小调用GlobalAlloc()。
  2. 按顺序,将BITMAPFILEHEADER,BITMAPINFO和像素数据复制到新内存中(调用GlobalLock以获取新的内存指针)。
  3. 调用CreateStreamOnHGlobal()以获取内存中BMP的IStream。
  4. 现在,调用GDI + Image :: FromStream()方法将图像加载到GDI +中。

    祝你好运!

答案 1 :(得分:4)

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

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

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

答案 2 :(得分:4)

使用SHCreateMemStream,它会获取指向数据和数据大小的指针。

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

答案 3 :(得分:0)

“内存中的像素数据”是否格式化为特定的图像类型,即位图,TIF,PNG等?如果是这样,请将其放入流中并使用System.Drawing.Image.FromStream。

答案 4 :(得分:0)

This article描述了如何从资源(rc)文件加载GDI +图像。从内存加载图像应该是类似的。