Kayak Nerja - rutas en piragua por los acantilados de Nerja y Maro
Kayak Nerja - rutas en piragua por los acantilados de Nerja y Maro 



Donativo para el sitio de elGuille

Buscar en Google y en elGuille.info:
Búsqueda personalizada

Capturar el contenido del formulario actual o de toda la pantalla

 
Publicado el 31/Ago/2007
Actualizado el 31/Ago/2007
Autor: Guillermo 'guille' Som

Código de ejemplo (para Visual Basic y C#) de cómo capturar el contenido del formulario actual y de toda la pantalla. También cómo usar el formato de imagen adecuado al guardar, según la extensión indicada.



 

Introducción:

Aunque este código está hecho con Visual Basic 2005 y Visual C# 2005, supongo que funcionará con cualquier versión de VB.NET o de C#, aunque no lo he probado, ya que desde hace tiempo que solo uso la versión 2005 de Visual Studio, pero creo que las funciones usadas están en todas las versiones de .NET.

En este ejemplo, se hacen tres cosas:

1- Capturar el contenido del formulario actual.
2- Capturar el contenido de toda la pantalla.
3- Guardar esa captura en un fichero, y según la extensión de ese fichero, se usará el formato adecuado al guardar la imagen.

Para crear el formulario de ejemplo debes añadir los siguientes controles al formulario:

1 etiqueta, una caja de textos llamada txtNombre para guardar el nombre de la imagen, un botón llamado btnGuardar para guardar la imagen capturada, un botón llamado btnCapturar para capturar el contenido del formulario, un botón llamado btnCapturarPantalla para capturar toda la pantalla y un control de tipo PictureBox al que le he dado el nombre picCaptura y se usa para mostrar la captura y también será la imagen que se guarde.

Al PictureBox le he asignado el valor StretchImage a la propiedad SizeMode, de forma que muestre la imagen completa, además he asignado los valores a la propiedad Anchor para que se adapte al tamaño del formulario (anclado en las cuatro esquinas), con idea de que puedas ver mejor la captura al cambiar el tamaño del formulario.

En la figura 1 tienes una "captura" del formulario en ejecución con la captura de la pantalla completa.
Primero le di a capturar la pantalla completa y después capturé el formulario.
Esa figura es la misma que se ha guardado, aunque he reducido los colores a 256 para que ocupe menos.

Figura 1. Una captura del formulario en ejecución
Figura 1. Una captura del formulario en ejecución

 

Y en la figura 2 tienes varias capturas de las capturas del formulario... aburrido que estaba y le di varias veces al botón Capturar, je, je...

Figura 2. Varias capturas del formulario con lo capturado
Figura 2. Varias capturas del formulario con lo capturado

 

Nota:
Aquí te mostraré el código para Visual Basic, pero más abajo tienes el código para C#.

 

Capturar el contenido del formulario actual

Para capturar el contenido del formulario (y como verás para toda la pantalla) lo que debemos hacer es crear un objeto del tipo Bitmap para que contenga la imagen que queremos capturar, también necesitaremos un objeto del tipo Graphics que será el que usemos para capturar lo que le indiquemos de la pantalla. La captura del área de la pantalla que indiquemos lo haremos por medio del método CopyFromScreen al que hay que pasarlo la posición X, Y del área a capturar, la posición dentro del bitmap donde queremos que se guarde (normalmente la posición 0,0) y el tamaño de lo que queremos capturar, que estará indicado por el objeto fSize que es de tipo Size y tiene el tamaño de lo que queremos capturar.

Este código estará en el evento Click del botón Capturar.

' Capturar todo el área del formulario

Dim gr As Graphics = Me.CreateGraphics
' Tamaño de lo que queremos copiar
Dim fSize As Size = Me.Size
' Creamos el bitmap con el área que vamos a capturar
' En este caso, con el tamaño del formulario actual
Dim bm As New Bitmap(fSize.Width, fSize.Height, gr)
' Un objeto Graphics a partir del bitmap
Dim gr2 As Graphics = Graphics.FromImage(bm)
' Copiar el área de la pantalla que ocupa el formulario
gr2.CopyFromScreen(Me.Location.X, Me.Location.Y, 0, 0, fSize)

' Asignamos la imagen al PictureBox
Me.picCaptura.Image = bm

 

Capturar toda la pantalla

Para capturar la pantalla completa, lo que tenemos que cambiar del código anterior es el tamaño del bitmap y el área a capturar desde el método CopyFromScreen.

Este código estará en el evento Click del botón Capturar pantalla.

' Capturar toda la pantalla

Dim gr As Graphics = Me.CreateGraphics
' Tamaño de lo que queremos copiar
' En este caso el tamaño de la ventana principal
Dim fSize As Size = Screen.PrimaryScreen.Bounds.Size
' Creamos el bitmap con el área que vamos a capturar
Dim bm As New Bitmap(fSize.Width, fSize.Height, gr)
' Un objeto Graphics a partir del bitmap
Dim gr2 As Graphics = Graphics.FromImage(bm)
' Copiar todo el área de la pantalla
gr2.CopyFromScreen(0, 0, 0, 0, fSize)

' Asignamos la imagen al PictureBox
Me.picCaptura.Image = bm

 

Guardar la imagen del PictureBox usando el tipo adecuado según la extensión

En este caso, usamos la extensión del nombre que se haya indicado y se usará el valor adecuado en el método Save de la imagen del PictureBox. Si la extensión no es una de las que "controlamos" se usará el formato por defecto que es PNG.

Este código estará en el evento Click del botón Guardar.

If String.IsNullOrEmpty(Me.txtNombre.Text) Then
    MessageBox.Show("Debes indicar el nombre del fichero", _
                    "Guardar", _
                    MessageBoxButtons.OK, _
                    MessageBoxIcon.Exclamation)
    Exit Sub
End If

' Usar el formato según la extensión
Dim ext As String = Path.GetExtension(Me.txtNombre.Text).ToLower()
Select Case ext
    Case ".jpg"
        Me.picCaptura.Image.Save(Me.txtNombre.Text, ImageFormat.Jpeg)
    Case ".png"
        Me.picCaptura.Image.Save(Me.txtNombre.Text, ImageFormat.Png)
    Case ".gif"
        Me.picCaptura.Image.Save(Me.txtNombre.Text, ImageFormat.Gif)
    Case ".bmp"
        Me.picCaptura.Image.Save(Me.txtNombre.Text, ImageFormat.Bmp)
    Case ".tif"
        Me.picCaptura.Image.Save(Me.txtNombre.Text, ImageFormat.Tiff)
    Case Else
        Me.picCaptura.Image.Save(Me.txtNombre.Text)
End Select

 

Y esto es todo. Espero que te sea de utilidad.

 

Nos vemos.
Guillermo

 


Código para Visual Basic.NET (VB.NET) El código para Visual Basic .NET (cualquier versión)

Todo el código está en el artículo.

 

Código para C Sharp (C#) El código para C# (cualquier versión)
//-----------------------------------------------------------------------------
// Capturar el contenido del formulario o de la pantalla            (31/Ago/07)
//
// ©Guillermo 'guille' Som, 2007
//-----------------------------------------------------------------------------

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Windows.Forms;
using System.IO;

namespace capturarContenidoFormulario_cs
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void btnGuardar_Click(object sender, EventArgs e)
        {
            // Si no se indica el formato, se guarda como PNG
            //this.picCaptura.Image.Save(this.txtNombre.Text);

            if(String.IsNullOrEmpty(this.txtNombre.Text))
            {
                MessageBox.Show("Debes indicar el nombre del fichero",
                                "Guardar",
                                MessageBoxButtons.OK,
                                MessageBoxIcon.Exclamation);
                return;
            }

            // Usar el formato según la extensión
            string ext = Path.GetExtension(this.txtNombre.Text).ToLower();
            switch(ext)
            {
                case ".jpg":
                    this.picCaptura.Image.Save(this.txtNombre.Text, ImageFormat.Jpeg);
                    break;
                case ".png":
                    this.picCaptura.Image.Save(this.txtNombre.Text, ImageFormat.Png);
                    break;
                case ".gif":
                    this.picCaptura.Image.Save(this.txtNombre.Text, ImageFormat.Gif);
                    break;
                case ".bmp":
                    this.picCaptura.Image.Save(this.txtNombre.Text, ImageFormat.Bmp);
                    break;
                case ".tif":
                    this.picCaptura.Image.Save(this.txtNombre.Text, ImageFormat.Tiff);
                    break;
                default:
                    this.picCaptura.Image.Save(this.txtNombre.Text);
                    break;
            }
        }

        private void btnCapturar_Click(object sender, EventArgs e)
        {
            // Capturar todo el área del formulario

            Graphics gr = this.CreateGraphics();
            // Tamaño de lo que queremos copiar
            Size fSize = this.Size;
            // Creamos el bitmap con el área que vamos a capturar
            // En este caso, con el tamaño del formulario actual
            Bitmap bm = new Bitmap(fSize.Width, fSize.Height, gr);
            // Un objeto Graphics a partir del bitmap
            Graphics gr2 = Graphics.FromImage(bm);
            // Copiar el área de la pantalla que ocupa el formulario
            gr2.CopyFromScreen(this.Location.X, this.Location.Y, 0, 0, fSize);

            // Asignamos la imagen al PictureBox
            this.picCaptura.Image = bm;

            // Guardarlo como JPG
            //bm.Save("formulario.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
        }

        private void btnCapturarPantalla_Click(object sender, EventArgs e)
        {
            // Capturar toda la pantalla

            Graphics gr = this.CreateGraphics();
            // Tamaño de lo que queremos copiar
            // En este caso el tamaño de la ventana principal
            Size fSize = Screen.PrimaryScreen.Bounds.Size;
            // Creamos el bitmap
            Bitmap bm = new Bitmap(fSize.Width, fSize.Height, gr);
            // Un objeto Graphics a partir del bitmap
            Graphics gr2 = Graphics.FromImage(bm);
            // Copiar todo el área de la pantalla
            gr2.CopyFromScreen(0, 0, 0, 0, fSize);

            // Asignamos la imagen al PictureBox
            this.picCaptura.Image = bm;
        }
    }
}

Espacios de nombres usados en el código de este artículo:

System.Windows.Forms
System.Drawing
System.Drawing.Imaging
System.IO
 


Código de ejemplo (comprimido):

No hay fichero con el código de ejemplo, todo el código está mostrado en el artículo.


 


Cosas que te pueden interesar



Mentor de
SolidQ
Most Valuable Professional
MVP de .NET (antes Visual Basic)
de octubre de 1997 a septiembre de 2015



Orador internacional de Ineta
Orador de Ineta Latam

ir al índice del Guille


Escribir un mensaje al Guille (mensaje EN elGuille.info)
Has entrado usando el host: elguille.info
Puedes verlo también en: http://mundoprogramacion.com/net/dotnet/capturar_formulario_pantalla.aspx