Wie die Anzeige der raw-Daten als Bild (Visual Studio c#)
Ich erhalten einige raw-Daten, gespeichert in einem byte-array, wobei jeweils 2 Byte ein pixel mit dem Wert (16 bit/px). So starten Sie mit, das array enthält 100x100*2 bytes (genug für ein 100x100 pixel großes Bild). Ich möchte die Anzeige dieser Daten in das Formular-Fenster. Schließlich möchte ich das Bild aktualisieren mit den neuen Daten, sodass es aussieht wie ein video-stream. Keine Feste frame-rate erforderlich ist. Wie kann das getan werden? Alle code-Beispiele in C#?
EDIT:
Nach einigen Anregungen und Kritiken von zig ähnliche Fragen, die ich noch nicht bekommen kann dies geht. Hier ist die Allgemeine Vorstellung von dem, was ich versuche zu tun, aber das Bild wird nicht angezeigt in der Bild-box auf dem Formular. Was ist spezifisch falsch mit meiner Umsetzung und wie man es beheben?
//array of data I collected
byte[] dataArray = new byte[100 * 100 * 2];
//create a pointer to the data
IntPtr hglobal = Marshal.AllocHGlobal(100 * 100 * 2);
//copy my array to global
Marshal.Copy(dataArray, 0, hglobal, dataArray.Length);
//create a bitmap: 100x100 pixels, 2bytes/pixel, 16bitgrayscale
Bitmap newBitmap = new Bitmap(100, 100, 2 * 100, PixelFormat.Format16bppGrayScale, hglobal);
//display bitmap
pictureBox1.Image = newBitmap;
//free the memory
Marshal.FreeHGlobal(hglobal);
- möchten Sie vielleicht werfen Sie einen Blick auf stackoverflow.com/questions/16622408/... und stackoverflow.com/questions/16130248/pixel-data-to-image
- Können Sie iterieren über array und verwenden Sie
Bitmap.SetPixel()
? - wie @Eldarien, sagte, müssen Sie
Format48bppRgb
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das Hauptproblem ist, dass PixelFormat.Format16bppGrayScale wird nicht unterstützt (zumindest auf meinem Win 8.1 x64 system). So haben Sie zu konvertieren image to rgb vor der Anzeige:
Idee stammt von dieser thread.
Verwenden Sie diese
Bitmap
Konstruktor:Übergeben Sie es der Form der bitmap, die Schrittlänge (wie viele bytes pro Zeile, einschließlich der Polsterung), pixel-format und die pixel-Daten als
void *
Zeiger. Können Sie erstellen, die letztere mitMarshal.AllocHGlobal
und füllen Sie es in als mit dem normalen Zeiger-Operationen. Vergessen Sie nicht, diesen Speicher freizugeben, nach dem erstellen der bitmap.Bearbeiten, um Konto für die aktualisierte Frage:
Rufen Sie einfach
IntPtr.ToPointer()
um wieder ein Zeiger ist. Wenn Sie vertraut mit C, der rest sollte Kuchen:Allerdings können Sie mit der Marshaller zum kopieren von Speicher für Sie von verwalteten an nicht verwaltete (sich die Hände schmutzig, ist in der Regel verpönt in C#):
Einen
Bitmap
ist einImage
(wie in, es stammt von ihm), aber du bist mitGraphics.DrawImage()
falsch. Wie der Fehler sagt, es ist nicht eine statische Methode, die Sie es ziehen, um einen spezifischen graphischen Kontext. Nun, was das Grafik-Kontext ist, das ist bis zu Ihnen:WM_PAINT
verwenden Sie diePaint
Ereignis-es bietet Ihnen mit einem speziellenGraphics
Objekt mit clipping und alles, wie angewiesen, durch das windowing-system.Graphics.FromImage()
auf die Quell-bitmap zeichnen Sie die bitmap über es.Kann (und sollte) löschen Sie den virtuellen Speicher-Puffer, sobald Sie das Ergebnis wieder aus der
Bitmap
Konstruktor. Nicht-Leck-Speicher, verwenden Sie einetry..finally
konstruieren.Graphics
Rahmen aus einem Bild oder aus dem frameworkPaint
Veranstaltung und zeichnen Sie Ihr Bild mitGraphics.DrawImage
.