Está en la página 1de 13

using System;

using System.Drawing;

using System.Windows.Forms;

namespace WindowsFormsApplication1

public partial class Form1 : Form

public Form1()

InitializeComponent();

private void Form1_Load(object sender, EventArgs e)

pictureBox1.Image = Image.FromFile("c:\\testImage.jpg");

pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;

}
Control PictureBox se utiliza para mostrar imágenes en Windows Forms. En este artículo, voy a discutir
cómo utilizar un control PictureBox para mostrar imágenes en aplicaciones de Windows Forms.

Creación de un cuadro de imagen

Clase PictureBox representa un control PictureBox. El siguiente fragmento de código crea un cuadro de
imagen, fija su anchura y altura y añade control al formulario llamando al método Controls.Add ().

C # Código:

PictureBox ImageControl = new PictureBox ();


imageControl.Width = 400;
imageControl.Height = 400;
 
Controls.Add (ImageControl);
 
Código VB.NET:
 
Dim ImageControl Como Nuevo PictureBox ()
imageControl.Width = 400
imageControl.Height = 400
Mostrar una imagen

Propiedad de la imagen se utiliza para establecer una imagen para que se muestre en un control
PictureBox. El siguiente fragmento de código crea un mapa de bits de una imagen y establece la
propiedad Image del control PictureBox. Código también establece la propiedad Muelle de PictureBox.

C # Código:

displayImage private void ()


{
    PictureBox ImageControl = new PictureBox ();
    imageControl.Width = 400;
    imageControl.Height = 400;
 
    Imagen de mapa de bits = new Bitmap ("C: \\ \\ Imágenes Creek.jpg");
    imageControl.Dock = DockStyle.Fill;
    imageControl.Image = imagen (imagen);
 
    Controls.Add (ImageControl);
}
 
Código VB.NET:
 
Private Sub displayImage ()
        Dim ImageControl Como Nuevo PictureBox ()
        imageControl.Width = 400
        imageControl.Height = 400
        Imagen Dim As New Bitmap ("C: \\ \\ Imágenes Creek.jpg")
        imageControl.Dock = DockStyle.Fill
        imageControl.Image = Imagen
        Controls.Add (ImageControl)
    End Sub
 

La salida se ve como en la Figura 1, donde se muestra una imagen.

PictureBoxImg1.jpg
SizeMode

Propiedad SizeMode se utiliza para colocar una imagen dentro de un cuadro de imagen. Puede ser
normal, StretchImage, AutoSize, CenterImage y Zoom. El siguiente fragmento de código establece la
propiedad SizeMode de un control PictureBox.

C # Código:

imageControl.SizeMode = PictureBoxSizeMode.CenterImage;
 
Código VB.NET:
 
imageControl.SizeMode = PictureBoxSizeMode.CenterImage
 
Sumario
En este artículo, discutimos discutir cómo utilizar un control PictureBox para mostrar imágenes en
aplicaciones de Windows Forms.
Ç
PictureBox es que cuando alguien instala tu aplicación, al tratar de modificar

archivos de imágenes después de haberlos mostrado vía un PictureBox, algunos

usuarios van a obtener errores de “fichero bajo uso por otro usuario” y “error GDI+

desconocido.” Estos errores solo pasan en algunas maquinas, y es muy

inconsistente su aparición en general. Es difícil saber qué está pasando realmente.

Microsoft hace el problema peor, da mala información en sus páginas como

esta:http://support.microsoft.com/kb/311754. Este artículo da una solución que no

funciona, y aparte dice que lo que ocurre es “de acuerdo al diseño.” Ignorando la

cuestión de cómo alguien podría poner este comportamiento intencionalmente en

un sistema, el hecho de que el comportamiento no sea consistente constituye un

error en la implementación.

Si hacemos una búsqueda para este problema, pueden ver varios arreglos

propuestos:

 Llamar .Dispose() a la imagen antes de grabar un archivo

 Llamar .Dispose() a la imagen antes de grabar un archivo, y luego llamar al

