Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Teil einer Webbrowser-Ansicht als JPG speichern (https://www.delphipraxis.net/189138-teil-einer-webbrowser-ansicht-als-jpg-speichern.html)

idefix2 8. Mai 2016 16:35

Teil einer Webbrowser-Ansicht als JPG speichern
 
Hallo,
ich möchte das Videobild einer Ediview Webcam, das in einem Browser angezeigt wird, periodisch abtasten und für weitere Auswertungen verwenden.
In einer TWebbrowser-Komponente das Live-Bild anzuzeigen ist kein Problem. Aber ich habe nicht herausgefunden, wie ich von dem Live-Bild Screenshots generieren kann.
Ich habe mir vorgestellt, dass das einfach über den Canvas des Webbrowsers gehen müsste, aber TWebbrowser hat eine solche Property anscheinend nicht, jedenfalls habe ich nichts gefunden.

milos 8. Mai 2016 17:04

AW: Teil einer Webbrowser-Ansicht als JPG speichern
 
Hi,

Um was für ein System handelt es sich denn? Wäre es nicht möglich das Bild über über HTTP runterzuladen ohne das über den TWebBrowser zu machen? Ein weiterer Tipp wäre das ganze Formular zu screenshotten und dan das Live-Bild mit ein wenig Mathematik auszuschneiden.

Freundliche Grüsse

idefix2 8. Mai 2016 18:15

AW: Teil einer Webbrowser-Ansicht als JPG speichern
 
Es handelt sich um ein bewegtes Live-Bild von der Kamera, das via active-x dargestellt wird. Ich glaube nicht, dass sich da eine Momentaufnahme über HTTP herunterladen lässt.

Aber ein Screenshot vom ganzen Formular, das müsste gehen. Wie ich dann den Bereich herausschneide, der mich interessiert, weiss ich zwar noch nicht, weil ich so etwas bis jetzt noch nie gebraucht habe, aber das wird wohl lösbar sein, danke für den Tipp :)

milos 8. Mai 2016 18:49

AW: Teil einer Webbrowser-Ansicht als JPG speichern
 
Mit MSDN-Library durchsuchenBitBlt kannst du mit einer Zeile direkt einen Ausschnitt von deinem Form-Handle auf ein Bitmap ziechnen.
Dazu musst du im letzten Parameter der Funktion SRCCOPY übergeben.

Edit:
Hier ein paar mehr infos ^^

MSDN Link mit allen Parametern

Delphi-Quellcode:
BOOL BitBlt(
  _In_ HDC  hdcDest, // Handle auf welchem der Ausschnitt gezeichnet werden soll
  _In_ int  nXDest, // Start X-Koordinate auf dem End Bild (Wird wahrscheinlich 0 sein)
  _In_ int  nYDest, // Hier das selbe
  _In_ int  nWidth, // Breite des Ausschnitts
  _In_ int  nHeight, // Höhe des Ausschnitts
  _In_ HDC  hdcSrc, // Handle deines Formulars (self.Canvas.Handle)
  _In_ int  nXSrc, // Start X-Koordinate vom Ausschnitt auf deinem Formular
  _In_ int  nYSrc, // Das selbe für Y
  _In_ DWORD dwRop // "SRCCOPY"
);

idefix2 8. Mai 2016 19:58

AW: Teil einer Webbrowser-Ansicht als JPG speichern
 
Vielen Dank, so funktioniert es tatsächlich wunderbar und denkbar einfach :-D

idefix2 25. Mai 2016 11:32

AW: Teil einer Webbrowser-Ansicht als JPG speichern
 
Hallo,

leider gibt es jetzt doch noch ein Problem.
Ich war der Meinung, dass der Canvas ein "virtuelles" Zeichenbrett ist, auf dem die Komponente dargestellt wird. Offensichtlich ist dem aber nicht so, sondern der Canvas entspricht dem, was am Bildschirm aktuell dargestellt wird. Wird ein Teil meines Formlars von einem anderen Programm überdeckt, dann kopiert BitBlt nicht den "virtuellen" Inhalt meines Formulars, sondern das, was gerade am Bildschirm an der Stelle im Vordergrund angezeigt wird.

