• Hi,
    Ich hätte da einige Verbesserungsvorschläge:
    1.Ersetzen des Screenshots durch Blitten (_WinApi_Bitblt()) des DeviceContext des Desktops(oder eines Fensters) in eine Bitmap. Das blitten dauert bei 1650x1080 nicht mal eine halbe Millisekunde.
    2.Nochmaliges Blitten, allerdings werden die beiden Bilder nun mit XOR verknüpft. Das führt dazu, daß jedes Pixel, das seine Farbe in der Zwischenzeit NICHT geändert hat, schwarz wird.
    3.Jedes Pixel, das nun nicht schwarz ist, hat also seine Farbe geändert. Die Position dieses Pixels innerhab der Bitmap wird gemerkt.
    4.Es muss also nur die Position des Pixels in der Bitmap und die Farbe übertragen werden. String=pos&farbe&pos&farbe&pos&farbe....
    5.Auf Empfängerseite wird jetzt die Farbe per dllstructsetdata(struct,1,farbe, position) in die Bitmap übertragen.(sehr schnell!)

    Die Schwelle ist erreicht, wenn mehr als die Hälfte der Pixel die Farbe geändert haben, denn dann kann man auch gleich ein komplettes Bild übertragen

    Im Prinzip gehts nur um Punkt 3. Aber genau dieses Beispiel, ein Pixel zu finden, habe ich im Assemblertut in einer Handvoll Befehlen erledigt. Ich vermute, daß man noch wesentlich weiter optimieren kann, indem man z.B. Zeilen, in denen sehr wenige geänderte Pixel vorkommen, weglässt.
    Oder das Bild in 100x100 Blöcke unterteilt und nur Blöcke mit geändertem Inhalt überträgt(Blocknummer&Block). Jedenfalls wäre das eine sehr schöne Assemblerübung^^. 90% ist ja bereits im Tut abgehandelt...

  • Hi veronesi,
    Nein tut mir leid. Aber im Forum sind haufenweise Scripte in denen _WinAPI_BitBlt verwendet wird. Ich hab mal ein Beispiel für dich gemacht wie BitBlt funktioniert.

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <WinAPI.au3>
    #include <GDIPlus.au3>
    #include <WindowsConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    ;BitBlt Test
    $hGUI = GUICreate("test", 500, 500);Gui erstellen

    [/autoit] [autoit][/autoit] [autoit]

    $hDC = _WinAPI_GetDC($hGUI);DC vom GUI ermitteln

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $hBitmap = _WinAPI_CreateCompatibleBitmap($hDC, 500, 500);Compatibles Bitmap erstellen
    $hBitmapDC = _WinAPI_CreateCompatibleDC($hDC);Compatibler DC zum Bitmap erstellen

    [/autoit] [autoit][/autoit] [autoit]

    _WinAPI_SelectObject($hBitmapDC, $hBitmap);DC auf Bitmap einstellen

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState();Gui anzeigen

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_Startup();Gdi+ initialisieren
    $hGraphics = _GDIPlus_GraphicsCreateFromHDC($hBitmapDC);Graphics von Bitmap erstellen
    $hWhiteBrush = _GDIPlus_BrushCreateSolid(0xFFFFFFFF);Brush für Hintergrund
    $hPen = _GDIPlus_PenCreate(0xFF000000, 5);Pen für Strich

    [/autoit] [autoit][/autoit] [autoit]

    ;FPS management
    $timer = TimerInit()
    $fps = 0
    AdlibRegister("updatefps", 1000)

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    _GDIPlus_GraphicsFillRect($hGraphics, 0, 0, 500, 500, $hWhiteBrush);Hintergrund weiß machen
    _GDIPlus_GraphicsDrawLine($hGraphics, 50, 50, 400, 400, $hPen);Strich Zeichnene

    [/autoit] [autoit][/autoit] [autoit]

    _WinAPI_BitBlt($hDC, 0, 0, 500, 500, $hBitmapDC, 0, 0, $SRCCOPY);Inhalt von der Bitmap auf den DC vom GUI Bringen
    $fps += 1
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func updatefps()
    WinSetTitle($hGUI,"", "test FPS:" & Int($fps / (TimerDiff($timer) / 1000)))
    EndFunc ;==>updatefps

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;Resourcen entladen
    _GDIPlus_PenDispose($hPen)
    _GDIPlus_BrushDispose($hWhiteBrush)
    _GDIPlus_GraphicsDispose($hGraphics)
    _GDIPlus_Shutdown()
    _WinAPI_ReleaseDC($hGUI, $hDC)
    _WinAPI_DeleteObject($hBitmapDC)
    _WinAPI_DeleteObject($hBitmap)

    [/autoit]
  • ok...

    Kann mir jemand helfen, mit $var = _ScreenCapture_Capture()
    Den Screenshot zu verschicken??

    Bekomme doch in $var nur das Handle des Bildes, wie bekomme ich die daten, die man dann verschicken kann..??

  • Hi Mr_gitarre,
    Was meinst du mit verschicken ? Zu einem anderen Programm oder verschicken via Datei, letzteres würde so gehen:
    hier ist ein Beispiel wie man den ScreenCap speichern kann ;)

    [autoit]

    #include <ScreenCapture.au3>
    ; Capture full screen
    _ScreenCapture_Capture(@MyDocumentsDir & "\GDIPlus_Image1.jpg")

    [/autoit][autoit][/autoit][autoit]

    ; Capture region
    _ScreenCapture_Capture(@MyDocumentsDir & "\GDIPlus_Image2.jpg", 0, 0, 796, 596)

    [/autoit]
  • Na ne, aben NICHT speichern in ne Datei und dann rauslesen, da das zu lange dauert!!!

    man kann doch nen ScreenShot direkt in den Speicher laden, ihn AUS DEM SPEICHER LESEN und dann verschicken, ABER WIE..?

  • Ja natürlich, das isn deskstream, WAS DENN SONST..!
    es geht doch darum, wie man aus eben diesem Handle von der Funktion das Bild rausließt, denn mit einem verschicktem Handle kann man nichts anfangen...

    Über tcp/UDP