Frage

Hier ist eine schnelle und einfache Frage: GDI + von C ++, wie würde ich ein Bild lade von Pixeldaten im Speicher

War es hilfreich?

Lösung

Wahrscheinlich nicht so einfach wie man gehofft, aber Sie können eine BMP-Datei im Speicher mit den Pixeldaten machen:

Falls erforderlich, übersetzt Ihre Pixeldaten in BITMAP freundlichen Format. Wenn Sie bereits haben, sagen wir, 24-Bit-RGB-Pixeldaten, ist es wahrscheinlich, dass keine Übersetzung erforderlich ist.

Erstellen (im Speicher) eine BITMAPFILEHEADER Struktur, gefolgt von einer BITMAP Struktur.

Jetzt haben Sie das Zeug, was Sie brauchen, müssen Sie es in ein IStream setzen, so GDI + kann es verstehen. Die wahrscheinlich einfachste (wenn auch nicht die meisten performant) Weg, dies zu tun ist, um:

  1. Rufen Sie GlobalAlloc () mit der Größe des BITMAPFILEHEADER, die BITMAP und Ihre Pixeldaten.
  2. Um, kopieren Sie die BITMAPFILEHEADER, BITMAP und Pixeldaten in den neuen Speicher (GlobalLock rufen Sie den neuen Speicherzeiger zu erhalten).
  3. Rufen Sie CreateStreamOnHGlobal () einen IStream für Ihre in-memory BMP zu erhalten.

Nun, rufen Sie die GDI + Bild :: FromStream (Methode) Ihr Bild in GDI + zu laden.

Viel Glück!

Andere Tipps

Es gibt einen Bitmap-Konstruktor, der direkt eine BITMAP und einen Zeiger auf Pixeldaten nimmt, zum Beispiel:

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

Das ist in Ordnung für ein RGB-Bild, wenn es sich um eine Palette Bild ist müssen Sie würde eine BITMAP mit genügend Platz für die RGBQUADS etc etc zuzuweisen.

Mit SHCreateMemStream, es nimmt einen Zeiger auf die Daten und die Größe der Daten.

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

Ist die „Pixeldaten im Speicher“ formatiert als eine bestimmte Bildtyp, das heißt, Bitmap, TIF, PNG, usw.? Wenn ja, es in einen Strom bekommen und System.Drawing.Image.FromStream verwenden.

diesem Artikel beschreibt, wie Sie eine GDI laden + Bild von eine Ressource (RC) Datei. das Bild aus dem Speicher Laden sollte ähnlich sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top