Gibt es eine Möglichkeit, auf das Bild zuzugreifen, das meine Form anzeigen würde, wenn sie im Vordergrund wäre? Wenn nicht, ist das sehr lästig, weil dann muss das Programm ja ständig im Vordergrund laufen.

milos 25. Mai 2016 12:06

AW: Teil einer Webbrowser-Ansicht als JPG speichern
 
Zitat:

Zitat von idefix2 (Beitrag 1338917)
Hallo,

leider gibt es jetzt doch noch ein Problem.
Ich war der Meinung, dass der Canvas ein "virtuelles" Zeichenbrett ist, auf dem die Komponente dargestellt wird. Offensichtlich ist dem aber nicht so, sondern der Canvas entspricht dem, was am Bildschirm aktuell dargestellt wird. Wird ein Teil meines Formlars von einem anderen Programm überdeckt, dann kopiert BitBlt nicht den "virtuellen" Inhalt meines Formulars, sondern das, was gerade am Bildschirm an der Stelle im Vordergrund angezeigt wird.

Gibt es eine Möglichkeit, auf das Bild zuzugreifen, das meine Form anzeigen würde, wenn sie im Vordergrund wäre? Wenn nicht, ist das sehr lästig, weil dann muss das Programm ja ständig im Vordergrund laufen.

Hmm also bei mir funktioniert es auch wenn ein Fenster drüber liegt, nur wenn man das Fenster explizit minimiert geht es nicht mehr.

Hier mein Testcode:

Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
var
  LBitmap : TBitmap;
begin
  LBitmap := TBitmap.Create();

  LBitmap.Width := WebBrowser1.Width;
  LBitmap.Height := WebBrowser1.Height;

  bitblt(LBitmap.canvas.Handle, 0, 0, Width,Height, self.canvas.handle, WebBrowser1.Left, WebBrowser1.Top, SRCCOPY);
  LBitmap.SaveToFile('./test.bmp');
  LBitmap.Free;
end;

procedure TForm1.Timer2Timer(Sender: TObject);
begin
  webbrowser1.Navigate('http://google.de/?q=' + IntToStr(Random(500)));
end;
Sind halt 2 Timer, der erste ruft BitBlt auf und speichert das Bitmap, der zweite ruft Googlesuchen mit Zahlen zwischen 0 und 500 auf um Veränderungen beim abspeichern sehen zu können.
Also wie gesagt, auch wenn 200 Fenster über dem TWebBrowser liegen funktioniert es ohne Probleme. :D

Freundliche Grüsse

Edit: Ansonsten könntest du versuchen das Fenster einfach ganz ausserhalb des Sichtbaren Bereichs zu verschieben? Also Quasi
Delphi-Quellcode:
Form.Left := -1000;
Das klappt bei mir nämlich auch.

idefix2 1. Jun 2016 12:32

AW: Teil einer Webbrowser-Ansicht als JPG speichern
 
Projekt endlich abgeschlossen.
Veranschlagt hatte ich 4 Stunden, geworden sind es etliche Tage.

