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:
Die Subs TcpReciever werden als thread aufgerufen.
was mache ich falsch?
Mit freundlichen Grüßen
Mario Geier
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
- Dim MainBitmap As New Bitmap(1366, 768)
- Sub TcpReceiver(tcpListener As TcpListener)
- Dim tcpClient As TcpClient = tcpListener.AcceptTcpClient()
- Dim networkStream = tcpClient.GetStream()
- Dim OutputImage, TileScreenImage As FastGraphicsLib.FastGraphics
- Do
- Dim dataBuffer(12 - 1) As Byte
- ' Eigenen Header lesen
- networkStream.Read(dataBuffer, 0, 12)
- ' Informationen konvertieren und zuweisen
- Dim dataLength = BitConverter.ToInt32(dataBuffer, 0)
- Dim TileScreen_x = BitConverter.ToInt32(dataBuffer, 4)
- Dim TileScreen_y = BitConverter.ToInt32(dataBuffer, 8)
- ' Datenbuffer erweitern, um mit größeren Packeten zu arbeiten
- ReDim dataBuffer(2048 - 1)
- Dim MemoStream As New MemoryStream
- Dim bytesRead = 0, actualBytesRead = 0
- ' Solange die gelesene kleiner als die gesamte Datenmenge -> Solange noch nicht alles gelesen
- While bytesRead < dataLength
- ' Lesen vom TcpClient
- actualBytesRead = networkStream.Read(dataBuffer, 0, dataBuffer.Length)
- ' gelesene Datenmenge aktualisieren
- bytesRead += actualBytesRead
- ' gerade gelesene Datenmenge in den MemoryStream, um später Bitmap.FromStream
- MemoStream.Write(dataBuffer, 0, actualBytesRead)
- End While
- ' Wenn das empfangene Bild nicht konvertiert werden kann, wieder neu empfangen
- Try
- TileScreenImage = FastGraphics.FromBitmap(Bitmap.FromStream(MemoStream))
- Catch : Continue Do : End Try
- ' Solange warten, bis das Bild verfügbar ist (verwende es außerhalb des Threads, weil ja mehrere Threads arbeiten und das Bild brauchen)
- Do
- Try
- OutputImage = FastGraphics.FromBitmap(MainBitmap)
- Exit Do
- Catch : End Try
- Loop
- For TileScreenImageHeight = 0 To TileScreenImage.Bitmap.Size.Height - 1
- For TileScreenImageWidth = 0 To TileScreenImage.Bitmap.Size.Width - 1
- Dim PixelColor = TileScreenImage.GetPixel(TileScreenImageWidth, TileScreenImageHeight)
- OutputImage.SetPixel(TileScreen_x + TileScreenImageWidth, TileScreen_y + TileScreenImageHeight, PixelColor)
- Next
- Next
- OutputImage.Unlock()
- Dim Mth_ActualiesePicture As ActualiesePicture = AddressOf ActualieseImage
- Mth_ActualiesePicture.Invoke(OutputImage.Bitmap)
- Loop
- End Sub
- Delegate Sub ActualiesePicture(ByVal Picture As Image)
- Sub ActualieseImage(Picture As Image)
- PictureBox.Image = Picture
- MainBitmap = Picture
- End Sub
Die Subs TcpReciever werden als thread aufgerufen.
was mache ich falsch?
Mit freundlichen Grüßen
Mario Geier