Schnell screenshots



  • Hi!
    Ich möchte viele kleinere Bildschirmauschnitte abfotografieren und in ein Bitmap-Array stecken. Dabei handelt es sich um etwa 50 Stück jeweils 5x8 Pixel.
    Das ganze ist zeitkritsch und sollte nicht unter 10FPS fallen.

    Im moment verwende ich die in vb.net geschriebene funktion:

    Public Function MakeScreenShot(ByVal Left As Integer, ByVal Top As Integer, ByVal Width As Integer, ByVal Height As Integer) As Bitmap
            Dim Size As System.Drawing.Size
            Size.Width = Width
            Size.Height = Height
            Dim myBitmap As New Bitmap(Width, Height)
            Dim myGraphics As Graphics = Graphics.FromImage(myBitmap)
            myGraphics.CopyFromScreen(Left, Top, 0, 0, Size)
            myGraphics.Dispose()
            Return myBitmap
        End Function
    

    und rufe sie dann 50 mal in etwas so auf:

    ScreenArray(i) = MakeScreenShot(x, y , 5, 8)
    

    Das scheint aber langsam zu sein.
    Verbesserungsvorschläge?



  • Pack alles in die selbe Bitmap (5x400 Pixel gross, also 50 Stück 5x8 Blöcke untereinander).
    (Oder auch gerne nebeneinander, sollte sich ziemlich egal bleiben)

    Und auf jeden Fall nur 1 "Graphics" Objekt pro 50er-Set anlegen und damit direkt alle 50 Bereiche reinkopieren.

    Dann kannst du experimentieren was schneller ist:
    Variante 1: 50x CopyFromScreen mit je einem Block
    Variante 2: 1x CopyFromScreen über den gesamten Bildschrim in eine Temp-Bitmap und dann die 50 Blöcke aus der Temp-Bitmap in die Block-Sammel-Bitmap rüberkopieren

    Der letzte Tip wäre dann nicht GDI+ zu verwenden. Das wird dann aber gleich ein gutes Stück mehr Aufwand, und ich kann dir auch nicht sagen was unter Windows die schnellste API ist um Screenshots zu machen. (Vermutlich GDI, aber pfuh...)



  • Danke erstmal für die antwort.
    Ich habe im netz ne ganze weile gesucht und viele, leider nicht umsetzbare dinge gefunden. Z.B. die BitBlt-Funktion in der gdi32.dll funktioniert nicht mehr unter 64bit, da die Handels ungültig/negativ sind(zumindest bekomm ich das nicht zum laufen). Mein Problem haben viele Leute und es erstaunt mich, dass es keine fertige dll gibt, die eine Makescreenshot-Funktion(Schnell) bereitstellt, weil es so häufig angefragt wird.



  • Ich wüsste nicht wieso BitBlt unter x64 nicht funktionieren sollte.
    Leider stolpert man öfters noch über falsche PInvoke Signaturen, die dann in bestimmten Fällen Probleme machen können - wie z.B. unter x64.
    Grundsätzlich kann es da aber kein Problem geben, sonst ginge es ja auch in anderen Anwendungen (C, C++, ...) nicht.


Log in to reply