Mode Martínez Palenzuela - 13-07-2006 12:13:00 | Categoria: .NET
Campos Imagen y Controles PictureBox.Podemos utilizar dos caminos diferentes para incorporar imágenes a nuestros registros. Uno de ellos es definir un campo cadena que almacenará la ruta donde se encuentra la imagen y el otro es, directamente grabar la imagen en la base de datos como una cadena binaria. Elegiremos uno u otro en base a nuestras necesidades y al proveedor de datos utilizado, ya que no todos poseen un tipo de campo que permita almacenar imágenes.
Almacenando la ruta en la base de datos.Es el método más sencillo. Basta con almacenar en el campo correspondiente de la Tabla una cadena con la ruta a visualizar y usar el método FromFile() del objeto Image para cargar la imagen correspondiente en un PictureBox. De esta forma el tamaño de la base de datos no crece de forma exponencial, pero a cambio nos obliga a tener todas las imágenes perfectamente organizadas y a transportarlas junto con nuestro proyecto. Además, si algún usuario elimina por error una imagen de la carpeta correspondiente, la aplicación no podrá mostrarla y se generará una excepción que deberemos tener en cuenta.
Recuperar la imagen de la Base de Datos.Suponiendo un DataSet y una variable posRegistro que apunta al registro actual.
‘ Acceder a la fila correspondiente
Dim registro as DataRow
registro = miTabla.Rows(posRegistro)
‘ Comprobar que contiene una ruta
if registro(“Foto” ) <> “” then
‘ Cargamos la foto en el PictureBox
PictureBox1.Image = Image.FromFile(registro(“Foto” ))
End If
Asignar una imagen desde archivo.En el evento Click del PictureBox o de un botón de comando:
‘ Especificar parámetros para el cuadro de diálogo
dlgAbrir.InitialDirectory = “ C:\Documents And Settings\Admin\Mis Documentos\Mis Imágenes”
‘ Invocar al cuadro de diálogo
dlgAbrir.ShowDialog()
‘ Comprobar que se ha elegido un archivo y no se ha pulsado el botón Cancelar
if dlgAbrir.FileName <> “dlgAbrir” then
‘ Cargar la imagen del archivo en el PictureBox
PictureBox1.Image = Image.FromFile(dlgAbrir.FileName)
‘ Asignarla a la columna correspondiente en la Tabla
Registro(“Foto” ) = dlgAbrir.FileName
Else
Msgbox (“No ha seleccionado un nombre de archivo válido…” )
End If
Almacenando la imagen en la base de datos.Casi todos los RDBMS cuentan con algún tipo de columna que facilita el almacenamiento de imágenes, pero su enlace y tratamiento en aplicaciones no es tan fácil como cabría esperar. SQL Server, por ejemplo, cuenta con un tipo Image pero no tiene correspondencia con ningún tipo de la plataforma .NET y ni siquiera puede enlazarse directamente a un control PictureBox. El tipo más parecido en la plataforma es base64binary. Cuando creamos una columna tipo Image en SQL Server es conveniente permitir que admita nulos para evitar determinado tipo de errores en el caso de que uno de valores de la columna no haya sido asignado.
Recuperar la imagen de la Base de Datos.En primer lugar necesitamos saber cuál es la fila actual de datos que está mostrándose y posteriormente comprobar si la columna con la imagen tiene un valor nulo o no. Si no es nulo significará que existe una imagen, pero no podemos mostrarla directamente porque el tipo de dato Image no es compatible con el que admite un control PictureBox.
Por ello hay que crear un flujo de datos en memoria, es decir, un objeto MemoryStream, que contenga la secuencia de bytes alojada en el campo imagen. Una vez hecho esto podemos usar el método FromStream() de la clase Image para mostrarla en el PictureBox.
Por el contrario, si el valor de la columna es nulo deberemos eliminar el contenido actual del PictureBox, para que refleje la situación de la fila actual.
Para hacer todo esto podemos aprovechar el método PositionChanged() que es invocado por todos los métodos que causan una actualización de los datos.
Private Sub objdsLibros_PositionChanged()
Me.lblNavLocation.Text = (((Me.BindingContext(objdsLibros, “Libros” ).Position+1)._
ToString + “ de “ + Me.BindingContext(obdjdsLibros,”Libros” ).Count.ToString)
Dim posicion = BindingContext(objdsLibros, “Libros” ).Position
If Not obdjsLibros.Libros(Posicion).IsPortadaNull then
‘ Creamos un MemoryStream
Dim Imagen As New MemoryStream(obdjsLibros.Libros(BindingContext(obdjsLibros,_
“Libros” ).Position).Portada)
‘ Introducimos la imagen en el PictureBox
PictureBox1.Image = Imagen.FromStream(Imagen)
Else
‘ Limpiamos
PictureBox1.CreateGraphics().Clear(Color.Black)
End If
End Sub
Asignar una imagen desde archivo.El evento Click del PictureBox o de un botón de comando que pongamos debajo del mismo nos puede sevir para especificar el código para cargar la imagen desde un archivo ayudándonos de un control cuadro de diálogo.
Podemos usar el método FromFile() de la clase Image para recuperar la imagen de un archivo y mostrarla en el PictureBox. Los DataColumn no disponen de un método similar, por lo que tendremos que recuperar la imagen en memoria como secuencia de bytes y luego asignarla a la propiedad Image del PictureBox.
Private Sub PictureBox1_Click (….) …
‘ Abrimos el cuadro de diálogo de selección de archivo y si se elige uno …
if OpenFileDialog1.ShowDialog() = DialogResult.Ok then
‘Mostramos
PictureBox1.Image= Image.FromFile(OpenFileDialog1.FileName)
‘Creamos un FileStream para recuperar la imagen en memoria …
Dim Img As NewFileStream(OpenFileDialog1.FileName, FileMode.Open, FileAcces.Read)
‘ … en un array de bytes
Dim Imagen (Img.Length) As Byte
‘ Leemos
Img.Read(Imagen, 0, Img.Length)
Img.Close
‘ Asignamos
obdjsLibros.Libros(Me.BindingContext(obdjsLibros, “Libros” ).Position).Portada=Imagen
End If
End Sub
PLEASE REPORT BUGS
Anotación por Mode Martínez Palenzuela a las 12:13:00
| Comentarios (0)
Guardado en la categoría .NET | Referencias (0)
Guardado en la categoría .NET | Referencias (0)
Referencias:
neomode en la web ni su autor se hacen responsables de los comentarios aqui hechos. Cualquier comentario insultante o fuera del tema, será borrado.
Comentarios:
Escribe tu comentario
HTML Permitido. Correo electrónico no se muestra.

