Domanda

Ecco una domanda semplice e veloce: usando GDI + da C ++, come dovrei caricare un'immagine dai dati pixel in memoria?

È stato utile?

Soluzione

Probabilmente non è facile come speravi, ma puoi creare un file BMP in memoria con i tuoi dati pixel:

Se necessario, traduci i tuoi dati pixel in un formato compatibile con BITMAP. Se disponi già, diciamo, di dati pixel RGB a 24 bit, è probabile che non sia necessaria alcuna traduzione.

Crea (in memoria) una struttura BITMAPFILEHEADER, seguita da una struttura BITMAPINFO.

Ora hai le cose di cui hai bisogno, devi metterle in un IStream in modo che GDI + possa capirlo. Probabilmente il modo più semplice (anche se non più performante) per farlo è:

  1. Chiama GlobalAlloc () con le dimensioni di BITMAPFILEHEADER, BITMAPINFO e i tuoi dati pixel.
  2. In ordine, copia i dati BITMAPFILEHEADER, BITMAPINFO e pixel nella nuova memoria (chiama GlobalLock per ottenere il nuovo puntatore di memoria).
  3. Chiama CreateStreamOnHGlobal () per ottenere un IStream per il tuo BMP in memoria.

Ora chiama il metodo GDI + Image :: FromStream () per caricare l'immagine in GDI +.

Buona fortuna!

Altri suggerimenti

Esiste un costruttore di bitmap che accetta direttamente un BITMAPINFO e un puntatore ai dati pixel, ad esempio:

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

Va ??bene per un'immagine RGB, se si tratta di un'immagine tavolozza è necessario allocare un BITMAPINFO con spazio sufficiente per RGBQUADS ecc. ecc.

Usa SHCreateMemStream, prende un puntatore ai dati e alle dimensioni dei dati.

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

Sono i dati "pixel in memoria"? formattato come un particolare tipo di immagine, ovvero bitmap, TIF, PNG, ecc. In tal caso, inseriscilo in uno stream e usa System.Drawing.Image.FromStream.

Questo articolo descrive come caricare un'immagine GDI + da un file di risorse (rc). Il caricamento dell'immagine dalla memoria dovrebbe essere simile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top