recolector de basura

 Hacer una copia del objeto Image antes de asignarlo al control PictureBox(.NET

es demasiado inteligente para esto, al pareces)

 Usar Image.Clone() para hacer una copia del objeto Image antes de asignarlo al

PictureBox

 Usar FileStream para abrir el archivo

Hay muchísimas páginas y foros en el internet acerca de este problema, y los leí

todos, créanme. Ninguno me dio una respuesta 100% efectiva, aunque me

apuntaron en la dirección correcta: El problema es en asociar una imagen obtenida

de un archivo con un PictureBox. La meta es de usar toda medida en hacer pensar

al objeto Image que la imagen no vino de un archivo.


Ya basta de quejarnos… ¿Así que como lo arreglamos? Aparentemente este es un

error en Windows desde los días de VB6, asi que no tiene caso esperar a que

Microsoft lo arregle.

Después de muchos jalones de pelo e intentos fallidos, esto es lo que finalmente

funcionó para mi: Abrir el archivo que contiene la imagen, y de la manera más

indirecta posible, asignar los contenidos al objeto Image que vas a usar para

mostrar la imagen en el PictureBox. Haz lo mismo cuando vas a salvar una imagen.

Si no mezclas objetos Image con acceso a archivos todos van a estar felices y sin

errores.

Estos son los pasos a seguir en general:

 Para abrir un archivo:


o Abre el archive, pero no como un objeto Image, lee el archive a un arreglo de

byte
o Convierte ese arreglo de byte a un objeto Image, la conversión detectara cual

formato (JPG, PNG, etc…) usa el archivo


o Usa ese objeto Image para asignarlo al PictureBox y desplegarlo

o NO llames al método .Save() de Image para grabar un archivo, ve lo

siguiente…

 Para grabar un archivo:


o Clona el objeto Image via el metodo .Clone()

o Graba la imagen via a un MemoryStream, usando tu codificación preferida

(JPG, PNG, etc…)


o Convierte el MemopryStream a un arreglo de byte

o Graba ese arreglo de byte al archivo destino

Aquí hay un poco de código que lo demuestra:

Para leer el archivo:

?
1
2
3 public static Image NonLockingOpen(string filename) {
    Image result;
4
5     #region Save file to byte array
6
7     long size = (new FileInfo(filename)).Length;
8     FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read);
9     byte[] data = new byte[size];
    try {
10         fs.Read(data, 0, (int)size);
11     } finally {
12         fs.Close();
13         fs.Dispose();
14     }
15
    #endregion
16
17     #region Convert bytes to image
18
19     MemoryStream ms = new MemoryStream();
20     ms.Write(data, 0, (int)size);
21     result = new Bitmap(ms);
    ms.Close();
22
23
    #endregion
24
25     return result;
26 }
27
28
Para escribir el archivo:

?
1 public static void NonLockingSave(Image img, string fn, ImageFormat format) {
    // Delete destination file if it already exists
2     if (File.Exists(fn))
3         File.Delete(fn);
4
5     try {
6
7         #region Convert image to destination format
8
9         MemoryStream ms = new MemoryStream();
        Image img2 = (Image)img.Clone();
10         img2.Save(ms, format);
11         img2.Dispose();
12         byte[] byteArray = ms.ToArray();
13         ms.Close();
14         ms.Dispose();
15
        #endregion
16
17         #region Save byte array to file
18
19         FileStream fs = new FileStream(fn, FileMode.CreateNew, FileAccess.Write);
20
21
22
        try {
23
            fs.Write(byteArray, 0, byteArray.Length);
24         } finally {
25             fs.Close();
26             fs.Dispose();
27         }
28
        #endregion
29
30     } catch {
31         // Delete file if it was created
32         if (File.Exists(fn))
33             File.Delete(fn);
34
35         // Re-throw exception
        throw;
36     }
37 }
38
39
40
Finalemente, aqui hay un método de extension que puede ayudarte:

