Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Desarrollo en Delphi para Android (https://www.clubdelphi.com/foros/forumdisplay.php?f=57)
-   -   TWebBrowser.CaptureBitmap No funciona. (https://www.clubdelphi.com/foros/showthread.php?t=93447)

jhonalone 30-09-2018 22:45:46

TWebBrowser.CaptureBitmap No funciona.
 
Hola a todos.
Otro problema que seguro nadie más que yo ha tenido. La función del título no me funciona.

Seguro que es por que no sé hacerlo.

Bueno. Os cuento:
Código Delphi [-]
Imagen := TImage.Create(Self);
 //Imagen.Bitmap := WebBrowser1.CaptureBitmap;
 if Imagen.BitMap <> nil
 then  begin
         ShowMessage(WebBrowser1.Canvas.Height.ToString);
         ShowMessage(Imagen.Bitmap.Height.ToString);
       end;

Con este código, Imagen.Bitmap no es nill y ambos mensajes retornan CERO.


Otra prueba:
Código Delphi [-]
 Imagen := TImage.Create(Self);
 Imagen.Bitmap := WebBrowser1.CaptureBitmap;
 if Imagen.BitMap <> nil
 then  begin
         ShowMessage(WebBrowser1.Canvas.Height.ToString);
         ShowMessage(Imagen.Bitmap.Height.ToString);
       end;

Qué curioso, los dos mensajes retornan CERO.

Tres cosas me quedan claras después de estas pruebas:

1.- Imagen.BitMap, nunca es Nill, no importa si le asignamos el mapa de bits o no.

2.- Que seguramente debe haber algún truco, que yo no conozco, para que esto funcione.

3.- Si nadie se ha quejado de ello. No en la búsqueda de Google, ni en en este foro, ni en el foro de ayuda de Embarcadero es que el INÚTIL SOY YO. ( O nadie lo ha usado)

Por favor si alguien lo ha usado con éxito, que tenga la caridad de decirme cómo se hace.

Gracias de antemano. Y perdón por haberme metido en otro marrón más.

Saludos.

dec 01-10-2018 10:03:28

Hola a todos,

Yo probaría a usar un objeto "TBitmap" en lugar de un objeto "TImage", para empezar. Igual es absurdo, pero, probaría a ver. Por otro lado, comprobaría que el código funciona como se espera en otra plataforma, como pueda ser Windows. Si esto último funciona como se espera, tal vez la captura de la pantalla en Android requiera de algún permiso que la app no tiene.

P.D. Veo que tratas de capturar una imagen de un objeto "TWebBrowser"... ¿estás seguro de que el documento del mismo se ha cargado completamente antes de tratar de capturar una imagen? Supongo que sí, pero, tal vez deberías comprobarlo, puesto que, un documento "no completamente cargado" puede acaso no proporcionar la imagen que se espera.

dec 01-10-2018 10:25:02

Hola a todos,

He querido probar yo mismo esto usando un TBitmap en lugar de un TImage: funciona en ambos casos como se espera, al menos en Windows. Me tiro a pensar que es una cuestión de permisos... aunque arriba dije que igual estos eran necesarios para capturar la pantalla en Android... ¡pero es que se está tratando de capturar una imagen de un objeto "TWebBrowser" y no la pantalla! En fin, que, probado en Windows y viendo que funciona... lo cierto es que habría que ver porqué no lo hace como se espera en Android.

P.D. Curiosamente, si capturamos la imagen de un "TWebBrowser" vacío, se obtiene el resultado que mencionas de que "Bitmap.Height = 0". Luego insisto en asegurarse de que el documento del "TWebBrowser" ha terminado de cargarse, antes de intentar la captura.

jhonalone 01-10-2018 18:45:29

Muchas gracias. Dec.

Con TBitMap ya lo había probado. Con el mismo resultado.

Voy a ver cómo resuelvo lo de la carga de la página.

Inmediatamente antes tengo este código. Después se muestra la página cuando la solicito.

Código Delphi [-]
 WebBrowser1.Navigate('file://'+TPath.Combine(TPath.GetDocumentsPath, 'Pagina.htm'));
Sleep(5000);

Puede que no le haya dado tiempo de cargarla... Lo había pensado y había puesto el sleep por ése motivo.

Ahora acabo de probar lo siguiente:

Código Delphi [-]
procedure TForm1.WebBrowser1DidFinishLoad(ASender: TObject);
begin
  Imagen := TImage.Create(Self);
 Imagen.Bitmap := WebBrowser1.CaptureBitmap;
 if Imagen.BitMap <> nil
 then  begin
         ShowMessage(WebBrowser1.Canvas.Height.ToString);
         ShowMessage(Imagen.Bitmap.Height.ToString);
       end;
end;

Con idéntico resultado.

Gracias por tus observaciones y por confirmarme que en Windows funciona.

Voy a intentarlo con los permisos, que no se me había ocurrido.

Saludos cordiales.

jhonalone 01-10-2018 19:06:45

Hola, de nuevo.

No se me ocurre, qué permiso o permisos tengo que activar.

Probando esto:
Código Delphi [-]
procedure TForm1.WebBrowser1DidFinishLoad(ASender: TObject);
begin
 BitMap := TBitMap.Create;
 Bitmap := WebBrowser1.CaptureBitmap;
 if BitMap <> nil
 then  begin
         ShowMessage(WebBrowser1.Height.ToString);
         ShowMessage(Bitmap.Height.ToString);
       end;
end;

el resultado es que no emite ningún mensaje. Lo que está claro es que BitMap es nil. O sea, que no lo carga.

Saludos.

jhonalone 01-10-2018 20:43:39

Hola.

Parece ser que no lo hace hasta que está visible la pantalla.

Pero no me sirve, pues la altura que me da es la altura en pixeles de la pantalla. No parece que capture toda la página web, sino la parte que está visible solamente.

Lo que yo necesito es la altura total de la página web. La de la pantalla ya la sé.

Saludos.

dec 02-10-2018 13:11:57

Hola a todos,

Cita:

Empezado por jhonalone (Mensaje 528734)
Hola.

Parece ser que no lo hace hasta que está visible la pantalla.

Pero no me sirve, pues la altura que me da es la altura en pixeles de la pantalla. No parece que capture toda la página web, sino la parte que está visible solamente.

Lo que yo necesito es la altura total de la página web. La de la pantalla ya la sé.

Saludos.

¿Pero al final conseguiste tomar la captura del navegador, no es cierto? Otra cosa es, en efecto, que la imagen que se obtiene no es la imagen completa de la página web, sino de la parte visible en el control "TWebBrowser". Realmente, no sé hasta qué punto sería posible conseguir lo que quieres, puesto que hay servicios de terceros que proporcionan algo así...

jhonalone 03-10-2018 16:31:52

Hola dec.

No he llegado a comprobar que la imagen era la esperada. Cuando he visto que no me daba CERO la altura del bitmap, y me estaba diciendo que no era nil, he supuesto que la imagen era la que aparecía en pantalla, puesto que antes de aparecer en pantalla siempre me daba CERO.

Saludos y gracias. Buscaré la manera de conseguir la altura del WebBrowser por otro camino. A ver si lo consigo. Me interesa la altura para adaptar la posición de la página a los distintos terminales y configuraciones.

dec 03-10-2018 17:26:45

Hola a todos,

Cita:

Empezado por jhonalone (Mensaje 528768)
Saludos y gracias. Buscaré la manera de conseguir la altura del WebBrowser por otro camino. A ver si lo consigo. Me interesa la altura para adaptar la posición de la página a los distintos terminales y configuraciones.

Pero... si lo que necesitas es conocer la altura del "TWebBrowser", ¿no te valdría con la propiedad "Height" de este? :confused:

jhonalone 04-10-2018 11:54:50

Gracias por tu interés, David.

Es lo primero que intenté, pero la altura obtenida es la altura física en la pantalla del componente WebBrowser, y lo que yo necesito es la altura en pixeles del documento (página) contenido en el WebBrowser, es decir lo que se ve en la pantalla y lo que no se ve. Esto lo necesito para crear una función que equipare la sección visible en cada dispositivo, compensando así las distintas configuraciones.

Saludos.


La franja horaria es GMT +2. Ahora son las 07:32:32.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi