将字节数组转换为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; } 

这个方法在我的应用程序中将字节数组转换为图像。 但它会抛出“参数无效”例外..为什么它正在发生..? 有没有其他的方法。

嗨,这应该是工作:

  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; } 

如果你有这样的数组:

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

而你想要的东西是这样的: 在这里输入图像描述

使用:

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

在xaml中:

 <Image RenderOptions.BitmapScalingMode="NearestNeighbor" RenderOptions.EdgeMode="Aliased" x:Name="Image"></Image> 
 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; } }