题
这是一个快速而简单的问题:使用 C++ 中的 GDI+,如何从内存中的像素数据加载图像?
解决方案
可能不像您希望的那么容易,但是您可以使用像素数据在内存中创建一个 BMP 文件:
如有必要,请将像素数据转换为位图友好的格式。如果您已经拥有 24 位 RGB 像素数据,则可能不需要转换。
创建(在内存中)一个 BITMAPFILEHEADER 结构,后跟一个 BITMAPINFO 结构。
现在您已经获得了所需的内容,您需要将其放入 IStream 中,以便 GDI+ 可以理解它。可能最简单(尽管不是最高效)的方法是:
- 使用 BITMAPFILEHEADER、BITMAPINFO 和像素数据的大小调用 GlobalAlloc()。
- 按顺序,将 BITMAPFILEHEADER、BITMAPINFO 和像素数据复制到新内存中(调用 GlobalLock 获取新内存指针)。
- 调用 CreateStreamOnHGlobal() 获取内存中 BMP 的 IStream。
现在,调用 GDI+ Image::FromStream() 方法将图像加载到 GDI+ 中。
祝你好运!
其他提示
有一个位图构造器,这需要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图像,如果它是一个调色板图像你需要有足够的空间分配BITMAPINFO为RGBQUADS等等等等。
使用SHCreateMemStream,它需要一个指针数据和所述数据的大小。
IStream *pStream = SHCreateMemStream((BYTE *) InputBuffer, Size);
// Do what you want
pStream->Release();
被格式化为一个特定图像类型的“在存储器中的象素数据”,即,位图,TIF,PNG等?如果是的话,把它转化为流,并使用System.Drawing.Image.FromStream。
此文章介绍了如何可以加载从GDI +图像资源(RC)文件。从内存中加载图像应该是相似的。
不隶属于 StackOverflow