将字节数组转换为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; } }
- 是调用一个“空”参考(即没有用户事件)的扩展方法邪恶?
- 在Linux中测量时间 – 时间vs时钟vs getrusage vs clock_gettime vs gettimeofday vs timespec_get?
- 在List <T>中交换两个项目
- C#PredicateBuilder实体:参数'f'没有绑定在指定的LINQ to Entities查询expression式中
- redirect到ASP.Net中的当前页面
- 部分模板专业化“错误地使用不完整types”错误
- 是否有基于任务的替代System.Threading.Timer?
- 'while(1)`替代简化分支
- 如何获得以字节为单位的函数的长度?