bildschirm übertragung

  • VB.NET

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von thefiloe.

    bildschirm übertragung

    Also ich bin mir nicht ganz sicher wie ich das anstellen soll.
    Ich habe mir bisher gedacht ca. so:

    Als erstes einen Screenshot erstellen:

    VB.NET-Quellcode

    1. Dim bounds As Rectangle
    2. Dim screenshot As System.Drawing.Bitmap
    3. Dim graph As Graphics bounds = Screen.PrimaryScreen.Bounds
    4. screenshot = New System.Drawing.Bitmap(bounds.Width, bounds.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb)
    5. graph = Graphics.FromImage(screenshot)
    6. graph.CopyFromScreen(bounds.X, bounds.Y, 0, 0, bounds.Size, CopyPixelOperation.SourceCopy)
    7. Picturebox1.image = screenshot


    und dann übertragen :

    VB.NET-Quellcode

    1. Dim buffer() As Byte = File.ReadAllBytes(para)
    2. For Each c As Connection In list
    3. Try
    4. c.streamw.WriteLine("10" + Convert.ToBase64String(buffer))
    5. c.streamw.Flush()
    6. Catch
    7. End Try
    8. Next


    Also es wird in einen "Code" umgewandelt und dann übertragen:

    Problem:

    Ich kann das Picturebox-image nicht in den Code umwandeln außerdem würde das sicher nicht flüssig laufen

    Pls helft mir hoffe so ist es besser :D mit struktur und Satzzeichen like this ! :O

    Egal

    btw hab nix von Rocky gefunden


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.

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

    Na das sieht doch schonmal besser aus! ^^

    Du kannst ein Image (hier "Screenshot") in einen MemoryStream schreiben (mithilfe der "Image.Save"-Funktion).
    Vom MemoryStream erhälst du dann ganz einfach den Byte-Buffer. (MemoryStream.GetBuffer)


    Verbesserungsvorschläge:
    - Benutze den GZip-Stream um die Daten zu komprimieren
    - Ein Screenshot benötigt keinen Alpha-Channel. Rot-Grün-Blau reicht dafür. (also System.Drawing.Imaging.PixelFormat.Format24bppRgb)
    - Speichere das Bild als Jpeg
    - Verkleinere das Bild (?)

    MemoryStream ist nur ein Beispiel.

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

    yeti2078 schrieb:


    Verbesserungsvorschläge:
    - Benutze den GZip-Stream um die Daten zu komprimieren
    - Ein Screenshot benötigt keinen Alpha-Channel. Rot-Grün-Blau reicht dafür. (also System.Drawing.Imaging.PixelFormat.Format24bppRgb)
    - Speichere das Bild als Jpeg
    - Verkleinere das Bild (?)

    MemoryStream ist nur ein Beispiel.
    hmm das kapier ich jetzt nicht steh da voll an was ist ein GZip-Stream wie benutz ich den
    Und der Alpha-Channel in Rot-Grün-Blau? Was ist das
    Und wenn ich richtig verstanden hab soll ich das Bild erst in nen Ordner abspeichern und dann von da aus in den Code umwandeln. Und why das Bild verkleinern? Meinst du die Größe(Höche, Breite) oder Dateigrößeä#

    EDIT: pls schaut nochma in den thread hinein...


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.

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

    Der Alphakanal ist die Transparenz.
    Und da du keinen Bildschirm mit Löchern drin hast (hoffe ich doch), reicht es, das Bild als eins OHNE Alphakanal abzuspeichern (eben mit dem Code System.Drawing.Imaging.PixelFormat.Format24bppRgb).
    Nicht speichern sondern Screenshot aufnehmen und übertragen.

    Natürlich wird es langsam sein denn zum einen ist CopyFromScreen() langsam und zum anderen jedesmal komplettes Bild übertragen sind einiges an Daten.

    Um das zu umgehen könntest zum einen API zum Bildschirmscreenen nehmen und für eine schnellere Übertragung dir eine art Protokoll entwickeln, dass nur Änderungen übertragen werden, so wirds auch in guten Fernwartungssoftware gemacht.
    Ok welche API- Funktion brauch ich und wie mach ich das, dass ich Veränderungen übertrage und dann auf das alte bild aktualisiere:

    sprich ich hab mir das so gedacht:
    1. Es nimmt einen Screenshot auf übermittelt ihn
    2. Wenn sich was verändert zb Maus fährt rum nimmt es die neue position von maus macht von mir aus nen screen davon und überträgt ihn wieder.
    3. Auf dem anderen Bildschirm also dem der überwacht wird dann im Bild die alte Maus gelöscht und die neue hinaufprojeziert

    oder geht das auch einfacher?

    2. Problem wie kann ich denn jetzt einen Screenshot direkt übertragen habe ja glaube schon ganz am Anfang das Problem genannt.

    Mir ist grad nochwas aufgefallen es gab doch mal so nen teamview Projekt hier wo auch die Veränderung herausgefiltert werden sollten gibts da nix mehr was ich vll verwenden könnte?


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Die sind gescheitert, weil sowas nicht ganz ohne ist.

    Zum anderen ist dein Ansatz falsch, wenn du den neuen Screen überträgst und erst auf dem anderen Rechner die Änderungen rausfilterst haste logischerweise nichts erreicht, weil tu trotzdem ein riesen Traffic hast mit dem Screenshot.

    Du musst die Änderungen auf dem Client, also wo der Screen ausgenommen wird rausfiltern und dann übertragen.

    Wie das machst, überlegen wir mal ganz logisch. Du nimmst ein Screen auf, den ersten der wird komplett übertragen, zudem wird er in einer Variablen gespeichert, nun wird ein weiterer Screen aufgenommen, jetzt gehst du Pixel für Pixel durch und vergleichst deren Farbe, sind deren Pixel Farben unterschiedlich wird der Pixel z.B. einem Array hinzugefügt, mit der Position und Farbe. Wurde das Bild durchlaufen wird nur dieses Pixel Array übertragen.

    Und wie man etwas überträgt, nun natürlich als Byte, du kannst alles in Bytes Konvertieren, in einen NetworkStream schreiben und am anderne PC wieder zurück Konvertieren, natürlich ists nicht Einfach, sondern es sind schon fundierte Programmierkenntnisse gefordert, aber definitv nichts unmögliches.

    Um es noch Performanter zu machen könntest du beim durchlaufen der Pixel einen Zähler hochzählen lassen der die Änderungen zählt und ab einer bestimmten Schwelle z.B. 50% Änderung den kompletten Screen übertragen um somit Zeit zu sparen, wenn sich zuviel geändert hat ist es schwachsinnig jeden Pixel einzelnt zu übertragen.

    und wie du siehst ist mit ein wenig Überlegung sowas doch gar nicht kompliziert sich so ein Konzept auszudenken oder? und es hat noch nichts mit Programmieren zu tun, somit zieht die Ausrede du wärst Anfänger nicht, das einfach logisches Denken.

    Dodo schrieb:


    und wie du siehst ist mit ein wenig Überlegung sowas doch gar nicht kompliziert sich so ein Konzept auszudenken oder? und es hat noch nichts mit Programmieren zu tun, somit zieht die Ausrede du wärst Anfänger nicht, das einfach logisches Denken.
    auf der einen Seite hast du recht auf der anderen wissen fortgeschrittene besserer welche möglichkeiten es gibt und können deshalb bessern ein Projekt entwickelen. Aber ich denke mal das ist mir doch zu schwierig außerdem weiß ich nicht wie man so ein Bild in die einzelnen Pixel zerlegt abfragt ob sich was geändert hat und dann wenn sich was geändert hat die neue farbe und position einträgt...

    EDIT: hab jetzt aber trotzdem noch ne frage:


    VB.NET-Quellcode

    1. Dim bmp As New Bitmap("C:\Users\xxx\Documents\Visual Studio 2008\t.jpg")
    2. 'hier sollte ne for schleife rein wo jeden pixel durchgeht
    3. Dim farbe As Color = bmp.GetPixel(50, 50)
    4. Me.BackColor = farbe


    und zwar wie kann ich hier ne schleife machen die jeden pixel durchgeht?

    EDIT:
    Ok dieser Beitrag gilt nicht als Spam sonder nur um nochmals auf den Thread aufmerksam zu machen, da es jetzt um etwas neues geht ich aber kein neues Thema aufmachen will, da es als Spam interpretiert werden könnte, weil es zum gleichen Thema gehört also:

    Das Problem ist ich will ein Bild in die Pixel auslesen und dann in ein Array Hinzufügen.

    Problem: Die Schleife:

    Ich hab mir das so gedacht man öffnet ein Bild(also Pfad angeben). Dann wird von diesem Bild die Größe gemessen(Höhe,Breite)

    Dann sollte die Schleife durchlaufen als erstes einfach immer die Breite von 0 ausgehend immer um 1 erhöhen(das ist dann von mir aus die Variable i).
    Wenn i dann gleich groß ist wie die gemessene Breite sollte 1 Bei der höhe hinzugefügt werden und das selbe wiederholt sich.

    sprich das läuft so ab: |............................................................................|<--Hier ist das Bild zu Ende. Das ist bis jetzt so durchgelaufen:

    VB.NET-Quellcode

    1. Dim farbe As Color = bmp.GetPixel(i,höhe)

    Nach jedem von diesem Vorgang wird natürlich i um 1 erhöht und wie bereits gesagt wenn i gleich viel ist wie das Bild breit ist wird i wieder 0 und höhe wird um 1 erhöht.

    Wenn dann Höhe gleich viel ist wie die gemessene höhe wird die schleife abgebrochen.

    Jetzt meine Frage: Wie packe ich das alles in eine Schleife und füge Position und farbe in ein Array hinzu


    Edit by LaMa5:
    - Bitte keine Doppelpost's, es gibt eine 'Bearbeiten' Funktion
    --> Beiträge zusammengefügt.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „LaMa5“ ()

    VB.NET-Quellcode

    1. For y As Integer = 0 To bmp.Height - 1
    2. For x As Integer = 0 To bmp.Width - 1
    3. Dim i As Integer = x + y * x
    4. Next
    5. Next

    außerdem verwende da doch einfach LockBits, geht auch schneller...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Das mit den 2 Schleifen ist doch ganz logisch, aber dir scheinen echt noch das Denken dafür zu fehlen.

    Das Dim i ist nichts, ein Dummy der dadrin steht, da kommt dein GetPixel() Code rein.

    Lies dir durch was schleifen sind, dann verstehst du den Code auch.

    pixel auslesen why geht das nicht?

    Ich kann mir nicht erklären wieso das nicht außerdem vll liegt es daran, dass der Computer zu viel Rechenleistung braucht aber wie kann ich das sonst testen ob das geht wenn nicht diesen code in einem Timer

    VB.NET-Quellcode

    1. Dim bmp As New Bitmap("C:\Users\Florian\Documents\Visual Studio 2008\t.bmp")
    2. For y As Integer = 0 To bmp.Height - 1
    3. For x As Integer = 0 To bmp.Width - 1
    4. Dim farbe As Color = bmp.GetPixel(x, y)
    5. PictureBox1.BackColor = farbe
    6. Next
    7. Next


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.