从内存中加载图像,GDI+

4
这是一个简单易懂的问题:如何在C++中使用GDI+从内存中的像素数据加载图像?请看下面的代码示例:

我相信这个帖子解决了你的问题:[https://dev59.com/SUXRa4cB1Zd3GeqPr3nv?rq=1][1] - kinsung
3个回答

8
使用SHCreateMemStream函数,它需要传入数据的指针和数据的大小。
IStream *pStream = SHCreateMemStream((BYTE *) InputBuffer, Size);
// Do what you want
pStream->Release();

5
也许并不像你希望的那样简单,但你可以使用像素数据在内存中创建BMP文件:
如果需要,将像素数据转换为BITMAP友好格式。如果你已经有了24位RGB像素数据,很可能不需要进行转换。
创建(内存中)一个BITMAPFILEHEADER结构,然后是BITMAPINFO结构。
现在你有了所需的东西,需要将它放入IStream中以便GDI+能够理解。可能最简单(但不是最高效)的方法是:
1. 使用BITMAPFILEHEADER、BITMAPINFO和像素数据的大小调用GlobalAlloc()。 2. 按顺序将BITMAPFILEHEADER、BITMAPINFO和像素数据复制到新内存中(使用GlobalLock获取新内存指针)。 3. 调用CreateStreamOnHGlobal()获取内存中BMP的IStream。
现在,调用GDI+ Image::FromStream()方法将图像加载到GDI+中。
祝你好运!

哎呀,你说得对;这比我想象的要复杂得多。希望我能让它正常工作。 - Martin
祝好运!BITMAPINFO 这个东西有点麻烦;在十六进制编辑器中查看一个24位BMP文件可以帮助你将自己的操作与真实情况进行比较。(Visual Studio可以做到这一点;打开文件,但使用“打开方式”选项,并选择“二进制编辑器”)。 - gdunbar

5
有一个位图构造函数,它直接使用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等等。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接