Javascript ist eine einzige Katastrophe. Während ein snapshot eines normalen Delphiformulars, auch mit TWebbrowser, auch im Hintergrund funktioniert, gilt das nicht, wenn im Browser diese Java Applikation läuft. Ich frage mich, was für Schweinereien das Javascript da aufführt. Ist das Formular mit der Browserkomponente nicht im Vordergrund, dann wird das, was sich am Bidschirm im Vordergrund über der Komponente befindet, ins JPG kopiert, unabhängig vom übertragenen Bild. Schiebt man das Formular zur Seite, sodass das Bild teilweise nicht mehr am Schirm ist, dann ist der nicht am Schirm sichtbare Teil des Bildes im JPG eine weisse Fläche. Nachdem das Ganze auf einem Server instaliert ist, und zu den Zeiten, wo am Server selbst gearbeitet wird, dieses Programm nicht laufen muss, ist es mir und vor allem dem Kunden zum Glück egal. Wie man es lösen könnte, wenn das Programm im Hintergrund laufen soll, habe ich nicht herausgefunden.
Aber es kommt noch schlimmer. Wenn sich jemand per remote Desktop auf den Server verbindet, stört das das Programm nicht, es läuft am virtuellen Desktop weiter. Aber wenn man den remote Desktop wieder schliesst, erscheint am Server der Anmeldebildschirm, und das Javaskript stürzt komplett ab - derart, dass man es nur per Task Manager abschiessen kann, normal schliessen lässt es sich dann nicht. Um das zu umgehen, musste ich den Remote Desktop, mit dem der Kunde bisher auf seinen Server zugegriffen hat, durch VNC ersetzten. Damit funktioniert es.
Die letzte Hürde war noch Java Update, das musste ich auch noch deaktivieren, denn wenn sich das ungefragt gemeldet hat, ist das Javaskript, das das Video anzeigt, und damit mein Programm, ebenfalls komplett abgeschmiert.

pfffft...

nahpets 1. Jun 2016 13:09

AW: Teil einer Webbrowser-Ansicht als JPG speichern
 
Hallo,

ich bin jetzt mal ganz naiv:

Dein Programm läuft als Admin und Du meldest Dich per Remotedesktop als Admin an, dann bekommst Du Probleme. (Dergleichen natürlich auch, wenn es ein beliebiger, anderer User ist.)

Was ist denn, wenn Du für Deine Applikation einen eigenen Benutzer anlegst und unter diesem Benutzer läuft nur Deine Applikation und sonst nichts.

Der Benutzer müsste doch dann seinen eigenen Desktop, losgelöst von allem Anderen, was sich so auf dem Server tummelt, haben.

Ließe sich das eventuell einrichten und funktioniert das dann, ohne die von Dir beschriebenen Probleme?

idefix2 1. Jun 2016 21:43

AW: Teil einer Webbrowser-Ansicht als JPG speichern
 
Das könnte eine Lösung sein, werde ich noch ausprobieren. Ich weiss nicht, was passiert, wenn am Server ein User angemeldet ist und ein anderer User sich per remote desktop anmeldet - ob dann der Serverschirm auch schwarz wird und bei gleichzeitiger Abmeldung des aktuellen Users auf den virtuellen Desktop "übersiedelt", oder ob er normal weiter läuft und am remote Desktop ein komplett anderer Schirm gezeigt wird.

Im Prinzip läuft es jetzt so, dass der Kunde zufrieden ist, aber ob der Vorschlag funktioniert, möchte ich jetzt auch wissen. :)

idefix2 6. Jun 2016 13:46

AW: Teil einer Webbrowser-Ansicht als JPG speichern
 
@nahpets
Habe das jetzt auch ausprobiert - in dem Moment, wo sich ein anderer useranmeldet und das Programm dadurch den physischen Desktop verliert, ist es vorbei.

vagtler 6. Jun 2016 16:38

AW: Teil einer Webbrowser-Ansicht als JPG speichern
 
Zitat:

Zitat von idefix2 (Beitrag 1337760)
[...] via active-x [...]

Zitat:

Zitat von idefix2 (Beitrag 1339269)
[...] Javascript [...] im Browser diese Java Applikation [...]

Das sind jetzt drei verschiedene Technologien, die nichts miteinander zu tun haben. Was macht denn jetzt was bitteschön?

milos 6. Jun 2016 16:45

AW: Teil einer Webbrowser-Ansicht als JPG speichern
 
Zitat:

Zitat von vagtler (Beitrag 1339605)
Zitat:

Zitat von idefix2 (Beitrag 1337760)
[...] via active-x [...]

Zitat:

Zitat von idefix2 (Beitrag 1339269)
[...] Javascript [...] im Browser diese Java Applikation [...]

