byte array to image/bitmap bzw. stream to image/bitmap

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Prometheus.

    byte array to image/bitmap bzw. stream to image/bitmap

    möglicherweise kassiere ich hiermit zwar nen tritt weil die antwort unentdeckt von meinen augen bereits im forum liegt, aber ich steh hier einfach gerade auf der leitung:

    VB.NET-Quellcode

    1. Shared Function Serialize(ByVal data As Image) As Byte()
    2. Dim M As New IO.MemoryStream
    3. data.Save(M, System.Drawing.Imaging.ImageFormat.Bmp)
    4. M.Flush()
    5. Return M.ToArray()
    6. End Function
    7. Shared Function Deserialize(ByVal data As Byte()) As Image
    8. Dim m As IO.MemoryStream = New IO.MemoryStream(data)
    9. Dim bm As Image = Image.FromStream(m)
    10. Return bm
    11. End Function


    das umwandeln in ein byte-array funktinoiert ohne probleme - das byte-array jedoch wieder in ein bitmap, bzw. image leider nicht:

    zeile 10: Dim bm As Image = Image.FromStream(m) -> Ungültiger Parameter.


    meine vermutung ist, dass ich mit den streams irgendwo blödsinn gemacht habe, bzw. beim serialize einen denkfehler hab....
    Die Funktionen haben anscheinend keinen Fehler.

    VB.NET-Quellcode

    1. Dim img As New Drawing.Bitmap(1, 1)
    2. Dim img2 As Drawing.Bitmap = Deserialize(Serialize(img))
    3. Console.WriteLine(img2.Width)
    4. Console.WriteLine(img2.Height)
    5. Console.ReadLine()


    Funktioniert

    Folgendes jedoch macht Fehler:

    VB.NET-Quellcode

    1. Dim img3 As Drawing.Bitmap = Deserialize(New Byte() {})


    Denn dort übergebe ich fehlerhafte Byte-Daten (In diesem Falle ein Array aus 0 Bytes)
    Und dann kommt es, wie du schon sagtest zu dem "Ungültiger Parameter"-Fehler

    Mit anderen Worten: Die Daten die du an Deserialize() übergibst sind Fehlerhaft, nicht jedoch die Funktion selbst

    EDIT 1 : Fehler abfangen in Deserialize()

    VB.NET-Quellcode

    1. Function Deserialize(ByVal data As Byte()) As Image
    2. Try
    3. Return Image.FromStream(New IO.MemoryStream(data))
    4. Catch ex As Exception
    5. Return Nothing
    6. End Try
    7. End Function


    VB.NET-Quellcode

    1. Dim FakeData = New Byte() {1, 2, 3, 4, 5, 6}
    2. Dim img3 As Drawing.Bitmap = Deserialize(FakeData)
    3. If img3 IsNot Nothing Then
    4. ' do something
    5. Else
    6. ' error
    7. End If
    also bei mir funktioniert der code (sogar strict on) einwandfrei.

    Speicherst du den Byte-Array vllt in eine Datei und liest ihn von dort wieder aus?
    Zeige mal ein Anwendungsbeispiel - bei dem es harpert.

    Es müssen also die Daten Fehlerhaft sein, die du der desirialize-Methode übergibts. Auch

    VB.NET-Quellcode

    1. Dim tmp As Bitmap = DirectCast(Deserialize(dat), Bitmap)

    funktioniert btw.

    Edit: Das mit dem Fehler abfangen sollte man imo erst am schluss einbauen. So ein Try-Catch block ist schnell geschrieben und kann einem desshalb die Fehlersuche wenn es zukünftig knallt erschweren.

    lg
    ich habe das ganze jetzt nochmal getestet und festgestellt, dass der fehler in dem teil lag, den ich euch nihct geposted hab ;) - ich versuche einen screenshot des desktops per tcp ip zu übertragen - dazu also das ganze.

    ich habe jetzt einfach mal die tcp übertragung gestrichen und deserlialize(serialize()) verwendet -> hat funktioniert.



    werde mich also wieder mit tcp/ip beschäfigen müssen ....

    sollte es jemanden nach käferjagt sein, hier mal der quellcode des ganzen:

    VB.NET-Quellcode

    1. Private Sub btn_server_Click(sender As System.Object, e As System.EventArgs) Handles btn_server.Click
    2. Dim server As New Socket(AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.IP)
    3. Dim client_socket As Socket
    4. Dim ipAdress As IPAddress = Dns.GetHostAddresses(Dns.GetHostName())(0)
    5. Dim localEP As New IPEndPoint(ipAdress, 930)
    6. server.Bind(localEP)
    7. server.Listen(1)
    8. client()
    9. client_socket = server.Accept()
    10. Dim store(client_socket.ReceiveBufferSize - 1) As Byte
    11. client_socket.Receive(store)
    12. client_socket.Receive(store)
    13. client_socket.Close()
    14. Me.PictureBox1.Image = Deserialize(store)
    15. End Sub
    16. Sub client()
    17. Dim server As New Socket(AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.IP)
    18. server.Connect(New IPEndPoint(Dns.GetHostAddresses(Dns.GetHostName())(0), 930))
    19. Dim rect As Rectangle = My.Computer.Screen.Bounds
    20. Dim bmp As Bitmap = New Bitmap(rect.Width, rect.Height)
    21. Dim g As Graphics = Graphics.FromImage(bmp)
    22. g.CopyFromScreen(0, 0, 0, 0, bmp.Size)
    23. Me.PictureBox1.Image = Deserialize(Serialize(bmp))
    24. server.Send(Serialize(bmp))
    25. server.Close()
    26. End Sub
    27. Shared Function Serialize(ByVal data As Image) As Byte()
    28. Dim M As New IO.MemoryStream
    29. data.Save(M, System.Drawing.Imaging.ImageFormat.Bmp)
    30. M.Flush()
    31. Return M.ToArray()
    32. End Function
    33. Shared Function Deserialize(ByVal data As Byte()) As Image
    34. Dim m As IO.MemoryStream = New IO.MemoryStream(data)
    35. Dim bm As Image = Image.FromStream(m)
    36. Return bm
    37. End Function