Foros del Web » Programación para mayores de 30 ;) » .NET »

Convertir un control WebBrowser y su contenido en BMP

Estas en el tema de Convertir un control WebBrowser y su contenido en BMP en el foro de .NET en Foros del Web. Tengo una aplicación de escritorio creada en VB.Net, con Visual Studio 2007 y .Net 1.1. Por restricciones definidas en el proyecto no puedo cambiar de ...
  #1 (permalink)  
Antiguo 24/12/2009, 06:42
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Exclamación Convertir un control WebBrowser y su contenido en BMP

Tengo una aplicación de escritorio creada en VB.Net, con Visual Studio 2007 y .Net 1.1. Por restricciones definidas en el proyecto no puedo cambiar de versión ni en el Visual Studio ni en el Lenguaje.

El problema es que tres formularios de la aplicación usan un control WebBrowser para visualizar mapas de Google Maps y se necesita generar archivos de imagen (BMP, JPG, PNG, etc.) con el mapa representado en un momento dado, y no puede ser esto realizado por medio de JavaScript en la página cargada, ya que los usuarios no pueden habilitar el uso de Activex en la aplicación.

Evidentemente mi solución sería ya sea rasterizar el control o usar cualquier recurso que me permita transformar la página cargada y todo lo que contiene en un BMP.

Los códigos y ejemplos que tengo requieren .Net 2.0, lo cual hace que no los pueda usar, o bien Visual Studio 2005, que tampoco puedo usar.

Tampoco he podido usar la captura de pantalla completa (que he usado en otros puntos), porque la pantalla completa no debe salir en la imagen, ya que el mapa representa menos de 1/4 de ella. De modo que esa forma no es una opción válida.
Existe alguna forma de lograr lo que necesito, sea como .DLL, .OCX, o sólo código ?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #2 (permalink)  
Antiguo 24/12/2009, 15:54
Avatar de seba123neo  
Fecha de Ingreso: febrero-2007
Ubicación: Esperanza, Santa Fe
Mensajes: 1.046
Antigüedad: 17 años, 9 meses
Puntos: 19
Respuesta: Convertir un control WebBrowser y su contenido en BMP

Hola, la verdad que feo no poder cambiar de versión y actualizarte a la ultima.pero ningun ejemplo te funciona? por ejemplo vi que el webbrowser tiene un metodo llamado DrawToBitmap pero dicen que esta funcion no esta soportada y que no funciona en algunas paginas dependiendo del javascript.viendo un poco mas me encontre con un ejemplo que funciona muy bien, lo hace con la api BitBtl, lo arme porque no venia con la api.

Código vbnet:
Ver original
  1. Public Class Form1
  2.  
  3.     Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Integer, ByVal X As Integer, ByVal Y As Integer, ByVal nWidth As Integer, ByVal nHeight As Integer, ByVal hSrcDC As Integer, ByVal xSrc As Integer, ByVal ySrc As Integer, ByVal dwRop As Integer) As Integer
  4.  
  5.     Public Enum TernaryRasterOperations
  6.         SRCCOPY = &HCC0020
  7.         SRCPAINT = &HEE0086
  8.         SRCAND = &H8800C6
  9.         SRCINVERT = &H660046
  10.         SRCERASE = &H440328
  11.         NOTSRCCOPY = &H330008
  12.         NOTSRCERASE = &H1100A6
  13.         MERGECOPY = &HC000CA
  14.         MERGEPAINT = &HBB0226
  15.         PATCOPY = &HF00021
  16.         PATPAINT = &HFB0A09
  17.         PATINVERT = &H5A0049
  18.         DSTINVERT = &H550009
  19.         BLACKNESS = &H42
  20.         WHITENESS = &HFF0062
  21.     End Enum
  22.  
  23.     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  24.         WebBrowser1.Navigate("http://www.google.com.ar")
  25.     End Sub
  26.  
  27.     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  28.         Dim srcGraphics As Graphics = WebBrowser1.CreateGraphics
  29.         Try
  30.             Dim destGraphics As Graphics = PictureBox1.CreateGraphics
  31.             Try
  32.                 Dim hdcDest As IntPtr = destGraphics.GetHdc
  33.                 Dim hdcSrc As IntPtr = srcGraphics.GetHdc
  34.                 BitBlt(hdcDest, 0, 0, WebBrowser1.ClientRectangle.Width, WebBrowser1.ClientRectangle.Height, hdcSrc, 0, 0, CType(TernaryRasterOperations.SRCCOPY, Integer))
  35.                 srcGraphics.ReleaseHdc(hdcSrc)
  36.                 destGraphics.ReleaseHdc(hdcDest)
  37.             Finally
  38.                 CType(destGraphics, IDisposable).Dispose()
  39.             End Try
  40.         Finally
  41.             CType(srcGraphics, IDisposable).Dispose()
  42.         End Try
  43.     End Sub
  44. End Class

ojala te funcione con el framework 1.1

saludos.
__________________
" Todos Somos Ignorantes; lo que pasa es que no todos ignoramos las mismas cosas " - Albert Einstein
  #3 (permalink)  
Antiguo 05/01/2010, 13:29
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Convertir un control WebBrowser y su contenido en BMP