Das sind jetzt drei verschiedene Technologien, die nichts miteinander zu tun haben. Was macht denn jetzt was bitteschön?

Dachte ich mir auch :-D Solltest du das Bild über JavaScript bekommen, sollte es auch kein Problem sein dein Bild direkt in Delphi abzufangen. Ich nehme aber mal an (da du es ja gesagt hast) das irgendeine ActiveX Komponente über JavaScript angesprochen wird, da könnte es schwieriger werden.

Freundliche Grüsse

idefix2 6. Jun 2016 18:35

AW: Teil einer Webbrowser-Ansicht als JPG speichern
 
Active-x war Unsinn, sorry. Das Live-Bild wird im Browser mit Javascript dargestellt.

Wie ich so etwas direkt in Delphi abfangen könnte, dazu habe ich allerdings überhaupt eine Vorstellung. Das Skript wird offenbar vom Kameraserver geladen und empfängt dann den Videostream.

milos 6. Jun 2016 18:40

AW: Teil einer Webbrowser-Ansicht als JPG speichern
 
Zitat:

Zitat von idefix2 (Beitrag 1339618)
Active-x war Unsinn, sorry. Das Live-Bild wird im Browser mit Javascript dargestellt.

Wie ich so etwas direkt in Delphi abfangen könnte, dazu habe ich allerdings überhaupt eine Vorstellung. Das Skript wird offenbar vom Kameraserver geladen und empfängt dann den Videostream.

Da der JS Code frei einsehbar ist, könntest du das selbe in Delphi versuchen. Wir könnten dir dabei auch helfen, jedoch müssten wir dazu wissen um welches System es sich dabei handelt und bestenfalls auch den JS Code. Ich hab sowas ähnliches auch schon mal gemacht und war keine allzu grosse Sache.

Freundliche Grüsse

vagtler 6. Jun 2016 20:47

AW: Teil einer Webbrowser-Ansicht als JPG speichern
 
Zitat:

Zitat von idefix2 (Beitrag 1339618)
[...] Das Live-Bild wird im Browser mit Javascript dargestellt. [...]

Sicher? Du sprachst auch noch von einer Java-Applikation.

idefix2 7. Jun 2016 10:02

AW: Teil einer Webbrowser-Ansicht als JPG speichern
 
Nachdem ich etwas vergleichbares noch nicht gemacht habe, kann ich den Aufwand dafür schwer einschätzen. Ich bin davon ausgegangen, dass so ein Ansatz viel zu aufwändig sein würde und habe das gar nicht erst in Erwägung gezogen. Aber vielleicht ist es doch mit vertretbarem Aufwand realisierbar.

Ich habe jetzt mit dem Kunden gesprochen. Er ist jetzt im Prinzip mit seiner Lösung halbwegs zufrieden, auch wenn sie nicht ganz stabil ist und das Javaskript von Zeit zu Zeit abstürzt. Natürlich wäre ihm eine stabile Lösung lieber, aber allzuviel will er da nicht investieren. Ich werde versuchen, den Java Code herauszubekommen (habe ich auch noch nie gemacht, wird aber wohl irgendwie gehen), um abschätzen zu können, wieviel Arbeit das wäre. Melde mich dann wieder hier.

vagtler 7. Jun 2016 14:40

AW: Teil einer Webbrowser-Ansicht als JPG speichern
 
Zitat:

Zitat von idefix2 (Beitrag 1339644)
[...] das Javaskript von Zeit zu Zeit abstürzt. [...] Ich werde versuchen, den Java Code herauszubekommen [...]

Jetzt sprichst Du wieder von zwei Baustellen. JavaScript hat mit Java genauso viel zu tun wie mit Delphi - das sind vollkommen unterschiedliche Technologien.

milos 7. Jun 2016 14:53

AW: Teil einer Webbrowser-Ansicht als JPG speichern
 
Zitat:

Zitat von vagtler (Beitrag 1339680)
Zitat:

Zitat von idefix2 (Beitrag 1339644)
[...] das Javaskript von Zeit zu Zeit abstürzt. [...] Ich werde versuchen, den Java Code herauszubekommen [...]

