Visor de imágenes en C# y VBasic .NET[Sencillo visor de imágenes BMP y JPG con funciones simples de edición y copiado al portapapeles]Fecha: 16/Ago/2003 (15/Ago/2003)
|
. |
Este es un ejercicio apto para programadores poco avanzados, en el que utilizaremos:
- algunos métodos de manipulación simple de imágenes como el giro y el "flip" de una imagen (rotateFlip de System.Drawing.RotateFlipType) y el ajuste de la imagen a su PictureBox (enumeración PictureBoxSizeMode).
- método de copiado al portapapeles mediante SetDataObject de la clase Clipboard.
- arranque de otra aplicación (navegador de Internet, en este caso concreto) mediante el uso de Process.Start de System.Diagnostics y la función StartupPath de la clase Application (que devuelve el directorio desde el que se ha iniciado la aplicación, en forma de ruta absoluta que termina en la carpeta contenedora).
- una barra de deslizamiento vertical VScrollBar a cuyo valor asignaremos las medidas de ancho y de alto del PictureBox que contiene la imagen para conseguir un efecto de zoom.
- código de protección contra errores de tipo clásico mediante construcciones cortas que dicen al programa cómo actuar en determinadas circunstancias, por ejemplo usando
'para que solamente lo haga si hay imagen en la caja de imagen If Not pbxImg.Image Is Nothing Then- código de protección contra errores específico de Visual Basic, usando Try...Catch.
Código fundamental del programa:
Este ejercicio está referido a Visual Basic .NET, pero existe un ejercicio similar en C# (ver enlace al final del documento). A continuación sigue código en Visual Basic:' VISOR DE IMAGENES EN VISUAL BASIC .NET ' Miliuco - 03/08/2003 Imports System Imports System.Drawing Imports System.Drawing.Imaging Imports System.Windows.Forms Imports System.Text Imports System.IO Imports System.Diagnostics Public Class Form1 Inherits System.Windows.Forms.Form #Region " Código generado por el Diseñador de Windows Forms " #End Region ' Variable para ser utilizada en el método btAbrir_Click Dim nombreImg As String = "" 'Al cargar el formulario Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load lbImg.Text = "Ninguna imagen cargada" lbImg2.Text = "" End Sub 'Mover la barra de desplazamiento vertical Private Sub VScrollBar1_Scroll(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ScrollEventArgs) Handles VScrollBar1.Scroll 'entero para almacenar el valor de la barra de desplazamiento Dim imgZoom As Single = VScrollBar1.Value 'para que solamente lo haga si hay imagen en la caja de imagen If Not pbxImg.Image Is Nothing Then 'código para que la caja de imagen sea redimensionada 'manteniendo el modo de colocación de la imagen: centrada o ajustada If (pbxImg.SizeMode = PictureBoxSizeMode.StretchImage) Then pbxImg.Width = (456 * imgZoom) \ 100 pbxImg.Height = (304 * imgZoom) \ 100 End If If (pbxImg.SizeMode = PictureBoxSizeMode.Normal) Then pbxImg.Width = (456 * imgZoom) / 100 pbxImg.Height = (304 * imgZoom) / 100 End If End If 'Recarga la imagen pbxImg.Refresh() End Sub 'Para abrir un archivo Private Sub mnAbrir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnAbrir.Click dlgFile = New OpenFileDialog dlgFile.Filter = "Imágenes JPG (*.jpg)|*.jpg|Mapas de bits (*.bmp)|*.bmp" dlgFile.Title = "Abre una imagen JPG o BMP" If dlgFile.ShowDialog() = DialogResult.OK Then nombreImg = dlgFile.FileName pbxImg.Image = Image.FromFile(nombreImg) pbxImg.SizeMode = PictureBoxSizeMode.StretchImage lbImg.Text = nombreImg VScrollBar1.Enabled = True lbImg2.Text = "Ancho de imagen: " + pbxImg.Image.Width.ToString + _ " px. / Alto de imagen: " + pbxImg.Image.Height.ToString + " px" End If End Sub 'Vaciar la caja de imagen y la etiqueta de información Private Sub mnCerrar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnCerrar.Click 'para que solamente lo haga si hay imagen en la caja de imagen If Not pbxImg.Image Is Nothing Then pbxImg.Image = Nothing lbImg.Text = "Ninguna imagen cargada" lbImg2.Text = "" VScrollBar1.Enabled = False End If End Sub 'Para guardar el archivo en otro formato (BMP a JPG, JPG a BMP) Private Sub mnGuardar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnGuardar.Click 'para que solamente lo haga si hay imagen en la caja de imagen If Not pbxImg.Image Is Nothing Then dlgSave = New SaveFileDialog dlgSave.Filter = "Mapas de bits (*.bmp)|*.bmp|Imágenes JPG (*.jpg)|*.jpg" dlgSave.Title = "Guarda como imagen JPG o BMP" If dlgSave.ShowDialog() = DialogResult.OK Then nombreImg = dlgSave.FileName If (nombreImg.EndsWith("jpg")) Then pbxImg.Image.Save(nombreImg, ImageFormat.Jpeg) End If If (nombreImg.EndsWith("bmp")) Then pbxImg.Image.Save(nombreImg, ImageFormat.Bmp) End If End If End If End Sub 'Salir Private Sub mnSalir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnSalir.Click 'End Close() End Sub 'Salir Private Sub mnSalir2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnSalir2.Click 'End Close() End Sub 'Para copiar la imagen al protapapeles Private Sub mnCopiar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnCopiar.Click 'para que solamente lo haga si hay imagen en la caja de imagen If Not pbxImg.Image Is Nothing Then Call fnClipboard() 'función detallada en el siguiente bloque End If End Sub 'Función que devuelve un objeto desde el portapapeles. 'La clase ClipBoard deriva de la clase Object y tiene 3 miembros: 'constructor / GetDataObject / SetDataObject Private Function fnClipboard() As Object 'Copiar imagen al portapeles 'SetDataObject lleva 2 parámetros (objeto, booleano) 'Si booleano es true, el objeto queda en el portapapeles 'después de haber cerrado la aplicación Clipboard.SetDataObject(pbxImg.Image, True) 'Variable objClipboard para contener el portapeles Dim objClipboard As IDataObject = Clipboard.GetDataObject() 'devuelve el portapapeles como mapa de bits Return objClipboard.GetData(DataFormats.Bitmap) End Function 'Para mostrar la imagen a tamaño real Private Sub mnReal_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnReal.Click 'para que solamente lo haga si hay imagen en la caja de imagen If Not pbxImg.Image Is Nothing Then pbxImg.SizeMode = PictureBoxSizeMode.Normal End If End Sub 'Para ajustar la imagen Private Sub mnAjustar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnAjustar.Click 'para que solamente lo haga si hay imagen en la caja de imagen If Not pbxImg.Image Is Nothing Then pbxImg.SizeMode = PictureBoxSizeMode.StretchImage End If End Sub 'Menú que voltea horizontalmente la imagen Private Sub mnFlip_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnFlip.Click 'para que solamente lo haga si hay imagen en la caja de imagen If Not pbxImg.Image Is Nothing Then pbxImg.Image.RotateFlip(RotateFlipType.RotateNoneFlipX) pbxImg.Refresh() 'Recarga la imagen End If End Sub 'Para girar la imagen 180 grados Private Sub mnGirar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnGirar.Click 'para que solamente lo haga si hay imagen en la caja de imagen If Not pbxImg.Image Is Nothing Then pbxImg.Image.RotateFlip(RotateFlipType.Rotate180FlipX) pbxImg.Refresh() 'Recarga la imagen End If End Sub 'Menú que voltea verticalmente la imagen Private Sub mnFlip2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnFlip2.Click 'para que solamente lo haga si hay imagen en la caja de imagen If Not pbxImg.Image Is Nothing Then pbxImg.Image.RotateFlip(RotateFlipType.RotateNoneFlipY) pbxImg.Refresh() 'Recarga la imagen End If End Sub 'Mostrar el código del programa Private Sub mnCode_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnCode.Click 'Obtener la ruta a la carpeta desde la que se ha iniciado la aplicación, Dim stRuta As String = Application.StartupPath Try ' para detectar y manipular excepciones (errores del programa) 'ProcessStartInfo se utiliza para iniciar procesos Dim abrirDoc As ProcessStartInfo = New ProcessStartInfo 'Añadir a la ruta "\Visor de Imagen.html" para abrir el archivo abrirDoc.FileName = stRuta + "\Visor de imágenes.html" 'Información al usuario de la ruta obtenida en su sistema MessageBox.Show("La ruta a tu archivo ""Visor de imágenes.html"" parece ser:" _ + vbCrLf + vbCrLf + abrirDoc.FileName, "Archivo Visor de imágenes.html", _ MessageBoxButtons.OK) 'modo de apertura de archivo (también puede ser edit, print...) abrirDoc.Verb = "open" 'abrir en ventana normal abrirDoc.WindowStyle = ProcessWindowStyle.Normal 'Abrir el archivo mediante su programa asociado en Windows Process.Start(abrirDoc) Catch a As Exception 'Objeto Exception de nombre a 'Mensaje relativo a la excepción lanzada MessageBox.Show("Se ha producido la siguiente excepción:" _ + vbCrLf + vbCrLf + a.Message, "Mensaje de error") End Try End Sub 'Caja de mensaje Acerca de... Private Sub MenuItem3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem3.Click MessageBox.Show("Visor de imágenes realizado en Visual Basic. Autor: MILIUCO. Fecha: 03/08/2003" _ + vbCrLf + "El archivo ""Visor de imágenes.html"" debe estar en la misma carpeta que el ejecutable" _ + " de la aplicación.", "Acerca de...", MessageBoxButtons.OK) End Sub End ClassComo resumen, con este ejercicio se toma contacto con métodos interesantes para el usuario no experto:
- manipulación de imágenes (rotateFlip de System.Drawing.RotateFlipType y otros).
- copiado al portapapeles (SetDataObject de la clase Clipboard).
- arranque de otra aplicación (Process.Start de System.Diagnostics).
Imagen del programa en funcionamiento:
La foto es de mi querido perro Milú durante mis vacaciones en la costa de Málaga (saludos, Guille ;-)
La imagen corresponde al programa en C#, el programa en VBasic es prácticamente igual con el añadido de la barra de deslizamiento vertical que hace zoom sobre la imagen.
Fichero con el código de ejemplo en Visual Basic (Visual Studio 2003) (miliuco_visorvb.zip - Tamaño 95 KB)
Fichero con el código de ejemplo en C# (Visual Studio 2003) (miliuco_visorcs.zip - Tamaño 125 KB)