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)
Autor: Emilio Pérez Egido - emi@miliuco.com
 
.

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 Class

Como resumen, con este ejercicio se toma contacto con métodos interesantes para el usuario no experto:


Imagen del programa en funcionamiento:

Visor de imágenes

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.


ir al índice

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)