Picturebox Stream / Sharen?

  • VB.NET
  • .NET (FX) 4.5–4.8

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

    Picturebox Stream / Sharen?

    Hey,

    ich versuch seit en paar Stunden herauszufinden, wie ich eine Picturebox zwischen zwei PCs streamen / sharen kann.

    Ich hab einen TCP Listener und einen Client am Laufen, über welche ich auch Strings senden und auslesen kann.

    Was ich möchte:

    Ich habe eine Picturebox auf PC1, auf welcher ich zeichnen kann und möchte sobald was auf PC1 gezeichnet wird, das Ganze auf PC2 live mit sehen.

    Hat einer Erfahrung in dem Bereich? Ich hab bereits versucht das Image in Bytes umzuwandeln, an PC2 zu versenden und das Ganze da aufzuschlüsseln, aber das funktioniert nicht wirklich^^
    Vielleicht solltest du dich erstmal mit Grundlagen beschäftigen, bevor du dich an Serverarchitekturen und TCP rantraust. Eine Picturebox ist ein Steuerelement - du willst mit Sicherheit keine Picturebox über TCP senden.

    south2aka schrieb:

    Ich hab bereits versucht das Image in Bytes umzuwandeln, an PC2 zu versenden [...] aber das funktioniert nicht wirklich

    Was funktioniert nicht? Das ist genau die Vorgehensweise, über TCP können Bytes verschickt werden, aber keine Bilder bzw. Bitmaps. Ein Bild ist eigentlich nichts anderes als Bytes, also macht es doch Sinn, das Bild zu kodieren (weil obwohl das Bild nichts anderes als Bytes ist, macht es keinen Sinn, Höhe * Breite * 3 (bei RGB) Bytes zu verschicken, dafür wurden Kompressionsformate wie PNG oder JPG entwickelt).
    Mfg
    Vincent

    @south2aka Willkommen im Forum. :thumbup:
    Soll das, was sich auf dem einen PC an der PictureBox ändert an der zweiten angezeigt werden?
    Das einfachste wäre, den Bildinhalt per TCP zu übertragen.
    Das sollte sogar so schnell gehen, dass Du quasi live gemaltes in einem vernünftigen Takt übertragen kannst.
    @VincentTB Wir haben genau das gemacht.
    Bilder nach PNG und Co zu komprimieren macht im RAM wenig sinn, das müsste per Festplatte passieren, und das wäre ein NoGo.
    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!

    RodFromGermany schrieb:

    ​Bilder nach PNG und Co zu komprimieren macht im RAM wenig sinn, das müsste per Festplatte passieren, und das wäre ein NoGo.

    Wieso sollte das im RAM wenig Sinn machen? Ich würde sogar behaupten, dass es gar nicht möglich ist, Dateien auf der Festplatte zu komprimieren, die Daten müssen schon in den Arbeitsspeicher geladen werden.

    Ich habe mich schon sehr viel mit der Übertragung von Bildern über TCP beschäftigt (nungut, bei mir war's eher ein Video aber ich glaube das ist es hier auch) und das schnellstmögliche ist, nach meinem Wissen, das ganze mit einem sehr schnellen Codec (der muss extra auf Livestreaming aus sein) zu kodieren, mit TurboJPG zu komprimieren (das ist ungefähr 2-3 ms schneller als .Net Mittel) und zu senden. Gerade wenn der Upload nicht so schnell ist (habe hier z. B. eine 16k Leitung mit 0,8 Upload) macht es Sinn, das Bild zu komprimieren. Ich hatte jetzt hier PNG vorgeschlagen, weil bei einer Zeichnung vielleicht eher Wert auf eine verlustfreie Darstellung gelegt wird.
    Mfg
    Vincent

    msdn.microsoft.com/de-de/library/ms142147(v=vs.110).aspx
    und MemoryStream :D


    aber abgesehen davon, wäre es nicht sinnvoller die Zeichenoperationen zu Übertragen?
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    was ich bisher habe:


    C#-Quellcode

    1. Public Function ByteArray2Image(ByVal ByAr() As Byte) As Image
    2. Dim img As Image
    3. Dim MS As New IO.MemoryStream(ByAr)
    4. Try
    5. img = Image.FromStream(MS)
    6. Catch ex As Exception
    7. MsgBox(ex.Message)
    8. End Try
    9. Return img
    10. End Function
    11. Private Overloads Function ImageToBytes(ByVal Img As System.Drawing.Image) As Byte()
    12. Dim IC As New ImageConverter
    13. ImageToBytes = CType(IC.ConvertTo(Img, GetType(Byte())), Byte())
    14. Return ImageToBytes
    15. End Function
    16. Private Sub PictureBox1_MouseUp(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseUp
    17. Try
    18. PictureBox1.Image = bmp
    19. Dim Client As New TcpClient
    20. Client.Connect(TextBox2.Text, 8002)
    21. Dim stream_w As StreamWriter
    22. stream_w = New StreamWriter(Client.GetStream)
    23. stream_w.Write(ImageToBytes(PictureBox1.Image))
    24. stream_w.Flush()
    25. Client.Close()
    26. Catch ex As Exception
    27. MsgBox(ex.Message)
    28. End Try
    29. End Sub
    Wieso benutzt du einen StreamWriter, wenn du Bytes übertragen willst? Du kannst die Daten direkt in den NetworkStream schreiben. Soweit ich weiß gibt es gar keine Write-Überladung, die ein Byte Array annimmt. Benutzt du Option Strict Off? Es ist auch unklug, bei jedem Frame eine neue Verbindung aufzubauen. Du kannst eine Verbindung einfach einmal öffnen und dann beim Schließen der Form auch schließen.
    Mfg
    Vincent

    VincentTB schrieb:

    ​Du kannst die Daten direkt in den NetworkStream schreiben


    Wie

    south2aka schrieb:

    ​ne Option Strict On
    ? Option Strict On ist einer der wichtigsten Einstellungen, man sieht ja was rauskommt wenn das ausgeschaltet ist. Schalte das bitte mal ganz schnell ein.
    Mfg
    Vincent

    VB.NET-Quellcode

    1. Try
    2. Dim client As New TcpClient
    3. client.Connect(TextBox2.Text, 8002)
    4. Dim stream = client.GetStream()
    5. Dim data = ImageToBytes(bmp)
    6. stream.Write(data, 0, data.Length)
    7. client.Close()
    8. Catch ex As Exception
    9. MessageBox.Show(ex.Message)
    10. End Try


    Bitte benutze keine MsgBox, nimm stattdessen MessageBox.Show. Wie aber @jvbsl schon gesagt hat, am besten wäre es natürlich, wenn du die einzelnen Operationen übertragen würdest. Das ginge am schnellsten und hätte die höchste Qualität.
    Mfg
    Vincent

    south2aka schrieb:

    einzelnen Operatoren

    VincentTB schrieb:

    einzelnen Operationen
    Das ist ein unterschied.Was @VincentTB vorgeschlagen hat, ist dass du die Userinteraktionen überträgst, und so das Zeichnen beim anderen PC simulierst.
    Bsp. Zieht der User eine Linie von (10,20) nach (120,140) machst du das am anderen PC auch.
    @south2aka Sind Deine Programmierkenntnisse auf einem Stand, dass Du solch ein Problem auch ohne massive Hilfe des Forums stemmen könntest???
    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!

    VincentTB schrieb:

    die einzelnen Operationen übertragen würdest.
    Ähm - das setzt voraus, dass das Image selbst gezeichnet wird, etwa mit GDI+. Ich bezweifel aber stark, dass solch hier vorliegt.
    Sind die Images aus Resourcen, Dateien, oder sonstwo weg, dann gibts gar keine Zeichen-Operationen, und south2aka wird damit nur kirre gemacht.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    ErfinderDesRades schrieb:

    ​Ähm - das setzt voraus, dass das Image selbst gezeichnet wird

    south2aka schrieb:

    Ich habe eine Picturebox auf PC1, auf welcher ich zeichnen kann und möchte sobald was auf PC1 gezeichnet wird, das Ganze auf PC2 live mit sehen.


    und er will das Bild im PictureBox1.MouseUp-Event senden. Aus meiner Sicht spricht viel dafür, dass auf die PictureBox mit GDI+ gezeichnet wird.
    Mfg
    Vincent

    Der Aufwand, stets das komplette Bild zu übertragen ist da aber deutlich geeringer.
    Und dass das funktioniert sieht man bei Kameras im Live-Bild.
    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!
    @south2aka Es wäre Klasse, wenn Du Deinen Code posten würdest, denn Du bist gewiss nicht der letzte, der vor diesem Problen steht.
    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!