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 ([email protected])

 

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 [email protected]

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

MacK

 


ir al ndice