Dos pequeñas funciones (escritas en Visual Basic .NET) que permiten capturar imágenes del monitor del ordenador
A continuación se muestran dos funciones que permiten realizar capturas de pantalla desde código
Una de las posibles aplicaciones es incluir la imagen capturada, en los mensajes de error que se envían al programador, para ver cuál era la pantalla que estaba usando y que datos había en ella.
El código que se muestra a continuación permite realizar una captura de pantalla completa algo parecido a hacer una foto de toda la pantalla.
''' <summary> ''' Captura en un [BitMap] toda la pantalla ''' </summary> ''' <returns> ''' <para> Tipo <see cref="System.Drawing.Bitmap">System.Drawing.Bitmap</see></para> ''' <para> El objeto [Bitmap] que contiene la imagen</para> ''' </returns> ''' <remarks>Hace una 'foto' de toda la pantalla</remarks> Public Shared Function TodaLaPantalla() As System.Drawing.Bitmap ' El objeto Graphics (Encapsula una superficie de dibujo de GDI+.) Dim graph As Graphics = Nothing ' El bitmap donde se guarda la imagen Dim bmp As Bitmap = Nothing Try 'Inicializa una nueva instancia de la clase Bitmap con el tamaño especificado. bmp = New Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height) ' El objeto Graphics (Encapsula una superficie de dibujo de GDI+.) graph = Graphics.FromImage(bmp) ' Realiza una transferencia de bloque de bits de los datos de color, ' correspondientes a un rectángulo de píxeles, desde la pantalla ' a la superficie de dibujo de Graphics. graph.CopyFromScreen(0, 0, 0, 0, bmp.Size) Return bmp Catch ex As Exception Throw Finally ''--------------------------------------- '' Bug '' bmp no puedo dispose porque entonces '' la funcion devuele nothing siempre ''--------------------------------------- 'If Not (bmp Is Nothing) Then ' bmp.Dispose() ' bmp = Nothing 'End If If Not (graph Is Nothing) Then graph.Dispose() graph = Nothing End If End Try End Function
También hay otro código que lo que hace es capturar en una imagen un formulario y solo ese formulario
''' <summary> ''' Captura en pantalla la imagen del formulario pasado por parametro ''' </summary> ''' <param name="unFormulario"> ''' <para> Tipo <see cref="System.Windows.Forms.Form">System.Windows.Forms.Form</see></para> ''' <para> El objeto [Form] del que se sacara una imagen</para> ''' </param> ''' <returns> ''' <para> Tipo <see cref="System.Drawing.Bitmap">System.Drawing.Bitmap</see></para> ''' <para> El objeto [Bitmap] que contiene la imagen</para> ''' </returns> ''' <remarks>Hace una 'foto' unicamente del formulario</remarks> Public Shared Function SoloElFormulario(ByVal unFormulario As System.Windows.Forms.Form) As System.Drawing.Bitmap '------------------------------- 'Control de parametros If unFormulario Is Nothing Then Throw New ArgumentNullException("unFormulario", "unFormulario es nothing.") End If If unFormulario.WindowState = FormWindowState.Minimized Then Throw New ArgumentException( _ "No se puede obtener una imagen de un formulario 'minimizado'", "unFormulario") End If ' /Eof ------------------------------- ' El objeto Graphics (Encapsula una superficie de dibujo de GDI+.) Dim graph As Graphics = Nothing ' El bitmap donde se guarda la imagen Dim bmp As Bitmap = Nothing Try ' Obtiene la coordenada superior izquierda del formulario Dim frmleft As System.Drawing.Point = unFormulario.Bounds.Location '-------------------------- ' Esta instruccion comentada crea un Bitmap con el tamaño de TODA la pantalla ' bmp = New Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height) ' Inicializa una nueva instancia de la clase Bitmap con el tamaño especificado. ' Crea un Bitmap del tamaño del formulario ' Añadimos 8 pixel al ancho y al alto del rectangulo que se captura bmp = New Bitmap(unFormulario.Bounds.Width + 8, unFormulario.Bounds.Height + 8) ' El objeto Graphics (Encapsula una superficie de dibujo de GDI+.) graph = Graphics.FromImage(bmp) ' Obtiene la coordenadas x, y del punto de partida que es ' la esquina superior izquierda del oformulario que se va a capturar Dim screenx As Integer = frmleft.X Dim screeny As Integer = frmleft.Y ' El - 5 aquí permite capturar cinco pixeles mas de la parte ' superior e izquierda (por fuera) del formulario graph.CopyFromScreen(screenx - 5, screeny - 5, 0, 0, bmp.Size) Return bmp Catch ex As Exception Throw Finally ''--------------------------------------- '' Bug '' bmp no puedo dispose porque entonces '' la funcion devuele nothing siempre ''--------------------------------------- 'If Not (bmp Is Nothing) Then ' bmp.Dispose() ' bmp = Nothing 'End If If Not (graph Is Nothing) Then graph.Dispose() graph = Nothing End If End Try End Function
Por último una función (bueno en realidad dos) para mostrar imágenes (capturadas o no) en el programa 'Paint'
''' <summary> ''' Muestra una 'imagen' en el programa 'Paint' ''' </summary> ''' <param name="imagen"> ''' <para> Tipo <see cref="System.Drawing.Bitmap">System.Drawing.Bitmap</see></para> ''' <para> El objeto [Bitmap] que contiene la imagen</para> ''' </param> ''' <remarks> ''' Para mostrar la imagen hay que grabarla previamente en el disco, ''' y para ello se usa un fichero temporal generado por el sistema. ''' Una vez usado, el fiochero se borra ''' </remarks> Public Shared Sub MostarBitmapToPaint(ByVal imagen As System.Drawing.Bitmap) '------------------------------- 'Control de parametros If imagen Is Nothing Then Throw New ArgumentNullException("imagen", "imagen es nothing.") End If ' /Eof ------------------------------- ' El nombre de fichero para guardar la imagen Dim nombreFicheroImagen As IO.FileInfo = Nothing Try '------------------- nombreFicheroImagen = New IO.FileInfo(IO.Path.GetTempFileName) '------------------- ' guardar el Bitmap en un fichero imagen.Save(nombreFicheroImagen.FullName) '--------------- ' mostar el fichero en el programa 'Paint' ' llamar al proceso que muesta en el 'Paint' una imagen guardada en el disco Call MostarBitmapToPaint(nombreFicheroImagen) '---------------------------------------- ' problema, ' Hay que esperar un poco antes de borrar ' el fichero, porque si no, el programa 'Paint' no tiene ' tiempo de cargarlo completo y se produce un error '---------------------------------------- ' Esperar dos segundos ' Añadirle la diferencia a la hora actual Dim tFinal As DateTime = DateTime.Now.AddSeconds(2) ' Mientras no haya pasado el tiempo indicado Do ' Un respiro para el sistema System.Windows.Forms.Application.DoEvents() Loop While (DateTime.Now < tFinal) Catch ex As Exception Throw Finally ' borrar el fichero provisional nombreFicheroImagen.Delete() ' destruir el objeto FileInfo nombreFicheroImagen = Nothing End Try End Sub ''' <summary> ''' Muestra una 'imagen' en el programa 'Paint' ''' </summary> ''' <param name="nombreFicheroImagen"> ''' <para> Tipo <see cref="System.IO.FileInfo">System.IO.FileInfo</see></para> ''' <para> El objeto [IO.FileInfo] que contiene el nombre de fichero ''' donde esta guardada la imagen en el disco</para> ''' </param> Public Shared Sub MostarBitmapToPaint(ByVal nombreFicheroImagen As IO.FileInfo) '------------------------------- 'Control de parametros If nombreFicheroImagen Is Nothing Then Throw New ArgumentNullException("nombreFicheroImagen", "el nombre de fichero es nothing.") End If If nombreFicheroImagen.Exists = False Then Throw New System.IO.FileNotFoundException( _ "La imagen no existe en el disco.", nombreFicheroImagen.FullName) End If ' /Eof ------------------------------- Try '--------------- ' mostar el fichero en el programa 'Paint' Process.Start("mspaint.exe", nombreFicheroImagen.FullName) Catch ex As Exception Throw End Try End Sub
© 1997 - - La Güeb de Joaquín | |||||
Joaquín Medina Serrano
|
|||||
|
Codificación | |
Fecha de creación | |
Última actualización | |
![]() |