Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Screenshots schnell erstellen??? (https://www.delphipraxis.net/120532-screenshots-schnell-erstellen.html)

Popov 12. Sep 2008 15:02

Re: Screenshots schnell erstellen???
 
Zitat:

Zitat von romber
Ich suche nach einer Möglichkeit, möglichst schnell Screenshots zu erstellen. Das schnellste Ergebnis mit einem Bitmap-Screenshot lag bei mir bei etwa 600ms. Ich muss es irgendwie < 250ms und sogar schneller hinkriegen. Das Bild soll auch möglichst "leicht" sein, damit ich es später auf noch leichteren Teile aufteilen und übers Netz verschicken kann.

Das Problem kenne ich, aber das Problem liegt bei dir. Den Screenshot selbst kriegst du in paar Millisekunden, aber ich wette mit dir, daß du danach das Bild auch noch speicherst. Stimmts? Also das Screenshot allein geht sehr schnell, aber das Speichern auf die Festplatte kann bis zu 500 Millisekunden dauern (manchmal noch länger). Wenn du dann auch noch konvertierst, dann gehen auch noch paar Millisekunden drauf. Ich weiß es, da ich mal selbst paar kleine Testprogramme geschrieben habe. Das Problem hatte ich auch.

Hier meine vergessene Seite mit 5 Jahre alten Programmen. PopSpy und WebCamRecorder haben dem Bildschirm fotografiert. Das Speichern hat so lange gedauert, daß ich Minimum 1 Sekunde pro Bild eingestellt habe. Es kann aber sein, daß inzwischen die Festplatten schneller sind. Ansonsten versuche es mal mit einer Ramdisk.

romber 12. Sep 2008 17:38

Re: Screenshots schnell erstellen???
 
Zitat:

Zitat von MarcoWarm
Zitat:

Zitat von romber
Einfach für mich, für mehr Wissen.

Na dann: das Korrekte Vorgehen in deinem Fall wäre
  • Basisscreenshot machen und komprimiert übertragen
  • nach n Sekunden (oder Hundertstel) weiteren Screenshot machen und Differenz berechnen.
  • der zweite Screenshot wird zum neuen Basisscreenshot
  • Die Differenzdaten in einem möglichst klein gepacktes Format pressen und übertragen
  • bei der Gegenstelle auspacken und auf den Basisscreenshot malen
  • aller 100 oder 1000 Differenzübertragungen mal wieder einen Basisscreenshot schicken

    bei mir hat das so funktioniert

Danke! Könntest Du vielleicht ein paar Zeilen Code aus deienm Projekt als Beispiel mitschicken, falls es kein Super-Geheim-Projekt ist? Das wäre echt toll.

@Popov
Danke! Ich schaue mir die Programme an.

romber 13. Sep 2008 12:44

Re: Screenshots schnell erstellen???
 
Ich hänge immer noch an der Erstellung der Screenshots und bin immer noch auf der Suche nach einer Methode, schnell und ressourcenschönend Bildschirm-Screenshots zu erstellen. Hat jemand noch Ideen?

jfheins 13. Sep 2008 12:55

Re: Screenshots schnell erstellen???
 
Also ich hab bisher einfach ein DC geholt mit GetDC() und dann mit bitblt in ein Bitmap kopiert ....

Ich weiß nicht ob es noch wersentlich schneller gehen kann, aber du kannst ja mal geschwindigkeitsmessungen machen ;)

So jede Funktion 10000 mal durchlaufen lasen und die zeit messen ;)

Evtl. ist ja die screenshot-Funktion gar nicht der flaschenhals?

romber 13. Sep 2008 13:04

Re: Screenshots schnell erstellen???
 
Zitat:

Zitat von jfheins
Also ich hab bisher einfach ein DC geholt mit GetDC() und dann mit bitblt in ein Bitmap kopiert ....

