Ver Mensaje Individual
  #3 (permalink)  
Antiguo 05/01/2010, 13:29
Avatar de gnzsoloyo
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)