Загрузка изображения из памяти, GDI + - PullRequest
4 голосов
/ 30 октября 2009

Вот быстрый и простой вопрос: используя GDI + из C ++, как мне загрузить изображение из данных пикселей в памяти?

Ответы [ 5 ]

4 голосов
/ 24 октября 2015

Используйте SHCreateMemStream, он принимает указатель на данные и размер данных.

IStream *pStream = SHCreateMemStream((BYTE *) InputBuffer, Size);
// Do what you want
pStream->Release();
4 голосов
/ 15 февраля 2011

Есть конструктор растрового изображения, который принимает 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 и т. Д.

4 голосов
/ 31 октября 2009

Возможно, это не так просто, как вы надеялись, но вы можете сделать BMP-файл в памяти с вашими данными пикселей:

При необходимости переведите ваши данные пикселей в BITMAP-дружественный формат. Если у вас уже есть, скажем, данные 24-битного пикселя RGB, скорее всего, перевод не требуется.

Создать (в памяти) структуру BITMAPFILEHEADER, за которой следует структура BITMAPINFO.

Теперь у вас есть все, что вам нужно, вам нужно поместить его в IStream, чтобы GDI + мог это понять. Вероятно, самый простой (хотя и не самый производительный) способ сделать это:

  1. Вызовите GlobalAlloc () с размером BITMAPFILEHEADER, BITMAPINFO и данными вашего пикселя.
  2. Чтобы скопировать данные BITMAPFILEHEADER, BITMAPINFO и пикселей в новую память (вызовите GlobalLock, чтобы получить новый указатель памяти).
  3. Вызовите CreateStreamOnHGlobal (), чтобы получить IStream для вашего BMP в памяти.

Теперь вызовите метод GDI + Image :: FromStream () для загрузки вашего изображения в GDI +.

Удачи!

0 голосов
/ 30 октября 2009

В этой статье описывается, как можно загрузить изображение GDI + из файла ресурсов (rc). Загрузка изображения из памяти должна быть похожей.

0 голосов
/ 30 октября 2009

Форматируются ли данные пикселей в памяти как определенный тип изображения, то есть растровое изображение, TIF, PNG и т. Д.? Если это так, поместите его в поток и используйте System.Drawing.Image.FromStream.

...