Jetzt sprichst Du wieder von zwei Baustellen. JavaScript hat mit Java genauso viel zu tun wie mit Delphi - das sind vollkommen unterschiedliche Technologien.

Jep, kann erstmal ein wenig verwirren wenn man damit noch nie was am Hut hatte. :wink:
Aber wenn man es erstmal weiss... dann weiss man es :D

Freundliche Grüsse

idefix2 9. Jun 2016 08:56

AW: Teil einer Webbrowser-Ansicht als JPG speichern
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ok, ich gelobe, dass ich in diesem Forum nie mehr kurz Java schreiben werden, wenn ich Javascript meine. :-D

Ich hatte bisher mit Javascript nichts und mit Webseitenprogrammierung sehr wenig am Hut, irgendwann vor Jahren habe ich ein einziges mal für eine Seite einer bekannten ein einfaches PHP Skript programmiert. Bei dem, was da passiert, blicke ich überhaupt nicht durch, da sind zwar die Routinen zum Erkennen der Browserversion und zum Skalieren des Bildbereichs, aber ich sehe nicht, wo die eigentliche Datenübertragung und die Bildanzeige erfolgt. Ich habe jetzt den ganzen Quelltext der Seite einmal hier hochgeladen.

milos 9. Jun 2016 09:51

AW: Teil einer Webbrowser-Ansicht als JPG speichern
 
Ich habe den Code gerade nur schnell überflogen und kann ihn mir erst gegen Abend genauer ansehen aber es sieht ganz danach aus als würde das Script sich das Live Bild über ein HTTP Request von einem ASP.NET (?) script holen. Leider funktioniert das bei mir natürlich nicht sodass ich so auf die schnelle auch nicht viel testen kann, aber versuche mal die ressourcen nach dem Live Bild abzusuchen. Ausserdem sehe ich das in der Tat ActiveX im Spiel ist, jedoch wird das Objekt "htmlfile", also vermutlich nichts mit dem holen der Bilder zu tun hat.

Um welches Modell handelt es sich?
Ich hab hier vielleicht DIE Lösung für dich ;)
https://www.ispyconnect.com/man.aspx?n=Edimax#

Da kannst du vielleicht die URL generieren lassen die dein Modell von Edimax zum übertragen der Bilder benötigt. Es könnte eine mit "Snapshot.jpg" sein mit dem Benutzernamen und Passwort so wie ich das im Source Code überflogen habe. Versuchs mal, bin gespannt ob es klappt :)

Freundliche Grüsse

Edit: Könnte auch snapshot.cgi sein.

idefix2 11. Jun 2016 14:33

AW: Teil einer Webbrowser-Ansicht als JPG speichern
 
Der Anwender hat sich jetzt in den Urlaub verabschiedet, blöderweise habe ich bis zu seiner Rückkehr keinen Zugriff mehr auf seine Kamera. Aus irgendeinem Grund funktioniert auch die Kameraverbindug zur Cloud nicht (viel ist da in der Kamera nicht zu konfigurieren und das ist sicher richtig), ich bekomme zwar das Bild über die lokale IP-Adresse, aber wenn ich im Browser die Cloud-Adresse eingebe, zeigt er an: connecting to Camera, d.h. der Browser findet die Kamera an der Adresse (sonst kommt eine andere Fehlermeldung) und bleibt dann hängen. Habe es mit verschiedenen Browsern probiert, es ist überall das gleiche.

Wenn er zurückkommt, wird der Kunde mir sagen, ob er überhaupt gewillt ist, noch etwas in eine grössere Stabilität des Systems zu investieren, oder ob es ihm so genügt, wie es jetzt läuft - mit ca. einem Absturz des Javascripts jeden zweiten Tag.

Zitat:

Zitat von milos (Beitrag 1339816)
Um welches Modell handelt es sich?
Ich hab hier vielleicht DIE Lösung für dich ;)
https://www.ispyconnect.com/man.aspx?n=Edimax#

