Capturas de pantalla

Descripción general

Dos pequeñas funciones (escritas en Visual Basic .NET) que permiten capturar imágenes del monitor del ordenador

[TOC] Tabla de Contenidos


↑↑↑

Capturas de pantalla

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.


↑↑↑

Capturar la imagen de toda la pantalla

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

↑↑↑

Capturar la imagen de un formulario

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

↑↑↑

Mostrar imágenes en 'Paint'

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

↑↑↑

A.2.Enlaces

[Para saber mas]
[Grupo de documentos]
[Documento Index]
[Documento Start]
[Imprimir el Documento]
© 1997 - - La Güeb de Joaquín
Joaquín Medina Serrano
Ésta página es española

Codificación
Fecha de creación
Última actualización
[HTML5 Desarrollado con CSS3 / usando CSS3 y Semantica]