kostenloser Webspace werbefrei: lima-city


VB.net - Screenshot per TCP

lima-cityForumProgrammiersprachenProgrammieren mit .NET & Mono

  1. Autor dieses Themas

    programtools

    programtools hat kostenlosen Webspace.

    Hi
    Ich möchte nun gerne mit meinem Clienten ein Screenshot erstellen und diesen dann ohne zwischenzuspeichern in bites konvertieren oder was ich da auch immer machen muss und dann an den Server über die bestehende TCP-Verbindung senden, der das empfangene dann wieder encoden soll und in einer Picturebox anzeigen soll. Wichtig ist eventuell noch, dass ich nicht nur das Bild, sondern auch noch einen Text davor versende, damit der Server weiss was er da bekommt.
    Ich hab mir natürlich schon diverse Seiten angeschaut, aber nichts wirklich brauchbares oder funktionierendes gefunden -.-
    Ich hoffe, ihr könnt mir da weiterhelfen!
    Vielen Dank schonmal und MFG
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Hallo programtools,

    ich gehe mal davon aus, dass Dein Screenshot-Code ungefähr so aussieht:
    Public Function CaptureScreen() As Bitmap
        Dim b As New Bitmap(SystemInformation.VirtualScreen.Width, SystemInformation.VirtualScreen.Height)
        Dim g As Graphics = Graphics.FromImage(b)
        g.CopyFromScreen(0, 0, 0, 0, b.Size)
        g.Dispose()
        Return b
    End Function


    Auf der Client-Seite würde ich dann mal folgendes probieren:
    Dim bmp As Bitmap
    
    bmp = CaptureScreen()
    bmp.Save(networkStream, ImageFormat.Png)


    siehe dazu:
    http://msdn.microsoft.com/de-de/library/ms142147.aspx
    http://msdn.microsoft.com/de-de/library/system.drawing.imaging.imageformat_properties.aspx

    Auf der Server-Seite sollte es evtl. wie folgt funktionieren:
    Dim img as Image
    DIm bmp as Bitmap
    
    img = Image.FromStream(networkStream)
    bmp = new Bitmap(img)


    siehe dazu:
    http://msdn.microsoft.com/en-us/library/93z9ee4x.aspx

    Probiert habe ich sowas noch nie, von daher kann es gut sein, dass ich damit voll daneben liege.
    Und das mit den vorausgeschickten Markern ist eine gute Idee. Am besten nimmst Du dann aber entweder Text mit einer wohldefinierten länge oder Du kodierst das in Long Werten (die sind immer 4 Byte groß).
  4. Autor dieses Themas

    programtools

    programtools hat kostenlosen Webspace.

    Vielen Dank, aber das mit dem Bild klappt irgendwie garnicht, aber vielleicht bekomme ichs auch eiunfach nur nicht hin...
    Eventuell gibt es da noch andere möglichkeiten ?!
    MFG
  5. vampiresilence

    Kostenloser Webspace von vampiresilence

    vampiresilence hat kostenlosen Webspace.

    Du musst auf dem Server zuerst einen Listening Server laufen haben, dessen asynchrones Event dann das Bitmap verarbeitet. Das mit den Markern kannst du leicht umsetzen, indem du über die selbe Verbindung einfach Strings verschickst. Der Server kann dann feststellen von welchem Typ die ankommenden Daten sind und diese entsprechend filtern und bedingt weiterverarbeiten.

    Liebe Grüße
    - VampireSilence
  6. Autor dieses Themas

    programtools

    programtools hat kostenlosen Webspace.

    Meine Verbindung steht... das ist kein Problem. Nur kann ich die Bilder nicht 'konvertieren' und 'verschicken' bzw wieder aus den bytearrays oder was ich da auch immer aus dem Bild mache ein Bild erzeugen.
    MFG
  7. Hallo programtools,

    schade, dass das so nicht funktioniert hat. Weist Du genau, woran es gescheitert ist?
    Schlägt bmp.Save() fehl, kommen die Daten nicht am Server an (Du kannst ja mal mit networkStream.Read() ein paar Bytes lesen und schauen, ob ein PNG-Header drin ist). Falls ein Problem beim konvertieren besteht, dann kannst Du ja auch mal ImageFormat.Bmp versuchen (PNG habe ich nur genommen, weil das komprimiert wird).
    Ansonsten kannst Du es ja auf die harte Tour machen.
    Beim Client:
    Schicke die Höhe und die Breite des Bildes (bmp.Height bzw. bmp.Height). Danach schickst Du die Farbwerte der einzelnen Pixel (bmp.GetPixel(x, y).R, bmp.GetPixel(x, y).G, bmp.GetPixel(x, y).B, der Rückgabewert dieser Methoden ist schon vom Typ Byte).
    Beim Server:
    Erzeuge anhand der empfangenen Höhe und Breite eine Bitmap. Setze dann die Farbe der Pixel mit bmp.SetPixel(x,y, Color.FromArgb(r, g, b))

    Edit:
    Mir ist da noch was eingefallen. Kann es sein, dass Du ein NetworkStream.Read() ausführst bevor Du Image.FromStream() aufrufst?
    Falls das so ist, dann kann es sein, dass Du bereits einige Bilddaten aus dem Strom gelesen hast, die dann bei Image.FromStream() fehlen. Dann schlägt das konvertieren natürlich fehl, da die übrigen Daten keine korrekten Bilddaten mehr sind. D.h. Du darfst nur genau so viele Bytes aus dem Strom lesen, wie Dein Marker hat. Deshalb habe ich auch gesagt, dass die Marker eine wohldefinierte Länge haben sollen. Sonst hilft nur byteweises einlesen und ein fest definiertes Ende-Byte (z.B. 0-terminierter String).

    Beitrag zuletzt geändert: 6.2.2011 17:11:11 von darkpandemic
  8. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!