bien. fINALMENTE y luego de leer detalladamente la documentación de Google Maps, me encontré con que mi solución (al menos la mayor parte de ella) ya estaba implementada por GM en uno de los servicios que provee: Statics Maps.
Me explico:
Mi problema es que ciertos formularios que usamos en la aplicación muestran el paso de uno o más vehículos por zonas predefinidas del usuario, las cuales luego deben ser puestas en documentos de Excel, Word, .PDF, etc. Para ello una de las formas más simples es capturar la pantalla y pegarla como bitmap en esos documentos.
Pero el inconveniente se presenta cuando los formularios en cuestión sólo representan el mapa en un segmento pequeño del formulario, y no se requiere que el resto del Form esté en documento (sería imagen - basura). En ese caso lo que deseábamos era capturar sólo el control y su contenido. Nada más.
Hubiera podido implementar ese tipo de funcionalidades si pudiese usar versiones uperiores del Visual Studio... pero por requerimientos de la empresa sólo puedo usar Visual Studio 2003 y por ende, .Net 1.1 y nada más.
Entonces, la semana pasada loguré encontrar esta documentación: Guía para programadores del API de Google Static Maps
Era exactamente lo que necesitaba. Leugo de algunas pruebas y ajustes, el método quedó así:
Código vb.net:
Ver original
  1. Public Function GoogleImagePath(ByVal oMarkers As String, ByVal vPath As String, ByVal vCenter As String, ByVal vFile As String, ByVal vZoom As Integer, ByVal vMap As Integer) As Boolean
  2.         ' ------------------------------------------------------------------
  3.         Dim inf As Integer
  4.         Dim vMapType As String = ""
  5.         If vMap = 2 Then
  6.             vMapType = "maptype=hybrid&"
  7.         End If
  8.         inf = nfi.NumberDecimalDigits
  9.         nfi.NumberDecimalDigits = 15
  10.         ' ------------------------------------------------------------------
  11.         ' Cada par LatLng en Path y Markers deben venir separados por pipes (|)
  12.         ' ------------------------------------------------------------------
  13.         Try
  14.             Dim i As Image
  15.             oReq = "http://maps.google.com/maps/api/staticmap?center=" & vCenter & "&zoom=14&format=png32&markers=" & oMarkers & "&path=" & vPath & "&size=640x420&sensor=false&" & vMapType & "key=" & oKey & "&hl=es"
  16.             request = WebRequest.Create(oReq)
  17.             request.Credentials = CredentialCache.DefaultCredentials
  18.             CType(request, HttpWebRequest).UserAgent = ".NET Framework Example Client"
  19.             dataStream = request.GetResponse().GetResponseStream
  20.             i = New System.Drawing.Bitmap(dataStream)
  21.             i.Save(vFile & ".png", System.Drawing.Imaging.ImageFormat.Png)
  22.             dataStream.Close()
  23.             ' ------------------------------------------------------------------
  24.             nfi.NumberDecimalDigits = inf
  25.             ' ------------------------------------------------------------------
  26.         Catch ex As Exception
  27.             oLogWriter.Escribir("Excepción en GoogleImagePath()" & vbNewLine & ex.Message & vbNewLine & ex.StackTrace.ToString)
  28.             If Not dataStream Is Nothing Then
  29.                 dataStream.Close()
  30.             End If
  31.             Return False
  32.         End Try
  33.         Return True
  34.     End Function

Este método recibe:
oMarkers: los marcadores a representar
vPath: la ruta recorrida como secuencia de pares LatLng,
vCenter: centro del mapa
vFile: Nombre del archivo a grabar
vZoom: nivel de zoom
vMap: parámetro para definir si se usará el mapa de calles o el híbrido
oKey: Es una variable global donde guardamos la Api Key de Google Maps.
nfi: Es una variable de tipo CultureInfo que se usa para manejar el formateo de datos numéricos a "en-US".
Además,lleva una variable Friend denominada oLogWriter que es una clase creada para manejar un log de errores que me permite trazar los problemas en el programa sin que se interrumpa.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #4 (permalink)  
Antiguo 22/06/2010, 11:02
 
Fecha de Ingreso: junio-2010
Mensajes: 1
Antigüedad: 14 años, 5 meses
Puntos: 0
Respuesta: Convertir un control WebBrowser y su contenido en BMP

Hola, interesante el codigo pero estaba intentando guardar el bitmap en la propiedad Image del picture box yno lo logro conseguir, soy nuevo en vb.net, aqui les paso el codigo, espero me puedan ayudar.

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnImprimir.Click, btnCapturar.Click
Dim srcGraphics As Graphics = WebBrowser1.CreateGraphics
Try
Dim destGraphics As Graphics = PictureBox1.CreateGraphics
Dim bmpSource As New Bitmap(PictureBox1.Width, PictureBox1.Height, destGraphics)
bmpSource.Save("Image.bmp", System.Drawing.Imaging.ImageFormat.Bmp)
Try
Dim hdcDest As IntPtr = destGraphics.GetHdc
Dim hdcSrc As IntPtr = srcGraphics.GetHdc
BitBlt(hdcDest, 0, 0, WebBrowser1.ClientRectangle.Width, WebBrowser1.ClientRectangle.Height, hdcSrc, 0, 0, CType(TernaryRasterOperations.SRCCOPY, Integer))
srcGraphics.ReleaseHdc(hdcSrc)
destGraphics.ReleaseHdc(hdcDest)
PictureBox1.Image = bmpSource.Clone()
Finally
CType(destGraphics, IDisposable).Dispose()
End Try
Finally
CType(srcGraphics, IDisposable).Dispose()
End Try
End Sub
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:26.