none
Access // Visual Basic .Net // La imagen no se guarda o recupera correctamente

    Pregunta

  • Hola.
    Veamos, tengo una bd con un tipo de campo Ole donde guardo un array de bytes.

    'Foto as PictureBox ' Está en el formulario

    Así guardo la imagen:

    'Conversion de Imagen y Guardado (Los campos se pasan como parametros en un sub, imagen as Image)
    If imagen Is Nothing Then    
        'Guardar    
        DatasTableAdapter.Insert(Id, Titulo, genero, descripcion, año, pais, Nothing)
    Else     
        Dim arrImage() As Byte     
        Using myMs As New IO.MemoryStream         
            'Convertir imagen a Bytes         
            imagen.Save(myMs, imagen.RawFormat)         
            arrImage = myMs.GetBuffer()         
            'Guardar         
            DatasTableAdapter.Insert(Id, Titulo, genero, descripcion, año, pais, arrImage)     
        End Using 
    End If

    Así es como recupero la imagen: (En evento CellClick de DataGridView)

    Try
    	    If IsDBNull(dgv.Rows(e.RowIndex).Cells(6).Value) Then Foto.Image = Nothing : Exit Sub
                Using arrImage As New IO.MemoryStream(CType(dgv.Rows(e.RowIndex).Cells(6).Value, Byte()))
                    Foto.Image = Nothing
                    Dim img As Image = Image.FromStream(arrImage)
                    Foto.SizeMode = PictureBoxSizeMode.Zoom
                    Foto.Image = img
                End Using
    Catch ex As Exception
                MsgBox("Error getting image." & vbCrLf & ex.Message, MsgBoxStyle.Critical, "Bug!")
                Foto.SizeMode = PictureBoxSizeMode.CenterImage
                Foto.Image = Foto.ErrorImage
    End Try

    'Esta es la imagen que paso como parámetro:

    La imagen era mas grande.

    'Y despues, cuando recupero la imagen, se ve asi:

    O sea, casi no se ve nada.

    Por ahí hay un error al guardar o recuperar, no se, debería de funcionar.


    Saludos. Atentamente Pablo Fac.

    viernes, 18 de noviembre de 2016 14:02

