2009-03-24 9 views
8

Ich bin Bilder von einem Smart Kamera-Imager erfassen und erhalten die Byte-Array von der Kamera durch Socket-Programmierung (.NET-Anwendung ist der Client, Kamera ist der Server).Image.FromStream() -Methode gibt ungültige Argument Ausnahme

Das Problem ist, dass ich System.InvalidArgument Ausnahme zur Laufzeit bekomme.

Ich habe dieses Problem in vielen Foren gesucht und versuchte die Vorschläge von vielen Experten, aber nichts half.

Ich denke nicht, es gibt ein Problem mit dem Byte-Array als solche, denn wenn ich das gleiche Byte-Array in meine VC++ MFC-Client-Anwendung feed, bekomme ich das Bild. In C# .NET funktioniert das nicht.

Kann mir jemand helfen?

PS:

Andere Methoden habe ich versucht, die gleiche Aufgabe zu erfüllen sind:

1.

private Image byteArrayToImage(byte[] byteArray) 
{ 
    if(byteArray != null) 
    { 
     MemoryStream ms = new MemoryStream(); 
     ms.Write(byteArray, 0, byteArray.Length); 
     ms.Position = 0; 
     return Image.FromStream(ms, false, false); 
    } 
    return null; 
} 

2.

private Image byteArrayToImage(byte[] byteArray) 
{ 
    if(byteArray != null) 
    { 
     TypeConverter tc = TypeDescriptor.GetConverter(typeof(Bitmap)); 
     Bitmap b = (Bitmap)tc.ConvertFrom(byteArray); 
     return b; 
    } 
    return null; 
} 

Keine der oben genannten Methoden hat funktioniert. Freundlich helfen.

+0

Was passiert, wenn man einfach die bytearray in eine Datei auf die Festplatte schreiben? Ist die Datei mit etwas wie Photoshop geöffnet? – Chris

+1

hast du es gelöst? Ich habe das gleiche Problem – robob

Antwort

1

System.InvalidArgument bedeutet, dass der Stream kein gültiges Bildformat hat, d. H. Ein Bildtyp, der nicht unterstützt wird.

+1

Hallo, Danke für die Antwort. Aber wie funktioniert das gleiche Byte-Array in meiner VC++ MFC-Anwendung? Gibt es auch eine Möglichkeit, die Gültigkeit meiner Byte-Array-Bilddaten zu überprüfen? Arvind K –

0

Ich hatte das gleiche Problem in der Vergangenheit und es wurde durch ein Leck innerhalb der Windows-GDI-Bibliotheken verursacht, das ist, was "Bitmap" verwendet. Wenn dies die ganze Zeit für Sie passiert, dann ist es wahrscheinlich nicht verwandt.

+0

Hallo Chris, Danke für die Antwort. Es passiert mir jedes Mal, wenn ich den Code ausführen. –

3

Ich vermute, dass etwas falsch läuft, wenn die Datei vom Server empfangen wird. Vielleicht erhalten Sie nur einen Teil der Datei, bevor Sie versuchen, sie in eine Image zu konvertieren? Sind Sie sicher ist es das exakt gleiche Byte-Array Sie füttern die C++ - Anwendung?

Versuchen Sie, den Stream in eine Datei zu speichern und zu sehen, was Sie erhalten. Sie könnten dort einige Hinweise entdecken.

Sie können auch einen Haltepunkt hinzufügen und manuell einige der Bytes im Byte-Array mit dem vergleichen, was sie sein sollen (wenn Sie das wissen).


Bearbeiten: Es sieht so aus, als ob nichts mit dem Empfang der Daten falsch ist. Das Problem ist, dass es im Rohformat ist (kein Format, das Image.FromStream versteht). Die Bitmap(Int32, Int32, Int32, PixelFormat, IntPtr) constructor kann hier von Nutzen sein. Oder Sie können die leere Bitmap erstellen und sie manuell aus den Rohdaten erstellen.

+0

Hallo, Ich habe versucht, das Bild in eine JPG-, BMP-Datei speichern, aber ich bekomme das Bild in der Datei nicht. Was ist rätselhaft ist, dass es mit der gleichen Byte-Array ist, dass ich Bild in meiner VC++ MFC-Anwendung anzeigen kann. –

+0

Deshalb bin ich nicht so sicher, dass es das gleiche Byte-Array ist. Sind die Dateigrößen gleich? –

