Problem beim Auslesen von JPG Rohdaten aus TCP Stream

  • VB.NET

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von cocco17.

    Problem beim Auslesen von JPG Rohdaten aus TCP Stream

    Hallo Leute !

    Bin neu hier und hoffe nach langem, unerfolgreichem suchen, hier Hilfe zu finden.

    Und zwar geht es um folgendes:

    Für mein Praktikumsprojekt muss ich einen ECC200-Code mit Hilfe eines Multicode Readers einlesen und auswerten. Der Multicode Reader kann über eine TCP Verbindung angesprochen werden und mit Hilfe eines Trigger-Befehls werden dann die Daten ausgegeben. Soweit, sogut, dies habe ich mittlerweile alles hinbekommen.
    Eine weitere nette Funktion ist die Einbindung des aktuellen Bildes an den Auswertestream. Dies kann als bmp oder jpg geschehen. Habe es zunächst mit der bmp versucht, bin aber nun auf die jpg umgestiegen und für den "positiven Auswertestream", also bei Erkennung des Codes, klappt Darstellung der jpg auch, aber beim "negativen Auswertestream" möchte die Funktion Image.FromStream(oMemoryStream) einfach nicht! Der Fehler: "Ungültige Parameter".
    Habe mittlerweile auch herausgefunden, dass der Fehler z.B. auftritt, wenn ich zuviele Bytes abgeschnitten oder dort gelassen habe, denn so sehen die beiden Ausgaben aus:

    positiver Ausgabestream: "Diagnose ErfolgreichJPG000124207X`..JFIF...." und so weiter.. die ersten 32 Bytes sind also für die Image Geschichte uninteressant, und diese lese ich dann auch aus, bevor ich dazu übergehe, alle bytes der Jpg in edn oMemoryStream zu schreiben.

    negativer Ausgabestream: "JPG000122778X`..JFIF..." und so weiter... sieht im Endeffekt genauso aus, nur dass die gelesene Nachricht des QR-Codes nicht enthalten ist. Also nehme ich nur 12 Bytes weg und lasse den gleichen Code drüber laufen, wie beim positiven Ausgabestream.. UND HIER kommt dann der oben beschriebene Fehler.

    Wäre super, wenn mir einer helfen könnte, ich stelle mal zum Verständnis meinen Code dazu.
    :) Vielen Dank im Voraus !!!!

    VB.NET-Quellcode

    1. Dim oMemoryStream As New MemoryStream
    2. Dim Rest_receive(32) As Byte
    3. Dim Restfehler_receive(10) As Byte
    4. Dim Test As Byte
    5. Dim Rest As Integer
    6. Dim Ende As Integer
    7. Try
    8. If client.Connected Then
    9. Dim stream As NetworkStream = client.GetStream()
    10. streamw = New StreamWriter(stream) ' Stream zum Senden wird deklariert
    11. Dim Str = "t" & vbCrLf
    12. ' Trigger-Befehl senden
    13. stream.Write(TextStringToByteArray(Str), 0, Str.Length)
    14. stream.Flush()
    15. 'Testen, ob Diagnose erfolgreich oder nicht, indem erstes Byte abgefragt wird
    16. Test = stream.ReadByte()
    17. If Test = 68 Then
    18. 'Diagnose Erfolgreich --> Bild
    19. Rest = stream.Read(Rest_receive, 0, 31)
    20. Do
    21. If stream.CanRead Then
    22. Dim rbuffer(1) As Byte
    23. Dim size As Integer = 0
    24. size = stream.Read(rbuffer, 0, rbuffer.Length)
    25. Ende = size
    26. oMemoryStream.Write(rbuffer, 0, size)
    27. Else
    28. MessageBox.Show("Fehler: Aus diesem NetworkStream kann nicht gelesen werden!")
    29. End If
    30. Loop While stream.DataAvailable
    31. ElseIf Test = 74 Then
    32. 'Diagnose nicht Erfolgreich --> Bild
    33. Rest = stream.Read(Restfehler_receive, 0, 10)
    34. Do
    35. If stream.CanRead Then
    36. Dim rbuffer(1) As Byte
    37. Dim size As Integer = 0
    38. size = stream.Read(rbuffer, 0, rbuffer.Length)
    39. Ende = size
    40. oMemoryStream.Write(rbuffer, 0, size)
    41. Else
    42. MessageBox.Show("Fehler: Aus diesem NetworkStream kann nicht gelesen werden!")
    43. End If
    44. Loop While stream.DataAvailable
    45. End If
    46. Else : MsgBox("FEHLER BEIM LESEN")
    47. End If
    48. Catch ex As SocketException
    49. MessageBox.Show("LISTENER: Exception! : " & e.ToString)
    50. End Try
    51. 'Aus dem MemoryStream das Image erstellen:
    52. Dim myImage As Image
    53. myImage = Image.FromStream(oMemoryStream)
    54. PictureBox1.Image = myImage
    55. oMemoryStream.Close()
    56. End Sub

    cocco17 schrieb:


    Rest = stream.Read(Rest_receive, 0, 31)
    ...

    Rest = stream.Read(Restfehler_receive, 0, 10)

    Erst sagst du, dass entweder die ersten 32 oder 12 byte nicht interessant sind, aber dann liest du 31 bzw 10 (!) ?
    EDIT: Da du vorher schon ein Byte liest, ist das mit den 31 zwar richtig, aber das mit den 10 passt irgendwie nicht zu deinem Problem.

    BTW hat das religiöse Gründe, dass du einen EIN BYTE Puffer verwendest? Das dürfte a) Umfug sein und b) auf jeden Fall, denn im Zweifel braucht man dann ja keinen Buffer mehr, sondern .ReadByte reicht.
    Danke für die schnelle Antwort!

    Haha :P okay, das war der Fehler ^^ die 11 Byte, und schon hats geklappt :) danke dafür ;) :)

    Beim Puffer hatte ich zunächst 1024, aber dann hatte ich Probeweise umgestellt, und komischerweise war das Bild dann
    1.) schneller da,
    und 2.) hatte ich das Problem, dass die Bilder nicht ganz übertragen wurden und unten graue Streifen zurückgeblieben sind. Konnte das etwas damit zu tun haben ?

    Mich würde auch noch interessieren, wie man das ganze nun schneller darstellen könnte, ich würde gerne so viele Bilder wie möglich pro Sekunde darstellen können, damit es möglichst flüssig aussieht. Habe das ganze nun in einen Timer gepackt und hantiere gerade ein wenig mit dem Intervall, aber vielleicht gibts ja noch andere Möglichkeiten