Respuestas

  • Hola @Admin Pablo Fac

    En este manual muestra como guardar una imagen a la base de datos y recuperarla analiza el código [WinForms] Edición Empleados – Grabar imagen en base de datos

    Espero la información brindada te sea de utilidad

    Saludos


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    sábado, 17 de junio de 2017 3:11
  • Hola buenas noches, te voy a enviar la manera en que guardo y recupero una imagen ha desde un picturebox ha una base de datos de SQL Server, espero te puede ayudar:

    Envio de la imagen:

    Imports System.Drawing.Imaging

     Public Function ImageToByteArray(ByVal imageIn As Image) As Byte()
            Dim ms As New MemoryStream()
            imageIn.Save(ms, ImageFormat.Jpeg)
            Return ms.ToArray()
        End Function

     objdatos.GetInsertArticuloRow(txtCodigoArticulo.Text, ImageToByteArray(PictureBox1.Image))

      Public Function GetInsertArticuloRow( GetInsertArticuloRow(ByVal strCodigo As String, ByVal imgCodigoEtiqueta As Byte()) as DataSet

     Try

                Dim datos As New DataSet()
                Dim connexion As New SqlConnection()
                Dim command As New SqlCommand()
                Dim da As New SqlDataAdapter()

                connexion.ConnectionString = connectionString
                command.Connection = connexion
                command.CommandText = "spInsertArticulo"
                command.Parameters.Add("@Codigo", SqlDbType.NVarChar, 100).Value = strCodigo
                command.Parameters.Add("@CodigoEtiqueta", SqlDbType.Image).Value = imgCodigoEtiqueta

      command.CommandType = CommandType.StoredProcedure
                da.SelectCommand = command
                da.Fill(datos)
                command.Connection.Close()
                command.Connection.Dispose()
                Return datos

            Catch ex As Exception

            End Try
        End Function

    recuperación de la imagen

    data_busqueda: es un datagridview (pues cargo en un datagidview la tabla que tiene el campo image)

      Dim data = TryCast(data_busqueda.Rows(Fila_Seleccionada).Cells(2).Value, Byte())
                        Dim stream = New MemoryStream(data)
                        frmArticulos.PictureBox1.Image = Image.FromStream(stream)

    viernes, 2 de junio de 2017 3:50

Todas las respuestas

  • Hola.
    Estoy usando Access y Visual Basic/Studio 2015 Update 2 . NetFramework 4.5.2

    La base de datos tiene una sola tabla:
    Diseño de la Única Tabla de Base de Datos realizada en Acccess

    Todos los componentes los agregó VS cuando arrastré el DataGridView desde la ventana Orígenes de Datos hasta el formulario.
    Las consultas a la Base de Datos la hago mediante un TableAdapter (que agrega vs), conectado al DataSet (en mi caso se llama DS.xsd).

    La consulta que creé para insertar registros es la siguiente:

    	INSERT INTO Datas (Caja, Titulo, Genero, Sipnopsis, Anio, Pais, Imagen) VALUES (?, ?, ?, ?, ?, ?, ?)

    La consulta que creé para actualizar/editar registros existentes es la siguiente:

    	UPDATE Datas SET Caja = ?, Titulo = ?, Genero = ?, Sipnopsis = ?, Anio = ?, Pais = ?, Imagen = ? WHERE (Caja = ?)

    Las consultas las agregué en el archivo DS.xsd, en el DataTableAdapter bajo la tabla 'Datas'.

    Click derecho, Agregar Consulta, Siguiente, Siguiente, 'La consulta', Finalizar. (Por las dudas ;) )

    Este es el procedimiento que está en el formulario y utilizo para guardar registros:

       'Guardar
        Sub Save(Id As Integer, Titulo As String, año As Short, genero As String, pais As String, descripcion As String, imagen As Image, IsNew As Boolean)
            If IsNew Then 'El registro no existe:
                Try
    
                    'Conversion de Imagen y Guardado
                    If imagen Is Nothing Then
    
                        'Guardar
                        DatasTableAdapter.Insert(Id, Titulo, genero, descripcion, año, pais, Nothing)
    
                    Else
    
    		    'Conversión
                        Dim arrImage As Byte()
                        Dim myMs As New IO.MemoryStream
                        imagen.Save(myMs, imagen.RawFormat)
                        arrImage = myMs.GetBuffer()
    
                        'Guardar
                        DatasTableAdapter.Insert(Id, Titulo, genero, descripcion, año, pais, arrImage)
    
                    End If
    
    
                Catch ex As Exception
                    MsgBox("Code: Save(IsNew)" & ex.Message, MsgBoxStyle.Critical, "Bug!")
                End Try
            
    	Else 'El registro ya existe:
                Try
    
                    'Conversion de Imagen y Guardado
                    If imagen Is Nothing Then
    
                        'Guardar
                        DatasTableAdapter.UpdateQuery(Id, Titulo, genero, descripcion, año, pais, Nothing, Id)
    
                    Else
    
                        Dim arrImage As Byte()
                        Dim myMs As New IO.MemoryStream
                        'Convertir imagen a Bytes
                        imagen.Save(myMs, imagen.RawFormat)
                        arrImage = myMs.GetBuffer()
                        'Guardar
                        DatasTableAdapter.UpdateQuery(Id, Titulo, genero, descripcion, año, pais, arrImage, Id)
    
                    End If
    
                Catch ex As Exception
                    MsgBox("Code: Save(NotIsNew)" & ex.Message, MsgBoxStyle.Critical, "Bug!")
                End Try
    
            End If
        End Sub

    Así recupero la imagen cuando se hace click en un registro en el DGV:

        'Foto de Registro DGV
        Private Sub dgv_CellClick(sender As Object, e As DataGridViewCellEventArgs) Handles dgv.CellClick
    	'Foto as PictureBox
            Try
                If IsDBNull(dgv.Rows(e.RowIndex).Cells(6).Value) Then Foto.Image = Nothing : Exit Sub
                Using arrImage As New IO.MemoryStream(CType(dgv.Rows(e.RowIndex).Cells(6).Value, Byte()))
                    Foto.Image = Nothing
                    Dim img As Image = Image.FromStream(arrImage)
                    Foto.SizeMode = PictureBoxSizeMode.Zoom
                    Foto.Image = img
                End Using
            Catch ex As Exception
                MsgBox("Error getting image." & vbCrLf & ex.Message, MsgBoxStyle.Critical, "Bug!")
                Foto.SizeMode = PictureBoxSizeMode.CenterImage
                Foto.Image = Foto.ErrorImage
            End Try
    
        End Sub

    El problema es el siguiente: La imagen no se guarda, o al menos sí el tamaño, pero no la imagen completa.

    Abajo muestro la comparacion de la imagen original, y cuando la guardo y recupero de la base de datos:

     -> 

    Nota: Esta pregunta corresponde tanto a Desarrollo>Lenguaje Vb.Net, como a Acceso a Datos>Ado.Net General.-

    No se cual puede ser el problema. Las consultas? La conversion a bytes de la imagen o viceversa? 

    Gracias x pasar.



    Saludos. Atentamente Pablo Fac.


    • Editado Admin Pablo Fac domingo, 20 de noviembre de 2016 3:00 Agregué + info.
    • Combinado Enrique M. Montejo domingo, 4 de junio de 2017 10:58 Preguntas relacionadas
    domingo, 20 de noviembre de 2016 1:25
  • Hola buenas noches, te voy a enviar la manera en que guardo y recupero una imagen ha desde un picturebox ha una base de datos de SQL Server, espero te puede ayudar:

    Envio de la imagen:

    Imports System.Drawing.Imaging

     Public Function ImageToByteArray(ByVal imageIn As Image) As Byte()
            Dim ms As New MemoryStream()
            imageIn.Save(ms, ImageFormat.Jpeg)
            Return ms.ToArray()
        End Function

     objdatos.GetInsertArticuloRow(txtCodigoArticulo.Text, ImageToByteArray(PictureBox1.Image))

      Public Function GetInsertArticuloRow( GetInsertArticuloRow(ByVal strCodigo As String, ByVal imgCodigoEtiqueta As Byte()) as DataSet

     Try

                Dim datos As New DataSet()
                Dim connexion As New SqlConnection()
                Dim command As New SqlCommand()
                Dim da As New SqlDataAdapter()

                connexion.ConnectionString = connectionString
                command.Connection = connexion
                command.CommandText = "spInsertArticulo"
                command.Parameters.Add("@Codigo", SqlDbType.NVarChar, 100).Value = strCodigo
                command.Parameters.Add("@CodigoEtiqueta", SqlDbType.Image).Value = imgCodigoEtiqueta

      command.CommandType = CommandType.StoredProcedure
                da.SelectCommand = command
                da.Fill(datos)
                command.Connection.Close()
                command.Connection.Dispose()
                Return datos

            Catch ex As Exception

            End Try
        End Function

    recuperación de la imagen

    data_busqueda: es un datagridview (pues cargo en un datagidview la tabla que tiene el campo image)

      Dim data = TryCast(data_busqueda.Rows(Fila_Seleccionada).Cells(2).Value, Byte())
                        Dim stream = New MemoryStream(data)
                        frmArticulos.PictureBox1.Image = Image.FromStream(stream)

    viernes, 2 de junio de 2017 3:50
  • Hola @Admin Pablo Fac

    En este manual muestra como guardar una imagen a la base de datos y recuperarla analiza el código [WinForms] Edición Empleados – Grabar imagen en base de datos

    Espero la información brindada te sea de utilidad

    Saludos


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    sábado, 17 de junio de 2017 3:11