Imágenes en Base de Datos
Presentación de imágenes guardadas en una BD desde WinForms

Fecha: 16/Jul/2004 (14/07/04)
Autor: MacK (mack0404-panorama@yahoo.com)

 

Nota del guille:
Si quieres ver cómo acceder a imágenes almacenadas en bases de datos de Access, puedes verlo en: Almacenamiento de imágenes en Access, también de MacK

 


Al contrario que otros muchos controles .NET, el control PictureBox no ofrece una propiedad DataSource que nos permita enlazar directamente la imagen mostrada a una fuente de datos. Este artículo muestra como presentar imágenes guardadas en base de datos dentro de un objeto PictureBox.

La base de datos

Partimos del hecho de que disponemos de una base de datos en la que una tabla contiene las imágenes en una columna de tipo binario. En SQL Server una tabla de este tipo se generaría con un comando T-SQL como este:

CREATE TABLE [dbo].[Images]
([ItemID] [int] IDENTITY (1, 1) NOT NULL ,
 [Image] [image] NULL )
ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

Además, disponemos de un procedimiento almacenado en la BD que obtiene los la imagen accediendo por su ID:

CREATE PROCEDURE GetImageBinary @ItemID int AS
SELECT Image FROM Images WHERE ItemID = @ItemID
GO

Convirtiendo los datos en System.Drawing.Image

La propiedad Image del control PictureBox es de tipo System.Drawing.Image. Por lo tanto necesitamos convertir los datos guardados en el columna Image en un objeto de este tipo. Para ello utilizaremos el método estático FromStream de la clase Image, que nos devuelve un objeto Image a partir de un System.IO.Stream.

Por tanto, colocaremos los datos obtenidos de la columna Imagen de la BD en un MemoryStream, con el que alimentaremos la función FromStream, tal y como muestra el siguiente código (reemplazar los parámetros de la cadena de conexión por los que se apliquen):

//Obtiene un objeto System.Drawing.Image a partir de un array de bytes obtenido de una base de datos.

// Mack 14/07/2004

 

private System.Drawing.Image obtenerImagen(int iImageID )
{
   SqlConnection cn=new SqlConnection("server=ServidorBD;database=BaseDeDatos;Uid=Usuario ;pwd= Password");
   string strCmdText = "GetImageBinary";
   SqlCommand cmd = new SqlCommand();
   cmd.CommandText = strCmdText;
   cmd.CommandType = CommandType.StoredProcedure;
   cmd.Connection = cn;
   SqlParameter sqlparamItemID = new SqlParameter("@ItemId",SqlDbType.Int);
   sqlparamItemID.Value = iImageID;
   cmd.Parameters.Add(sqlparamItemID);

   MemoryStream ms = new MemoryStream();
   cn.Open();
   byte [] img = (byte [])cmd.ExecuteScalar();
   cn.Close();
   if (img == null )
   {
      MessageBox.Show ("Imagen no encontrada en la base de datos");
   }
   ms.Write(img, 0 ,img.GetUpperBound(0) + 1);
   System.Drawing.Image imgImagen=System.Drawing.Image.FromStream(ms);
   ms.Close();
   return imgImagen;
}

El objeto devuelto por la función obtenerImagen es ya directamente asignable a un PictureBox:

pictureBox1.Image = obtenerImagen(3);

Ahora restaría modificar algunas propiedades del PictureBox, como el ancho, alto, etc. en base a las propiedades de la imagen generada, pero esto ya es algo trivial.

Si tienes algún comentario acerca de este articulo no dudes en ponerte en contacto conmigo en mi dirección mack0404-panorama@yahoo.com

Y si el código te ha servido no olvides votarlo arriba, en la caja de PanoramaBox :)

MacK

 


ir al índice