?
1 public static void SaveViaStreams(this Image img, string fn, ImageFormat format) {
2     NonLockingSave(img, fn, format);
3 }

Una vez que usé estos métodos para abriy y grabar mis archivos, todos mis errores

de usar imagenes con PictureBox se fueron, en todas las computadoras 


Windows Form en C# :
Abrir y mostrar una
imagen en la interfaz
Seguir los siguientes pasos para crear un programa que abra y muestre una
imagen en una interfaz hecha en C# con Windows Forms
1.- Abrir un nuevo proyecto de Windows Form de C# (figura 1).

Figura 1.- Nuevo proyecto de Windows Forms en C#

2.- Agregar un objeto OpenFileDialog:


2.1.- De la barra de herramientas (Ctrl + X) seleccionar el elemento
OpenFileDilog.
2.2.- Dar clic en cualquier lugar de la forma para agregar un nuevo objeto
llamado “openFileDialog1”, el cual se mostrará debajo de la forma (figura 2).
Figura 2.- OpenFileDialog

3.- Agregar un botón:


3.1.- En la barra de herramientas seleccionar y agregar un botón a la interfaz
(figura 3).

Figura 3.- Agregar un botón a la interfaz


3.2.- Abrir la propiedades de botón agregado (clic derecho + propiedades)
como se muestra en la figura 4.

Figura 4.- Ver la propiedades del botón

3.3.- Cambiar la propiedad “text” para cambiar el texto del botón, en este caso
se cambio a “Cargar Imagen” (figura 5).

Figura 5.- Cambiar el texto del botón

4.- Agregar un objeto “PictureBox” para mostrar una imagen en la interfaz.


4.1.- Seleccionar el elemento  “PictureBox” de la barra de herramientas y
definir el tamaño de una región dentro de la forma (figura 5).
Figura 5.- Nuevo elemento PictureBox

4.2.- El objeto creado tendrá por defecto el nombre de “pictureBox1”.

4.3.- Para cambiar el modo de visualización, seleccionar el objeto “PictureBox” creado en la interfaz y

dar clic en la flecha que se encuentra en la esquina superior derecha. En la opción “Size Mode”

seleccionar la manera en que se desea visualizar la imagen (figura 6).

Figura 6.- Cambiar visualización


 Por ejemplo, la opción Zoom adapta la imagen al tamaño de la región creada sin cambiar su relación de

alto x ancho (figura 7).

Figura 7.- Ejemplo utilizando la opción Zoom

5.- Dar doble clic sobre el botón agregado y escribir dentro del evento
generado el siguiente código:
1
2 try
3  {
   if (openFileDialog1.ShowDialog() == DialogResult.OK)
4    {
5      string imagen = openFileDialog1.FileName;
6      pictureBox1.Image = Image.FromFile(imagen);
7    }
 }
8
 catch (Exception ex)
9  {
10    MessageBox.Show("El archivo seleccionado no es un tipo de imagen válido");
11  }
12
6.- Para finalizar, probar el programa con diferentes modos de visualización
hasta encontrar el adecuado para su aplicación (Paso 4.3).
Explicación del código:
 La linea de código openFileDialog1.ShowDialog(), abre el explorador de

Windows para que el usuario pueda elegir y abrir un archivo.


 El código dentro del if se ejecutará solamente cuando se seleccione un
archivo en la ventana del explorador y se da clic en “Abrir”.
 La siguiente línea de código guarda la dirección del archivo en una
variable del tipo string.
string imagen = openFileDialog1.FileName;
 Si el archivo que se eligió en el explorador de Windows es una imagen, la
siguiente línea de código copia el contenido de la imagen  al objeto
pictureBox1 para ser mostrado en la interfaz.
      pictureBox1.Image = Image.FromFile(imagen);

 Si el archivo no es una imagen, se controla la excepción producida  y se


muestra un mensaje de texto con la siguiente línea de código:
      MessageBox.Show(“El archivo seleccionado no es un tipo de imagen valido”);

También podría gustarte