从内存加载图像,GDI+

发布于 2024-08-09 16:39:37 字数 50 浏览 4 评论 0原文

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

Here's a quick and easy question: using GDI+ from C++, how would I load an image from pixel data in memory?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

自找没趣 2024-08-16 16:39:37

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

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

Use SHCreateMemStream, it takes a pointer to the data and the size of the data.

IStream *pStream = SHCreateMemStream((BYTE *) InputBuffer, Size);
// Do what you want
pStream->Release();
梦行七里 2024-08-16 16:39:37

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

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

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

现在您已经获得了所需的内容,您需要将其放入 IStream 中,以便 GDI+ 可以理解它。也许最简单(尽管不是最高效)的方法是:

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

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

祝你好运!

Probably not as easy as you were hoping, but you can make a BMP file in-memory with your pixel data:

If necessary, translate your pixel data into BITMAP-friendly format. If you already have, say, 24-bit RGB pixel data, it is likely that no translation is needed.

Create (in memory) a BITMAPFILEHEADER structure, followed by a BITMAPINFO structure.

Now you've got the stuff you need, you need to put it into an IStream so GDI+ can understand it. Probably the easiest (though not most performant) way to do this is to:

  1. Call GlobalAlloc() with the size of the BITMAPFILEHEADER, the BITMAPINFO, and your pixel data.
  2. In order, copy the BITMAPFILEHEADER, BITMAPINFO, and pixel data into the new memory (call GlobalLock to get the new memory pointer).
  3. Call CreateStreamOnHGlobal() to get an IStream for your in-memory BMP.

Now, call the GDI+ Image::FromStream() method to load your image into GDI+.

Good luck!

凉月流沐 2024-08-16 16:39:37

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

There's a bitmap constructor which takes a BITMAPINFO and a pointer to pixel data directly, for example:

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

That's OK for an RGB image, if it's a palette image you'd need to allocate a BITMAPINFO with enough space for the RGBQUADS etc etc.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文