2012-03-05 38 views
20

que utilizaConvertir matriz de bytes a la imagen en WPF

private BitmapImage byteArrayToImage(byte[] byteArrayIn) 
{ 
    try 
    {    
     MemoryStream stream = new MemoryStream(); 
     stream.Write(byteArrayIn, 0, byteArrayIn.Length); 
     stream.Position = 0; 
     System.Drawing.Image img = System.Drawing.Image.FromStream(stream); 
     BitmapImage returnImage = new BitmapImage(); 
     returnImage.BeginInit(); 
     MemoryStream ms = new MemoryStream(); 
     img.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp); 
     ms.Seek(0, SeekOrigin.Begin); 
     returnImage.StreamSource = ms; 
     returnImage.EndInit(); 

     return returnImage; 
    } 
    catch (Exception ex) 
    { 
     throw ex; 
    } 
    return null; 
} 

Este método en mi aplicación para convertir la matriz de bytes a una imagen. Pero lanza la excepción "El parámetro no es válido" ... ¿por qué está sucediendo ...? ¿Hay algún método alternativo?

+2

qué línea que lanza excepción? –

+0

System.Drawing.Image img = System.Drawing.Image.FromStream (stream); este código arroja la excepción mencionada ... –

+0

@BijoyKJose Sé que esto fue hace mucho tiempo, pero ¿ha encontrado una solución al problema '" No se encontró ningún componente de imágenes adecuado para completar esta operación "'. Estoy teniendo el mismo problema en este momento y no puedo encontrar ninguna solución. – CareTaker22

Respuesta

47

Hola, este debería estar trabajando:

private static BitmapImage LoadImage(byte[] imageData) 
    { 
     if (imageData == null || imageData.Length == 0) return null; 
     var image = new BitmapImage(); 
     using (var mem = new MemoryStream(imageData)) 
     { 
      mem.Position = 0; 
      image.BeginInit(); 
      image.CreateOptions = BitmapCreateOptions.PreservePixelFormat; 
      image.CacheOption = BitmapCacheOption.OnLoad; 
      image.UriSource = null; 
      image.StreamSource = mem; 
      image.EndInit(); 
     } 
     image.Freeze(); 
     return image; 
    } 
+1

Modifiqué mi propio fragmento de código y utilicé el tuyo también ... pero arrojó una excepción "No se encontró ningún componente de imagen adecuado para completar esta operación" después de ejecutar image.EndInit(); alguna solución para esto ...? –

+0

es tu conjunto de imageData? Este método funciona si los bytes se guardan primero en una secuencia o si carga los bytes de un archivo de imagen en la memoria; consulte aquí: http://msdn.microsoft.com/de-de/library/system.windows.media.imaging .bitmapimage.endinit.aspx – Carsten

+0

Gracias Carsten, me salvaste el tiempo :) – Homam

4

Si tiene variedad de esta manera:

byte[] byteArrayIn = new byte[] {255, 128, 0, 200}; 

Y quieres algo como: enter image description here

Uso:

BitmapSource bitmapSource = BitmapSource.Create(2, 2, 300, 300,PixelFormats.Indexed8, BitmapPalettes.Gray256, byteArrayIn, 2); 

Image.Source = bitmapSource; 

en XAML:

<Image RenderOptions.BitmapScalingMode="NearestNeighbor" RenderOptions.EdgeMode="Aliased" x:Name="Image"></Image> 
+0

¡Tu respuesta me salvó la vida! Fácil de entender solo la esencia. Después de 2 horas jugando con Pixelformats y BitmapPalettes es divertido ver lo fácil que es en realidad. – GreenEyedAndy

1
public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private void btnBrowse_Click(object sender, RoutedEventArgs e) 
    { 
     var of = new OpenFileDialog(); 
     of.Filter = "Image files (*.png;*.jpeg)|*.png;*.jpeg|All files (*.*)|*.*"; 
     var res = of.ShowDialog(); 
     if (res.HasValue) 
     { 
      imgPreview.Source = new BitmapImage(new Uri(of.FileName)); 

      var t = Utils.ConvertBitmapSourceToByteArray(imgPreview.Source as BitmapSource); 
      var d = Utils.ConvertBitmapSourceToByteArray(new BitmapImage(new Uri(of.FileName))); 
      var s = Utils.ConvertBitmapSourceToByteArray(imgPreview.Source); 
      var enc = Utils.ConvertBitmapSourceToByteArray(new PngBitmapEncoder(), imgPreview.Source); 
      //imgPreview2.Source = Utils.ConvertByteArrayToBitmapImage(enc); 
      imgPreview2.Source = Utils.ConvertByteArrayToBitmapImage2(enc); 
      //var i = 0; 


     } 
     else 
     { 
      MessageBox.Show("Select a currect file..."); 

     } 
    } 

} 

/util.cs/

public class Utils 
{ 
    public static byte[] ConvertBitmapSourceToByteArray(BitmapEncoder encoder, ImageSource imageSource) 
    { 
     byte[] bytes = null; 
     var bitmapSource = imageSource as BitmapSource; 

     if (bitmapSource != null) 
     { 
      encoder.Frames.Add(BitmapFrame.Create(bitmapSource)); 

      using (var stream = new MemoryStream()) 
      { 
       encoder.Save(stream); 
       bytes = stream.ToArray(); 
      } 
     } 

     return bytes; 
    } 

    public static byte[] ConvertBitmapSourceToByteArray(BitmapSource image) 
    { 
     byte[] data; 
     BitmapEncoder encoder = new JpegBitmapEncoder(); 
     encoder.Frames.Add(BitmapFrame.Create(image)); 
     using (MemoryStream ms = new MemoryStream()) 
     { 
      encoder.Save(ms); 
      data = ms.ToArray(); 
     } 
     return data; 
    } 
    public static byte[] ConvertBitmapSourceToByteArray(ImageSource imageSource) 
    { 
     var image = imageSource as BitmapSource; 
     byte[] data; 
     BitmapEncoder encoder = new JpegBitmapEncoder(); 
     encoder.Frames.Add(BitmapFrame.Create(image)); 
     using (MemoryStream ms = new MemoryStream()) 
     { 
      encoder.Save(ms); 
      data = ms.ToArray(); 
     } 
     return data; 
    } 
    public static byte[] ConvertBitmapSourceToByteArray(Uri uri) 
    { 
     var image = new BitmapImage(uri); 
     byte[] data; 
     BitmapEncoder encoder = new JpegBitmapEncoder(); 
     encoder.Frames.Add(BitmapFrame.Create(image)); 
     using (MemoryStream ms = new MemoryStream()) 
     { 
      encoder.Save(ms); 
      data = ms.ToArray(); 
     } 
     return data; 
    } 
    public static byte[] ConvertBitmapSourceToByteArray(string filepath) 
    { 
     var image = new BitmapImage(new Uri(filepath)); 
     byte[] data; 
     BitmapEncoder encoder = new JpegBitmapEncoder(); 
     encoder.Frames.Add(BitmapFrame.Create(image)); 
     using (MemoryStream ms = new MemoryStream()) 
     { 
      encoder.Save(ms); 
      data = ms.ToArray(); 
     } 
     return data; 
    } 

    public static BitmapImage ConvertByteArrayToBitmapImage(Byte[] bytes) 
    { 
     var stream = new MemoryStream(bytes); 
     stream.Seek(0, SeekOrigin.Begin); 
     var image = new BitmapImage(); 
     image.BeginInit(); 
     image.StreamSource = stream; 
     image.EndInit(); 
     return image; 
    } 
} 
+0

es posible que desee agregar alguna explicación .... – Jaap

Cuestiones relacionadas