Wenn ich das richtig verstehe, würde ich so direkt zu einem JPG-Bid statt des bewegten Bildes kommen. Wenn das funktioniert, dann wäre das eine sehr einfache Lösung. Kann aber auch das erst ausprobieren, wenn er aus dem Urlaub zurück ist.

Einstweilen danke für die HIlfe bis hierher :)

DelphiFan2008 13. Jun 2016 22:10

AW: Teil einer Webbrowser-Ansicht als JPG speichern
 
Hallo,

habe diese Variante in einem eigenen Programm verwendet um ein Bitmap aus WebBrowser zu erzeugen

Delphi-Quellcode:
procedure WebBrowserScreenShot( const wb:TWebBrowser; Bitmap:TBitmap );
var viewObject : IViewObject;
    r         : TRect;
begin
  if wb.Document <> nil then
  begin
    wb.Document.QueryInterface( IViewObject,viewObject );
    if Assigned( viewObject )then
    try
      r := Rect( 0,0,wb.Width,wb.Height );

      Bitmap.Height := wb.Height;
      Bitmap.Width := wb.Width;

      viewObject.Draw( DVASPECT_CONTENT,1,nil,nil,Application.Handle,Bitmap.Canvas.Handle,@r,nil,nil,0 );

    finally
      viewObject._Release;
    end;
  end;
end;

idefix2 3. Jul 2016 14:20

AW: Teil einer Webbrowser-Ansicht als JPG speichern
 
Das ist tatsächlich die Lösung!

Der Kunde ist wieder zurück. Ich habe auf der verlinkten Seite den richtigen Kameratyp gefunden und steuere die Kamera jetzt direkt ohne das instabile Javascript an, um statt eines Videostreams nur eine Momentaufnahme abzurufen. Das funktioniert problemlos, und ich gehe davon aus, dass das auch sonst stabil sein wird.

Vielen Dank, auch an Delphifan, auch wenn ich das jetzt nicht mehr brauchen werde.

P.S. Weil ich es wissen wollte, habe ich noch einmal die komplette, gar nicht so dünne Dokumentation der Kamera gecheckt. Nirgends findet sich der leiseste Hinweis auf diese Köglichkeit, ein Standbild aufzurufen. :twisted:

himitsu 4. Jul 2016 09:48

AW: Teil einer Webbrowser-Ansicht als JPG speichern
 
Zitat:

Zitat von idefix2 (Beitrag 1341836)
P.S. Weil ich es wissen wollte, habe ich noch einmal die komplette, gar nicht so dünne Dokumentation der Kamera gecheckt. Nirgends findet sich der leiseste Hinweis auf diese Köglichkeit, ein Standbild aufzurufen. :twisted:

Das stimmt so nicht ganz.
Laut Webseite unterstützen deren Kameras H.264 und MJPEG.

Und MJPEG (Motion-JPEG) besteht aus vielen "einzelnen" hintereinander liegendenden JPEGs, also ganz vielen Standbildern. :angle:
Also im Prinzip kann man den MJPEG-Stream abfragen und hört einfach nach dem ersten Bild/Frame auf zu lesen.

idefix2 4. Jul 2016 15:58

AW: Teil einer Webbrowser-Ansicht als JPG speichern
 
Dass man mit entsprechendem Aufwand m Prinzip alles mögliche kann, ist unbestritten. Aber einen Hinweis darauf, dass es eine URL gibt (und wie die URL aussieht), die ohne weitere Kopfstände direkt ein JPG im Browser anzeigt, ist der Dokumentation zur Kamera nicht zu entnehmen. Möglich, dass Hinweise irgendwo auf der Website von Edikom versteckt sind, aber normalerweise sollte man erwarten, dass so etwas in der Dokumentation steht, wenn die Kamera es kann - vor allem, wenn die Dokumentation ein gut 30-seitiges Heftchen ist, in der sonst alles rund um die Konfiguration der Kamera minutiös beschrieben wird.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:15 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