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
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
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
El código para Visual Basic .NET (cualquier versión)
Todo el código está en el artículo.
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