Forum: PC-Programmierung [VB.NET] Byte-Array -> Bitmap


von Tobi S. (schmidlitsky)


Lesenswert?

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

: Bearbeitet durch User
von Markus (Gast)


Lesenswert?

Schaue Dir doch mal die Klasse System.Collections.BitArray an.

Grüße
Markus

von bluppdidupp (Gast)


Lesenswert?

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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.