[VB.Net] Screenshot's maken duurt erg lang.

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Chaos101
  • Registratie: Juni 2009
  • Laatst online: 11-09 11:04
Ik ben in VB.Net een remote desktop applicatie aan het maken.
Dit werkt inmiddels allemaal prima, alleen zat ik me te verwonderen over het feit dat het ruim 200 ms duurt om een screenshot te nemen. In de praktijk limiteert dit me tot ~ 3-4 beelden per seconden, omdat er ook nog tijd bijkomt om ze te versturen.
Nu vroeg ik me af of er tweakers zijn die efficientere methodes kennen om screenshots te maken.

Dit is mijn code voor de screenshots op dit moment.

Visual Basic .NET: GetSS.vb
1
2
3
4
5
6
7
8
9
10
11
12
13
Dim gfxScreenshot As Graphics
Dim bmpScreenshot As Bitmap
Dim rtrnByte() As Byte

bmpScreenshot = New Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, PixelFormat.Format16bppRgb555)
gfxScreenshot = Graphics.FromImage(bmpScreenshot)

gfxScreenshot.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, Screen.PrimaryScreen.Bounds.Y, 0, 0, Screen.PrimaryScreen.Bounds.Size, CopyPixelOperation.SourceCopy)
Using stream As New System.IO.MemoryStream
    bmpScreenshot.Save(stream, ImageFormat.Jpeg)
    rtrnByte = stream.ToArray
End Using
Return rtrnByte


Behalve deze methode heb ik 't ook dmv APIs geprobeert, dit leverde ongeveer dezelfde vertraging op. (soms 10 ms minder, maar soms ook 10 ms meer)

Alvast bedankt voor de moeite!

PS. Ik weet niet helemaal zeker of ik dit in het goede forum heb geplaatst. in het 'waar hoort je topic thuis' topic, staat dat je voor (niet efficiente) algoritmen bij Software Engineering en Architecture moet zijn, maar bij SE & A staat weer dat echte code hier thuishoort.

Acties:
  • 0 Henk 'm!

  • ValHallASW
  • Registratie: Februari 2003
  • Niet online
Zoek eerst eens uit in welke stap je vertraging zit. Zit dit in het aanmaken van je objecten, in het daadwerkelijke kopiëren of in het omzetten naar de stream? i.a.w: ga eens profilen.

Acties:
  • 0 Henk 'm!

  • Chaos101
  • Registratie: Juni 2009
  • Laatst online: 11-09 11:04
het zit 'm vooral in deze regel:
Visual Basic .NET:
1
gfxScreenshot.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, Screen.PrimaryScreen.Bounds.Y, 0, 0, Screen.PrimaryScreen.Bounds.Size, CopyPixelOperation.SourceCopy)

Acties:
  • 0 Henk 'm!

Verwijderd

Volgens mij moet het hier sneller mee gaan:

C#:
1
2
3
4
5
[DllImport("user32.dll",EntryPoint="GetDesktopWindow",ExactSpelling=false,CharSet=CharSet.Ansi,SetLastError=true)]
        static extern IntPtr GetDesktopWindow();

        [DllImport("user32.dll",EntryPoint="GetWindowDC",ExactSpelling=false,CharSet=CharSet.Ansi,SetLastError=true)]
        static extern IntPtr GetWindowDC(IntPtr handle);