Problem mit FastGraphicsLib

  • VB.NET

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Problem mit FastGraphicsLib

    Hi,

    habe Probleme mit der FastgraphicsLib.
    Ich habe ein Bildschirmübertragungsprogramm programmiert, dass die Bilddaten einzelner bildschirmteile sendet, die sich ändern. Nun muss ich diese nach dem empfangen noch zusammensetzen, was auch funktioniert.
    Was aber das Problem ist, dass das zusammensetzen mir als Beispiel das Bild im Anhang liefert.
    Wenn ich jedes einzelne Bild vor dem zusamensetzen überprüfe sind sie ok.

    Hier der Quellcode:

    VB.NET-Quellcode

    1. Dim MainBitmap As New Bitmap(1366, 768)
    2. Sub TcpReceiver(tcpListener As TcpListener)
    3. Dim tcpClient As TcpClient = tcpListener.AcceptTcpClient()
    4. Dim networkStream = tcpClient.GetStream()
    5. Dim OutputImage, TileScreenImage As FastGraphicsLib.FastGraphics
    6. Do
    7. Dim dataBuffer(12 - 1) As Byte
    8. ' Eigenen Header lesen
    9. networkStream.Read(dataBuffer, 0, 12)
    10. ' Informationen konvertieren und zuweisen
    11. Dim dataLength = BitConverter.ToInt32(dataBuffer, 0)
    12. Dim TileScreen_x = BitConverter.ToInt32(dataBuffer, 4)
    13. Dim TileScreen_y = BitConverter.ToInt32(dataBuffer, 8)
    14. ' Datenbuffer erweitern, um mit größeren Packeten zu arbeiten
    15. ReDim dataBuffer(2048 - 1)
    16. Dim MemoStream As New MemoryStream
    17. Dim bytesRead = 0, actualBytesRead = 0
    18. ' Solange die gelesene kleiner als die gesamte Datenmenge -> Solange noch nicht alles gelesen
    19. While bytesRead < dataLength
    20. ' Lesen vom TcpClient
    21. actualBytesRead = networkStream.Read(dataBuffer, 0, dataBuffer.Length)
    22. ' gelesene Datenmenge aktualisieren
    23. bytesRead += actualBytesRead
    24. ' gerade gelesene Datenmenge in den MemoryStream, um später Bitmap.FromStream
    25. MemoStream.Write(dataBuffer, 0, actualBytesRead)
    26. End While
    27. ' Wenn das empfangene Bild nicht konvertiert werden kann, wieder neu empfangen
    28. Try
    29. TileScreenImage = FastGraphics.FromBitmap(Bitmap.FromStream(MemoStream))
    30. Catch : Continue Do : End Try
    31. ' Solange warten, bis das Bild verfügbar ist (verwende es außerhalb des Threads, weil ja mehrere Threads arbeiten und das Bild brauchen)
    32. Do
    33. Try
    34. OutputImage = FastGraphics.FromBitmap(MainBitmap)
    35. Exit Do
    36. Catch : End Try
    37. Loop
    38. For TileScreenImageHeight = 0 To TileScreenImage.Bitmap.Size.Height - 1
    39. For TileScreenImageWidth = 0 To TileScreenImage.Bitmap.Size.Width - 1
    40. Dim PixelColor = TileScreenImage.GetPixel(TileScreenImageWidth, TileScreenImageHeight)
    41. OutputImage.SetPixel(TileScreen_x + TileScreenImageWidth, TileScreen_y + TileScreenImageHeight, PixelColor)
    42. Next
    43. Next
    44. OutputImage.Unlock()
    45. Dim Mth_ActualiesePicture As ActualiesePicture = AddressOf ActualieseImage
    46. Mth_ActualiesePicture.Invoke(OutputImage.Bitmap)
    47. Loop
    48. End Sub
    49. Delegate Sub ActualiesePicture(ByVal Picture As Image)
    50. Sub ActualieseImage(Picture As Image)
    51. PictureBox.Image = Picture
    52. MainBitmap = Picture
    53. End Sub


    Die Subs TcpReciever werden als thread aufgerufen.

    was mache ich falsch?

    Mit freundlichen Grüßen

    Mario Geier
    Bilder
    • Unbenannt.PNG

      51,58 kB, 377×292, 227 mal angesehen

    MarioGeier00 schrieb:

    was mache ich falsch?
    Mach mal die Breite der Teilbilder durch 4 teilbar.
    Auch wenn die Bildbeite nicht durch 4 teilbar ist, ist die Breite einer Rohzeile in der Bitmap durch 4 teilbar, damit der Start einer neuen Zeile immer an einer Integer-Grenze liegt.
    Verstehe die Bedeutung des Parameters Stride in diesem Snippet und Du weißt Bescheid:

    VB.NET-Quellcode

    1. Dim bmp = New Bitmap(11, 10)
    2. Dim lb = bmp.LockBits(New Rectangle(0, 0, 11, 10), Imaging.ImageLockMode.ReadWrite, Imaging.PixelFormat.Format24bppRgb) ' Imaging.PixelFormat.Format32bppArgb
    3. MessageBox.Show((3 * 11).ToString & Environment.NewLine & lb.Stride.ToString)
    4. bmp.UnlockBits(lb)

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ok, danke :)

    Das ist mittlerweile kein probem, weil ich das ganze jetzt gelöst habe, indem ich für jeden Teil des Bildschirms eine extra PictureBox definiert habe.

    Nur so als Frage noch: Wäre es denn wirklich nicht möglich bilder zu bearbeiten, die in der breite nicht durch 4 teilbar sind? Das wäre ja echt blöd!

    LG

    Mario Geier

    MarioGeier00 schrieb:

    nicht durch 4 teilbar
    Deren Stride-Property ist durch 4 teilbar.
    Wie sieht Dein Code aus?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!