none
Reconstruir imagen atravez de los bites (Bites dentro de SQL Server) RRS feed

  • Pregunta

  • Hola vengo por aqui para terminar una cadena que tengo algunos problemas por WPF, veran estaba investigando sobre el tema de guardar las fotos en SQL Server y lo logre pero cuando estaba tratando de por asi decirlo rearmar la foto para mostrarla vi que hay un pequeño problema les enseño

     

    Dim sqlCmd As New SqlCommand(strSql, connection)
    
                                    'Get image data from DB
                                    Dim imageData As Byte() = DirectCast(sqlCmd.ExecuteScalar(), Byte())
    
                                    'Initialize image variable 
                                    Dim newImage As Image = Nothing
    
                                    If Not imageData Is Nothing Then
                                        'Read image data into a memory stream 
                                        Using ms As New MemoryStream(imageData, 0, imageData.Length)
                                            ms.Write(imageData, 0, imageData.Length)
                                            'Set image variable value using memory stream. 
                                            newImage = Image.FromStream(ms, True)
                                        End Using
    
    El problema esta en la parte que dice
    newImage = Image.FromStream(ms, True)
    
    En WPF marca error en "FromStream" y me percate que en VB.NET la clase image tiene una definicion totalmente diferente en WPF por que image paso a ser un objeto, como hago ahora para reconstruir la imagen que esta en bites y verla en un image.

     

    martes, 24 de enero de 2012 0:07

Respuestas

  • Puedes crear un BitmapImage y asignarle el MemoryStream a su propiedad StreamSource

    Dim bi As New BitmapImage()

    bi.BeginInit()
    bi.StreamSource = ms
    bi.EndInit()

    Para mostrarlo (al BitmapImage), puedes asignarlo como Source de un control Image

    Image1.Source = bi

    • Marcado como respuesta nobunagaii martes, 24 de enero de 2012 19:50
    martes, 24 de enero de 2012 1:02
  • Tal vez no deba usarse el Using

    dim ms as new MemoryStream(imageData)

    y con eso inicializas el BitmapImage. No me parece un Dispose del stream. Vos ya se lo entregaste al Bitmap. El tipo debería hacerse cargo desde allí. No sé. me parece.

    • Marcado como respuesta nobunagaii martes, 24 de enero de 2012 19:51
    martes, 24 de enero de 2012 1:54
  • Lo tengo el problema esta en esta linea

                    ms.Write(imageData, 0, imageData.Length)
    

    Habia que quitarla y como mencionaste declarar la varible de la memoria stream este el codigo funcial

                Dim imageData As Byte() = dt.Rows(0).Item("FOTO")
    
                'Initialize image variable 
                Dim bi As New BitmapImage()
    
                'Read image data into a memory stream 
                Dim ms As New MemoryStream(imageData)
                'Set image variable value using memory stream. 
                bi.BeginInit()
                bi.StreamSource = ms
                bi.EndInit()
                Foto.Source = bi
    
    Gracias por la ayuda

    • Marcado como respuesta nobunagaii martes, 24 de enero de 2012 19:51
    martes, 24 de enero de 2012 19:50

Todas las respuestas

  • Puedes crear un BitmapImage y asignarle el MemoryStream a su propiedad StreamSource

    Dim bi As New BitmapImage()

    bi.BeginInit()
    bi.StreamSource = ms
    bi.EndInit()

    Para mostrarlo (al BitmapImage), puedes asignarlo como Source de un control Image

    Image1.Source = bi

    • Marcado como respuesta nobunagaii martes, 24 de enero de 2012 19:50
    martes, 24 de enero de 2012 1:02
  • Hola gracias por responder revise lo que me diste y me da error esto es lo que dice "La imagen no se puede descodificar. El encabezado de la imagen está dañado."

    en el segmento de bi.endinit()

    dejo aqui el codigo completo

                'FOTO
                Dim cmd2 As SqlCommand
                query = "SELECT FOTO FROM ALUMNO WHERE CEDULA_X = @CEDULA"
                cmd2 = New SqlCommand(query, cnn)
                cmd2.Parameters.AddWithValue("@CEDULA", cmbnacion.Text & "-" & txtcedula_a.Text)
                cnn.Open()
                Dim imageData As Byte() = DirectCast(cmd2.ExecuteScalar(), Byte())
    
                'Initialize image variable 
                Dim bi As New BitmapImage()
    
                'Read image data into a memory stream 
                Using ms As New MemoryStream(imageData, 0, imageData.Length)
                    ms.Write(imageData, 0, imageData.Length)
                    'Set image variable value using memory stream. 
                    bi.BeginInit()
                    bi.StreamSource = ms
                    bi.EndInit()
                End Using
                Foto.Source = bi
    

    Foto=objeto image

    Nota: probe la imagen en otro software que use como referencia y la hay si me carga la imagen asi que la foto esta bien

    martes, 24 de enero de 2012 1:29
  • Tal vez no deba usarse el Using

    dim ms as new MemoryStream(imageData)

    y con eso inicializas el BitmapImage. No me parece un Dispose del stream. Vos ya se lo entregaste al Bitmap. El tipo debería hacerse cargo desde allí. No sé. me parece.

    • Marcado como respuesta nobunagaii martes, 24 de enero de 2012 19:51
    martes, 24 de enero de 2012 1:54
  • no sigue igual
    martes, 24 de enero de 2012 1:57
  • Lo tengo el problema esta en esta linea

                    ms.Write(imageData, 0, imageData.Length)
    

    Habia que quitarla y como mencionaste declarar la varible de la memoria stream este el codigo funcial

                Dim imageData As Byte() = dt.Rows(0).Item("FOTO")
    
                'Initialize image variable 
                Dim bi As New BitmapImage()
    
                'Read image data into a memory stream 
                Dim ms As New MemoryStream(imageData)
                'Set image variable value using memory stream. 
                bi.BeginInit()
                bi.StreamSource = ms
                bi.EndInit()
                Foto.Source = bi
    
    Gracias por la ayuda

    • Marcado como respuesta nobunagaii martes, 24 de enero de 2012 19:51
    martes, 24 de enero de 2012 19:50