+0

Die VC++ - Anwendung zeigt Live-Bilder von der Kamera an und deshalb habe ich das Byte-Array in eine TXT-Datei geschrieben. In ähnlicher Weise schrieb ich aus meiner .NET-Anwendung das Byte-Array in eine Datei und verglich dann diese beiden Dateien. Ich finde, dass alle Werte gefüllt sind und sie mehr oder weniger gleich sind. –

3

Ich habe dieses Problem habe, als dies zu tun:

MemoryStream stream = new MemoryStream(); 
screenshot.Save(stream, ImageFormat.Png); 
byte[] bytes = new byte[stream.Length]; 
stream.Save(bytes, 0, steam.Length); 

Mit den letzten 2 Zeilen das Problem zu sein.Ich kann es festgelegt, indem Sie diese:

MemoryStream stream = new MemoryStream(); 
screenshot.Save(stream, ImageFormat.Png); 
byte[] bytes = stream.ToArray(); 

Und dann dies gearbeitet:

MemoryStream stream = new MemoryStream(bytes); 
var newImage = System.Drawing.Image.FromStream(stream); 
stream.Dispose(); 
4

Vielleicht wird das Bild in einem OLE-Feld eingebettet und Sie haben den 88 Byte OLE Header plus Nutzlast zu berücksichtigen:

byteBlobData = (Byte[]) reader.GetValue(0); 
stream = new MemoryStream(byteBlobData, 88, byteBlobData.Length - 88); 
img = Image.FromStream(stream); 
+0

In meinem Fall musste ich nur 8 Bytes "entfernen". neuer MemoryStream (byteBlobData, 8, byteBlobData.Length - 8); – iwhp

+3

Wie können Sie wissen, dass es 8 Bits lang war? – C4u

7

Image.FromStream() erwartet einen Stream, der NUR ein Bild enthält!

Sie die stream.Position auf 0 zurücksetzt, ich habe Sie einen Stream haben, die mehrere Bilder oder anderes Material enthält, müssen Sie Ihre Bilddaten in eine Byte-Array lesen und einen Memory damit zu initialisieren:

Image.FromStream(new MemoryStream(myImageByteArray));

die Memory hat so lange offen bleiben, da das Bild in Gebrauch ist.

Ich habe gelernt, dass der harte Weg auch. :)

0

dieser Code arbeitet

 string query="SELECT * from gym_member where Registration_No ='" + textBox9.Text + "'"; 

     command = new SqlCommand(query,con); 
     ad = new SqlDataAdapter(command); 
     DataTable dt = new DataTable(); 
     ad.Fill(dt); 
     textBox1.Text = dt.Rows[0][1].ToString(); 
     textBox2.Text = dt.Rows[0][2].ToString(); 
     byte[] img = (byte[])dt.Rows[0][18]; 
     MemoryStream ms = new MemoryStream(img); 

     pictureBox1.Image = Image.FromStream(ms); 
     ms.Dispose(); 
1

Try this:

public Image byteArrayToImage(byte[] item) 
{   
    Image img=Image.FromStream(new MemoryStream(item)); 
    img.Save(Response.OutputStream, ImageFormat.Gif); 
    return img; 
} 

Hoffe, es hilft!

0

Versuchen Sie etwas ähnliches zu verwenden, was hier beschrieben wird https://social.msdn.microsoft.com/Forums/vstudio/en-US/de9ee1c9-16d3-4422-a99f-e863041e4c1d/reading-raw-rgba-data-into-a-bitmap

Image ImageFromRawBgraArray(
    byte[] arr, 
    int charWidth, int charHeight, 
    int widthInChars, 
    PixelFormat pixelFormat) 
{ 
    var output = new Bitmap(width, height, pixelFormat); 
    var rect = new Rectangle(0, 0, width, height); 
    var bmpData = output.LockBits(rect, ImageLockMode.ReadWrite, output.PixelFormat); 

    // Row-by-row copy 
    var arrRowLength = width * Image.GetPixelFormatSize(output.PixelFormat)/8; 
    var ptr = bmpData.Scan0; 
    for (var i = 0; i < height; i++) 
    { 
     Marshal.Copy(arr, i * arrRowLength, ptr, arrRowLength); 
     ptr += bmpData.Stride; 
    } 

    output.UnlockBits(bmpData); 
    return output; 
} 
Verwandte Themen