2017-06-20 4 views
0

Wie der Titel sagt, habe ich ein Problem mit einer Ausnahme. "System.ArgumentException". Ich bekomme es, wenn ich versuche, Byte-Array in Bitmap-Bild zu konvertieren. Hier ist der Code, wo die Ausnahme ausgelöst wird:Parameter ist nicht gültig Speicher-Stream. image.FromStream C#

Ich habe auch versucht, mit Bildwandler zu tun. Und dazu bmp = new Bitmap(ms); verwenden Sie bmp = (Bitmap)image.FromStream(ms); Was ist interessant, dass, wenn ich irgendwelche von denen (ob mit Speicher-Stream oder Bildkonverter) innerhalb von try Catch-Block ist. Es wird ein Bild erstellen ABER es fehlen oft einige Teile (zum Beispiel die Hälfte des Bildes ist sichtbar), aber manchmal erzeugt es ein vollständiges Bild und in der Ausgabe heißt es immer noch, dass eine Ausnahme geworfen wurde. Und eine Ausnahme wird ausgelöst. - Entschuldigung für die Grammatik. - Und ja, ich habe versucht, nach Lösung für mein Problem zu suchen, aber ich habe nichts gefunden

EDIT: Sieht aus wie ich einige Teile vergessen habe, um in Frage zu stellen, so il es hier tun. Ich mache Projekt, das Bild des Desktops an ein anderes Projekt sendet, und dafür muss er Bytes senden ... Wenn ich das File.WriteAllBytes zum Testen in diesen ersten Beispielcode setzen würde, fügte ive hinzu, dass es fehlschlug. Aber auf der Seite, wo es gesendet wurde, funktionierte es. und dies ist der Code, der das Bild des Desktop bekommt dreht em Bytes

using (var stream = new MemoryStream()) 
{ 
    bmp.Save(stream, ImageFormat.Jpeg); 
    Buffer = stream.ToArray(); 
} 

Und in Stack-Trace sagt Ausnahme bei System.Drawing.Bitmap..ctor geworfen wird (Stream Stream) ..

EDIT 2: Empfangspuffer:

   int ArraySize = acc.Receive(Buffer, 0, Buffer.Length, 0); 
       Array.Resize(ref Buffer, ArraySize); 
       MemoryStream ms = new MemoryStream(Buffer); 
       ms.Position = 0; 
       bmp = new Bitmap(ms); 
       pictureBox1.Image = bmp; //Dont mind the naming 

Sendepuffer:

   bmp = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height); 
       Graphics g = Graphics.FromImage(bmp); 
       g.CopyFromScreen(0, 0, 0, 0, bmp.Size); 
       using (var stream = new MemoryStream()) 
       { 
        bmp.Save(stream, ImageFormat.Jpeg); 
        stream.Flush(); 
        acc.Send(stream.ToArray()); 
       }//Dont mind the naming 

Und natürlich gibt es Hintergrundverbindungen etc. zwischen Sockets.

+1

Was ist in der Byte-Array? – adv12

+0

Wahrscheinlich möchten Sie den Code teilen, der 'Buffer' erzeugt, das Problem stammt wahrscheinlich dort. –

+0

Zur schnellen Überprüfung auf Korrektheit können Sie 'File.WriteAllBytes (Dateiname, ByteArray)' 'mit der entsprechenden Dateierweiterung aufrufen. Wenn die Datei beim Öffnen durcheinander gebracht wird, stimmt etwas mit dem Inhalt Ihres Byte-Arrays nicht. – JamieSee

Antwort

0

Obwohl Sie das gesamte Bild mit einem einzigen Send()-Vorgang senden können, benötigen Sie möglicherweise mehrere Receive() Operationen, um das Ganze zu erhalten. Haben Sie überprüft, ob Ihre ArraySize mit der Größe der von Ihnen gesendeten Daten übereinstimmt?

Sie werden eine Schleife haben zu verwenden, um die ganze Sache zu erhalten, das heißt:

int offset = 0; 
int received; 
while ((received = acc.Receive(Buffer, offset, Buffer.Length - offset, 0)) > 0) 
{ 
    offset += received; 
} 

den Puffer Unter der Annahme, ist groß genug, diese halten Daten zu empfangen, bis die andere Seite, um die Verbindung geschlossen wird.

Wenn die andere Seite nicht zum Schließen der Verbindung gedacht ist, müssen Sie einen Weg einleiten, um zu wissen, wann Sie den Empfang beenden sollen, d. Zuerst senden Sie die Größe der Daten (als feste Anzahl von Bytes), dann die Daten selbst.

+0

Okay, ich werde morgen überprüfen, ob das funktioniert ... Da muss ich jetzt gehen – user8126038

Verwandte Themen