Pregunta

Aquí hay una pregunta rápida y fácil: usando GDI + de C ++, ¿cómo cargaría una imagen de datos de píxeles en la memoria?

¿Fue útil?

Solución

Probablemente no sea tan fácil como esperaba, pero puede crear un archivo BMP en la memoria con sus datos de píxeles:

Si es necesario, traduzca sus datos de píxeles a un formato compatible con BITMAP. Si ya tiene, digamos, datos de píxeles RGB de 24 bits, es probable que no se necesite traducción.

Cree (en memoria) una estructura BITMAPFILEHEADER, seguida de una estructura BITMAPINFO.

Ahora que tiene las cosas que necesita, debe ponerlas en un IStream para que GDI + pueda entenderlo. Probablemente la forma más fácil (aunque no la más eficiente) de hacer esto es:

  1. Llame a GlobalAlloc () con el tamaño del BITMAPFILEHEADER, el BITMAPINFO y sus datos de píxeles.
  2. En orden, copie el BITMAPFILEHEADER, BITMAPINFO y los datos de píxeles en la nueva memoria (llame a GlobalLock para obtener el nuevo puntero de memoria).
  3. Llame a CreateStreamOnHGlobal () para obtener un IStream para su BMP en memoria.

Ahora, llame al método GDI + Image :: FromStream () para cargar su imagen en GDI +.

¡Buena suerte!

Otros consejos

Hay un constructor de mapa de bits que toma un BITMAPINFO y un puntero a los datos de píxeles directamente, por ejemplo:

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

Está bien para una imagen RGB, si se trata de una imagen de paleta necesitaría asignar un BITMAPINFO con suficiente espacio para RGBQUADS, etc., etc.

Use SHCreateMemStream, toma un puntero a los datos y el tamaño de los datos.

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

¿Son los datos de píxeles en la memoria? formateado como un tipo de imagen en particular, es decir, mapa de bits, TIF, PNG, etc. Si es así, póngalo en una secuencia y use System.Drawing.Image.FromStream.

Este artículo describe cómo puede cargar una imagen GDI + desde un archivo de recursos (rc). Cargar la imagen desde la memoria debería ser similar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top