[VB.NET] Byte-Array -> Bitmap

OP #3887160
Hallo zusammen,

ich brauche Hilfe bei der Ausgabe einer Bitmap.
Und zwar bekomme ich über eine TCP/IP Verbindung einen Byte Array, der 
eine Bitmap darstellen soll.
Die Kommunikation funktioniert, nur kann ich den Byte-Array nicht als 
Bitmap in einer "PictureBox" darstellen oder die Bitmap abspeichern.

VB.NET Code:
1
Imports System.IO
2
Imports System.Collections
3
Imports System.Net.Sockets
4
Imports System.Net
5
Imports System.Text
6
Imports System.Threading
7

8
Imports System.Drawing.Bitmap
9
Imports System.Drawing.Image
10

11
Public Class Form1
12

13
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
14

15
Dim Socket As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
16
Dim IP As IPAddress = IPAddress.Parse("192.168.5.5") 'IP Server
17

18
If Socket.Connected = False Then
19
Socket = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
20
Socket.Connect(IP, 23)  'Verbindung mit der IP-Adresse und dem Port herstellen
21
ElseIf Socket.Connected = True Then
22
MessageBox.Show("Verbindung bereits hergestellt")
23
End If
24

25
Dim Get_Image() As Byte
26
Dim Response_Image(362038) As Byte
27

28
Get_Image = Encoding.ASCII.GetBytes("GI0100") 'Befehl zur Bildübertragung 
29
Socket.Send(Get_Image) 'Bildanfrage Senden
30
Socket.Receive(Response_Image) 'Bild empfangen
31

32
Dim Pfad As String = "C:\Bilder.bmp" 'Ort
33
Dim Speicher As New MemoryStream(Response_Image) 'Bild zwischenspeichern
34
Dim Bild As Image
35

36
Bild = Image.FromStream(Speicher) '<- Fehlermeldung: Ungültiger Parameter. 
37

38
PictureBox1.Image = Bild
39
Bild.Save(Pfad)
40

41
Socket.Disconnect(True)
42
End Sub
43

44
End Class

Der Byte-Array, den ich von der Server-Anwendung bekomme hat folgenden 
Aufbau:
RI|01|00|00058636|BM...

Die ersten beiden Bytes stehen für Response Image,
Der nächste Block (gekennzeichnet durch |) sagt mir, ob es ein Livebild 
ist oder aus dem Speicher kommt.
Danach folgt die Bildnummer und die letzten acht Bytes geben Aufschluss 
über die länge der Bilddaten.
Ab "BM" folgen die eigentlichen Daten der Bitmap.


Falls jemand weiß, wie man eine Bitmap vernünftig aus einem Byte Array 
heraus bekommt, würde ich mich sehr über ein paar Tipps freuen.

Edit: MS Visual Studio 2013
Grüße
Gast
Socket.Receive() liest nur das in den Puffer was bereits an Daten 
eingetroffen ist, das kann ggf. auch nur 1 Byte sein! Hier muss der 
Rückgabewert beachtet werden und Socket.Receive() ggf. mehrmals 
aufgerufen werden bis alle Daten abgerufen und irgendwohin gespeichert 
wurden.

Man kann sich dazu z.B. sowas bauen (C#, sollte in VB.net aber ähnlich 
möglich sein):
1
public byte[] ReadBytes(Socket s, int byteCount)
2
{
3
  byte[] buffer = new byte[byteCount];    // store incoming bytes here
4

5
  int bytesRead = 0;  // bytes read in the last .Receive() call
6
  int bytesLeft = byteCount;
7

8
  while(bytesLeft>0) // until we have read byteCount bytes.
9
  {
10
    bytesRead=s.Receive(buffer, bytesRead, bytesLeft, SocketFlags.None);    // append to buffer
11
    bytesLeft = bytesLeft - bytesRead;  // calculate how much bytes the next call may read
12
  }
13

14
  return buffer;
15
}

Man könnte dann die jeweiligen Blöcke durch einzelne Aufrufe von 
ReadBytes() mit entsprechendem byteCount einlesen.
Mit z.B. BitConverter kann man byte-Arrays auch leicht in passende 
Datentypen umwandeln (z.B. BitConverter.ToInt32(), 
BitConverter.ToInt16(), etc.)
ggf. besser Socket.ReceiveTimeout auf irgendeinen sinnvollen Wert 
setzen, damit man im Fehlerfalle nicht endlos auf Daten wartet.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 11 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.