2009-03-12 5 views
2

In meinem Projekt nach langem Prozess, bekam ich ein zweidimensionales Byte-Array von der IR-Kamera.Wie erstellt man ein Bild aus einem 2-dimensionalen Byte-Array?

Der Byte-Array hält Bild in ihm ...

, wie das Byte-Array Bild in C# konvertieren ..

Ich weiß, dass durch

MemoryStream ms = new MemoryStream(byteArray); 
System.drawing.Image im = Image.FromStream(ms); 

Wir passieren können 1 dimensional Array und konvertieren Sie es in Bild ..

Wenn ich 2-dimensionale Array als eindimensionales Array übergeben .. zeigt es Fehler ..

Wie es zu korrigieren .. ???? oder sonst wie 2D-Byte-Array zu Bild konvertieren ... ???

Vielen Dank !!

Antwort

2

Wenn Sie das Byte-Arrays wollen Inorder verarbeitet werden, können Sie die folgenden

byte[][] doubleArray = GetMyByteArray(); 
byte[] singleArray = doubleArray.SelectMany(x => x).ToArray(); 
MemoryStream ms = new MemoryStream(singleArray); 
System.drawing.Image im = Image.FromStream(ms); 

Die Select Verfahren im Wesentlichen die Arrays von Arrays nehmen und die Elemente um. Beginnend mit dem ersten Element des ersten Arrays, beende dieses Array und gehe dann zum nächsten. Dies wird fortgesetzt, bis alle Elemente verarbeitet sind.

+0

Nimmt dies nicht an, dass der Strom in irgendeinem erkannten Bildformat vorliegt, z. PNG, JPG, Gif? Wenn die IR-Kamera ein 2D-Byte-Array gibt, vermute ich *, dass es Rohdaten sind - weshalb ich meine Lösung vorgeschlagen habe. Ich sage nicht, dass * das nicht funktionieren wird, aber es hängt davon ab, welches Format die Kamera bietet. –

+0

@ Jon, stimme voll und ganz zu. Dies hängt sehr davon ab, was die Kamera tatsächlich zurückgibt. – JaredPar

+0

Wenn es ein mehrdimensionales Array ist, können Sie es einfach umwandeln, da Sie den Typ kennen. array.Cast (). ToArray() – Samuel

4

Wenn es ein rechteckiges Feld (das heißt ein byte[,]) anstelle eines gezackten Array (byte[][]), dann Sie kann der Lage sein, es zu tun recht einfach mit etwas unsicheren Code.

Werfen Sie einen Blick auf meine parallel Mandelbrot set generation code - nur das untere Bit ist interessant, wo es eine Bitmap aus einer Palette und einen Datenblock konstruiert:

byte[] data = query.ToArray(); 

unsafe 
{ 
    fixed (byte* ptr = data) 
    { 
     IntPtr scan0 = new IntPtr(ptr); 
     Bitmap bitmap = new Bitmap(ImageWidth, ImageHeight, // Image size 
            ImageWidth, // Scan size 
            PixelFormat.Format8bppIndexed, scan0); 
     ColorPalette palette = bitmap.Palette; 
     palette.Entries[0] = Color.Black; 
     for (int i=1; i < 256; i++) 
     { 
      palette.Entries[i] = Color.FromArgb((i*7)%256, (i*7)%256, 255); 
     } 
     bitmap.Palette = palette; 
     // Stuff 
    } 
} 

Ich weiß nicht, ob Sie das Array unpin können nach dem Erstellen der Bitmap - wenn ich dies für den Produktionscode verwenden würde, würde ich das genauer betrachten.

+0

Wurde Jon Skeet besiegt oder gibt es ein Problem mit JaredPars Antwort (außer, dass LINQ benötigt wird, wenn der Fragesteller es nicht hat)? – Samuel

+0

Ich bin nicht unbedingt davon überzeugt, dass Jareds Lösung funktionieren wird - ich werde es gleich erklären, in einem Kommentar. Es hängt auch davon ab, ob das OP ein Byte [] [] oder ein Byte [,] hat. –

+0

Ich sehe jetzt, http://StackOverflow.com/Questions/275073/Why-does-c-Multidimensional-arrays-not-Implement-ienumerable, wenn jemand neugierig ist, warum Byte [,] wird nicht für JaredPar Antwort funktionieren. – Samuel

Verwandte Themen