¿Cómo puedo vincular una matriz de bytes a una imagen en WPF con un convertidor de valores?

Estoy intentando vincular una matriz Byte de mi databse a una imagen WPF.

Mi XAML:

   ...  

Modifiqué el código publicado por Ryan Cromwell para un convertidor de valor:

 Class BinaryImageConverter Implements IValueConverter Private Function Convert(ByVal value As Object, ByVal targetType As Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements IValueConverter.Convert If value IsNot Nothing AndAlso TypeOf value Is Byte() Then Dim bytes As Byte() = TryCast(value, Byte()) Dim stream As New MemoryStream(bytes) Dim image As New BitmapImage() image.BeginInit() image.StreamSource = stream image.EndInit() Return image End If Return Nothing End Function Private Function ConvertBack(ByVal value As Object, ByVal targetType As Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements IValueConverter.ConvertBack Throw New Exception("The method or operation is not implemented.") End Function End Class 

La línea i mage.EndInit() de la función Convert () de BinaryImageConverter lanza esta NotSupportedException :

“No se encontró ningún componente de imágenes adecuado para completar esta operación”.

InnerException: “Excepción de HRESULT: 0x88982F50”

No entiendo lo que estoy haciendo mal. ¿Cómo puedo hacer que esto funcione?


Actualizar

Parece que el problema fue que los bytes salieron de la base de datos. Debe haber habido un problema con la forma en que los estaba poniendo.

Ver mi código de trabajo a continuación.

Puede vincular un byte [] a una imagen.

Aquí una muestra:

Xaml:

  

Código:

 private byte[] userImage; public byte[] UserImage { get { return userImage; } set { if (value != userImage) { userImage = value; OnPropertyChanged("UserImage"); } } } 

Gracias por toda tu ayuda. Ahora lo tengo funcionando. Todavía no estoy seguro de cuál fue el problema.

Así es como pongo imágenes en mi base de datos …

 Private Sub ButtonUpload_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Dim FileOpenStream As Stream = Nothing Dim FileBox As New Microsoft.Win32.OpenFileDialog() FileBox.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyPictures) FileBox.Filter = "Pictures (*.jpg;*.jpeg;*.gif;*.png)|*.jpg;*.jpeg;*.gif;*.png|" & _ "All Files (*.*)|*.*" FileBox.FilterIndex = 1 FileBox.Multiselect = False Dim FileSelected As Nullable(Of Boolean) = FileBox.ShowDialog(Me) If FileSelected IsNot Nothing AndAlso FileSelected.Value = True Then Try FileOpenStream = FileBox.OpenFile() If (FileOpenStream IsNot Nothing) Then Dim ByteArray As Byte() Using br As New BinaryReader(FileOpenStream) ByteArray = br.ReadBytes(FileOpenStream.Length) End Using Dim g As New ZackGraphic g.Id = Guid.NewGuid g.ImageData = ByteArray g.FileSize = CInt(ByteArray.Length) g.FileName = FileBox.FileName.Split("\").Last g.FileExtension = "." + FileBox.FileName.Split(".").Last.ToLower g.DateAdded = Now Dim bmp As New BitmapImage bmp.BeginInit() bmp.StreamSource = New MemoryStream(ByteArray) bmp.EndInit() bmp.Freeze() g.PixelWidth = bmp.PixelWidth g.PixelHeight = bmp.PixelHeight db.AddToZackGraphic(g) db.SaveChanges() End If Catch Ex As Exception MessageBox.Show("Cannot read file from disk. " & Ex.Message, "Add a New Image", MessageBoxButton.OK, MessageBoxImage.Error, MessageBoxResult.OK) Finally If (FileOpenStream IsNot Nothing) Then FileOpenStream.Close() End If End Try End If End Sub 

Este es mi convertidor de valor utilizado para vincular una matriz de bytes a una imagen …

 Class BinaryImageConverter Implements IValueConverter Private Function Convert(ByVal value As Object, ByVal targetType As Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements IValueConverter.Convert If value IsNot Nothing AndAlso TypeOf value Is Byte() Then Dim ByteArray As Byte() = TryCast(value, Byte()) Dim bmp As New BitmapImage() bmp.BeginInit() bmp.StreamSource = New MemoryStream(ByteArray) bmp.EndInit() Return bmp End If Return Nothing End Function Private Function ConvertBack(ByVal value As Object, ByVal targetType As Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements IValueConverter.ConvertBack Throw New Exception("The method or operation is not implemented.") End Function End Class 

Este es mi XAML que utiliza el convertidor muestra la imagen …

     ...  

Intenta usar esto

 Dim imageSource as ImageSource Dim bitmapDecoder = new PngBitmapDecoder(stream, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.OnLoad); imageSource = bitmapDecoder.Frames[0]; imageSource.Freeze(); Return imageSource 

Creo que los bytes no son un formato de imagen legítimo. Creo que el código de error corresponde a WINCODEC_ERR_COMPONENTNOTFOUND , que sería coherente con los bytes no válidos.

¿En qué formato se supone que está la matriz de bytes? ¿Puedes guardarlo en el disco e intentar abrirlo con otro progtwig de imágenes?

Creo que esto es realmente un problema de permisos de seguridad. Intente ejecutar con privilegios de administrador, y vea si eso funciona, y vaya desde allí.

EDITAR: No estoy de acuerdo con el downvote y el comentario. Eche un vistazo a este enlace:

http://social.expression.microsoft.com/Forums/en-US/wpf/thread/617f6711-0373-44cc-b72c-aeae20f0f7a8/

Este usuario tuvo exactamente el mismo error y fue causado por la configuración de seguridad. Por lo tanto, respaldo mi respuesta (que puede no ser la causa, pero sin duda vale la pena intentarlo)