Könntest Du bitte ein bisschen Beispiel-Code posten? Das wäre echt nett! Danke!

freak4fun 13. Sep 2008 13:10

Re: Screenshots schnell erstellen???
 
Zitat:

Zitat von jfheins
Evtl. ist ja die screenshot-Funktion gar nicht der flaschenhals?

Das der Flaschenhals nicht der ScreenShot selbst ist sondern das Speichern steht weiter oben schon. :lol:
Zitat:

Zitat von romber
...
Danke! Könntest Du vielleicht ein paar Zeilen Code aus deienm Projekt als Beispiel mitschicken, falls es kein Super-Geheim-Projekt ist? Das wäre echt toll.

Zitat:

Zitat von romber
Zitat:

Zitat von jfheins
Also ich hab bisher einfach ein DC geholt mit GetDC() und dann mit bitblt in ein Bitmap kopiert ....

Könntest Du bitte ein bisschen Beispiel-Code posten? Das wäre echt nett! Danke!

Wenn du nur fragst ob du den Quellcode bekommst, kommst du nicht weiter. ;) Warum willst du ihn ... bist du zu faul es selbst zu versuchen, oder hast du gar keinen Ansatz? Dann solltest du dir vielleicht überlegen was leichteres zu programmieren. ;)
Nicht böse werden, ist ein gut gemeinter Rat aus Erfahrung. ;)

jfheins 13. Sep 2008 13:18

Re: Screenshots schnell erstellen???
 
Wo hat romber geschrieben, dass das speichern der flaschenhals ist?

Source sieht ungefähr so aus:
Delphi-Quellcode:
var
HDdc: HDC;
    Bild: TBitmap;
const
CopyWidth = 800;
  CopyHeight = 565;

// Vorbereitungen
HDdc := GetDC(0);

Bild := TBitmap.Create;
  Bild.PixelFormat := pf24bit;
  Bild.SetSize(CopyWidth, CopyHeight);
// Vorbereitungen abgeschlosen

// Kopieren
BitBlt(Bild.Canvas.Handle, 0, 0, CopyWidth, CopyHeight, HDdc, 0, 0, SRCCOPY);

//Nachbereitungen
ReleaseDC(0, HDdc);
Bild.Free;

romber 13. Sep 2008 13:18

Re: Screenshots schnell erstellen???
 
Zitat:

Zitat von "freak4fun
Das der Flaschenhals nicht der ScreenShot selbst ist sondern das Speichern steht weiter oben schon. :lol:...

Ich speichere das generierte Bild gar nicht.
Und ein Beispiel brauche ich nicht, um die Code zu kopieren oder so. Ich habe schon mehrere Screenshot-Funktionen selbst gebastelt, auch mit BitBlt und bin mit dem Ergebnis unzufrieden.

xaromz 13. Sep 2008 13:52

Re: Screenshots schnell erstellen???
 
Hallo,

ein kleines Problem ist bei Screenshots Vista. Weil die Graphik über den Desktop Window Manager läuft, funktioniert der DC des Desktops sehr langsam. Microsoft rät davon ab, das zu benutzen (insbesondere auf den Desktop zu zeichnen, ist elend langsam). Allerdings kenne ich keine Alternative.

Gruß
xaromz

romber 13. Sep 2008 14:03

Re: Screenshots schnell erstellen???
 
Die Methode von jfheins ist z. Z. die schnellste Methode, die ich getestet habe, gerade mit Vista. Das Problem ist, dass dise Methode ganauso wie alle die ich getestet habe sehr ressourcenfressend ist. In den Moment, wo das Screenshot erstellt wird, friert das ganze System, auch wenn nur für einen Sekundenbruchteil. Wenn ich z.B. eine Funktion erstelle, wo die Screenshots in einer langen Schleife erstellt werden müssen, dann "zittern" das ganze System. Was könnte man dagegen tun?


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:27 Uhr.
Seite 2 von 4     12 34      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz