Delphi-PRAXiS

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)

romber 12. Sep 2008 07:48


Screenshots schnell erstellen???
 
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.

Danke für jeden Tipp!

Sherlock 12. Sep 2008 08:06

Re: Screenshots schnell erstellen???
 
Am schnellsten ging das bei mir immer mit der Taste "Druck". Komplett ohne zusätzliche Tools hab ich dann einen Screenshot in der Zwischenablage, der ist kompatibel zu allen gängigen Bildbearbeitern von Paint bis Photoshop.


Oder was meinst Du?
Sherlock

toms 12. Sep 2008 08:20

Re: Screenshots schnell erstellen???
 
Hallo,

Sakura hat mal eine Funktion geschrieben, welche "auf Geschwindigkeit getrimmt" ist.

romber 12. Sep 2008 08:20

Re: Screenshots schnell erstellen???
 
Ich meine, ich muss diese Screenshots automatisiert mind. 4x pro Sekunde erstellen und bearbeiten können.

Luckie 12. Sep 2008 08:22

Re: Screenshots schnell erstellen???
 
Er will wahrscheinlich den Desktop "filmen" und live über das Internet auf einen anderen Rechner übertragen.

romber 12. Sep 2008 08:30

Re: Screenshots schnell erstellen???
 
@Luckie

Ja, so was ähnliches.

Die Funktion von Sakura läuft bei mir verdammt langsam (hat Vista was damit zu tun?), die erstellung eines Screenshots dauert ca. 5-8 Sekunden.

Luckie 12. Sep 2008 08:37

Re: Screenshots schnell erstellen???
 
Ich glaube, so wirst du nicht weitkommen. Wesentlich effektiver wäre es immer nur die Veränderungen zu übertragen und nur alle paar Sekunden einen vollständigen Screenshot. Das ist natürlich mit etwas mehr Aufwand und Gehirnschmalz verbunden, als dein bisheriger Lösungsansatz.

Und was heißt: "So was ähnliches"?

MarcoWarm 12. Sep 2008 08:54

Re: Screenshots schnell erstellen???
 
OT
Zitat:

Zitat von Luckie
Und was heißt: "So was ähnliches"?

Trojaner ;-) hust ...
nichts für ungut ... war nur ins blaue geraten

Für alle anderen Zwecke würde ich einen in die Anwengung eingebetteten VNC Server empfehlen

romber 12. Sep 2008 09:30

Re: Screenshots schnell erstellen???
 
Hat mit dem Trojaner gar nichts zu tun.
Es gibt genügend fertige Lösungen für das was ich vor habe. Aber lernen kann man nur, wenn man selbst versucht, etwas zu erreichen. (Fast) für alles, was wir hier programmieren gibt es eine fertige Lösung, und trotzdem sitzen alle fleißig an der Kiste und machen die Augen kaputt.

Zitat:

Zitat von Luckie
Ich glaube, so wirst du nicht weitkommen. Wesentlich effektiver wäre es immer nur die Veränderungen zu übertragen und nur alle paar Sekunden einen vollständigen Screenshot...

Das habe ich auch in meinem ersten Post gemeint.

Zitat:

Zitat von Luckie
...Und was heißt: "So was ähnliches"?

Ich möchte ein kleines Remote Desktop Client/Server versuchen. Einfach für mich, für mehr Wissen.

MarcoWarm 12. Sep 2008 09:37

Re: Screenshots schnell erstellen???
 
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

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?

taaktaak 13. Sep 2008 14:25

Re: Screenshots schnell erstellen???
 
Moin, Moin.
Mal abgesehen von der Geschwindigkeit:
Liefert BitBlt() bei Verwendung des HDC unter VISTA und aktiviertem AeroGlass überhaupt ein korrektes Bild? Habe selbst auch das Problem, kann es aber nicht selbst testen, da mir zum Programmieren kein VISTA-System zur Verfügung steht (auf einer VM konnte ich den Aero-Effekt nicht aktivieren, da die Graphikemulation der VM offenbar nicht schnell genug ist)

romber 13. Sep 2008 14:32

Re: Screenshots schnell erstellen???
 
Zitat:

Zitat von taaktaak
Moin, Moin.
Mal abgesehen von der Geschwindigkeit:
Liefert BitBlt() bei Verwendung des HDC unter VISTA und aktiviertem AeroGlass überhaupt ein korrektes Bild?

Das Bild entspricht 1 zu 1 dem, was ich auf dem Bildschirm sehe.

Namenloser 13. Sep 2008 15:13

Re: Screenshots schnell erstellen???
 
Ich kann acuh nicht bestätigen, dass Screenshots unter Vosta langsamer sind als unter XP. :gruebel:
Und Dank des neuen Window-Managers sind auf den Screenshots auch halbtransparente und Direct3D-fenster zu sehen.

taaktaak 13. Sep 2008 16:19

Re: Screenshots schnell erstellen???
 
Danke für die Info, dann wird der Fehler in MEINEM Programm wohl woanders liegen.

romber 14. Sep 2008 18:05

Re: Screenshots schnell erstellen???
 
Hat jemand Ideen, warum das System während der Screenshot-Erstellung friert und was dagegen zu unternehmen ist?

toms 14. Sep 2008 18:37

Re: Screenshots schnell erstellen???
 
Zitat:

Zitat von romber
Hat jemand Ideen, warum das System während der Screenshot-Erstellung friert und was dagegen zu unternehmen ist?

Hallo, könntest du noch weitere Infos liefern, wie du den Screenshot erstellst und ob es bei einem einzelnen Screenshot einfriert oder wenn du mehrere nacheinander machst?

romber 14. Sep 2008 19:02

Re: Screenshots schnell erstellen???
 
Für die Erstellung der Screenshot benutze ich die Funktion, die jfheins vorgeschlagen hat.

Delphi-Quellcode:
var
  HDdc: HDC;
  Bild: TBitmap;
  CopyWidth: integer;
  CopyHeight: integer;
begin
  HDdc := GetDC(0);
  CopyWidth := Screen.Width;
  CopyHeight := Screen.Height;

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

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

  ReleaseDC(0, HDdc);
  Image1.Picture.Bitmap := Bild;
  Bild.Free;
Es friert auch bei dem einzelchen Screenshot ein, nur man merkt es kaum, weils zu schnell passiert. Aber wenn ich dann mehrere nacheinander erstelle, z.B. mit einem Timer und 500ms Interval, dann merkt man sehr gut, dass das System "stottert".

toms 14. Sep 2008 19:13

Re: Screenshots schnell erstellen???
 
Nebeinbei ein kleiner Optimierungsvorschlag:

Das Bitmap einmal erstellen und am Schluss frei geben.

romber 14. Sep 2008 20:25

Re: Screenshots schnell erstellen???
 
Danke für den Vorschlag! Wollte ich sowieso machen. Doch im vesentlichen hat sich nichts geändert.

Namenloser 14. Sep 2008 20:28

Re: Screenshots schnell erstellen???
 
Ich kann mir zwar nicht vorstellen, dass das viel zeit kostet, aber ggf. würde es auch Sinn machen, nur einmal das Handle zu ermitteln und dann zwischenzuspeichern.

brechi 15. Sep 2008 10:15

Re: Screenshots schnell erstellen???
 
Du solltest ein Screenshot in der Auflösung erstellen die du im Desktop eingestellt hast. Das macht bis zu einer halben Sekunde aus. Also statt pf24Bit -> pf32Bit. Desweiten soltlest du einfach Bitmap.Canvas.StretchDraw bzw Draw verwenden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:11 Uhr.

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