Performancefrage : Screenshot per Api oder CopyFromScreen ?

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von Trudi.

    Performancefrage : Screenshot per Api oder CopyFromScreen ?

    Hi,

    ich kenne zwei Wege um einen Screenshot zu machen. Den per Windows Api und den per Graphics.CopyFromScreen. Meine Frage ist nun welcher Weg ist schneller/zu bevorzugen ist und warum ?

    Ich würde mich über Antworten freuen :)

    gruß, Trudi
    Aus reiner Vermutung heraus würde ich zur GDI+ tendieren, da diese theoretisch direkt die Grafikkarte ansprechen kann und nicht den Umweg über Windows geht, was möglicherweise zu einer Ausbremsung führt.

    Welche Methode der Windows API benutzt du denn für Screenshots?

    Weil ich grad eh nichts zu tun hab, schreib ich vielleicht einfach mal eine Testapplikation.
    API is natürlich schneller weils direkter ist. Die .NET Klasse greift letztendlich auch nur auf die WinAPI zu, aber noch mit einigem anderen drum und dran.
    Also ich nutzte wenn möglich bei sowas immer API, gerade wenn es noch so relativ einfach ist.
    Hi,

    die Api braucht bei mir länger als CopyFromScreen ?

    Für alle C&P-leute :

    Meine Api-Funktion :

    VB.NET-Quellcode

    1. Private Function TakeScreenshot() As Image
    2. Dim SRCCOPY As Integer = &HCC0020
    3. Dim hDesktop As IntPtr = GetDesktopWindow
    4. Dim hDesktopDC As IntPtr = GetWindowDC(hDesktop)
    5. Dim hDesktopMem As IntPtr = CreateCompatibleDC(hDesktopDC)
    6. Dim hBitmap As IntPtr = CreateCompatibleBitmap(hDesktopDC, Me.ScreenWidth, Me.ScreenHeight)
    7. Dim hBitmapPrev As IntPtr = SelectObject(hDesktopMem, hBitmap)
    8. BitBlt(hDesktopMem, 0, 0, Me.ScreenWidth, Me.ScreenHeight, hDesktopDC, 0, 0, SRCCOPY)
    9. hBitmap = SelectObject(hDesktopMem, hBitmapPrev)
    10. DeleteDC(hBitmapPrev)
    11. ReleaseDC(hDesktop, hDesktopDC)
    12. Dim img As Image = Image.FromHbitmap(hBitmap)
    13. DeleteObject(hBitmap)
    14. Return img
    15. End Function

    Alles andere erzeigt ein schwarzes Bild..

    die Api braucht bei mir bis zu 100 Millisekunden und CopyFromScreen höchstens 80.
    Beides leider für mich unbrauchbar :S

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

    Also bei mir braucht die CopyFromScreen Methode jeweils 10ms.

    Diese Funktion habe ich verwendet (natürlich jeweils auf meine Auflösung zugeschnitten, kann man ja aber mit Parametern realisieren):

    VB.NET-Quellcode

    1. Private Function TakeScreenshot() As Image
    2. Dim img As New Bitmap(1920, 1080)
    3. Dim gfx As Graphics
    4. gfx = Graphics.FromImage(img)
    5. gfx.CopyFromScreen(0, 0, 1920, 1080, New Size(1920, 1080))
    6. Return img
    7. End Function