2012-03-05 40 views
20

tôi đã sử dụngChuyển đổi byte mảng để hình ảnh trong 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; 
} 

Phương pháp này trong ứng dụng của tôi để chuyển đổi mảng byte để một hình ảnh. Nhưng nó ném "Parameter is not valid" ngoại lệ .. tại sao nó đang xảy ra ..? Có phương pháp thay thế nào không ??

+2

mà dòng ném ngoại lệ đó? –

+0

System.Drawing.Image img = System.Drawing.Image.FromStream (stream); mã này ném ngoại lệ được đề cập ... –

+0

@BijoyKJose Tôi biết đây là một thời gian dài trước đây, nhưng bạn đã tìm thấy một giải pháp cho vấn đề "" Không có thành phần hình ảnh phù hợp để hoàn thành hoạt động này đã được tìm thấy "'. Tôi đang gặp vấn đề tương tự tại thời điểm này và tôi không thể tìm thấy bất kỳ giải pháp nào. – CareTaker22

Trả lời

47

Hi này nên làm việc:

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

Tôi đã sửa đổi đoạn mã của riêng mình và tôi cũng sử dụng đoạn mã của bạn .. nhưng cả hai đều ném ngoại lệ "Không có thành phần hình ảnh nào phù hợp để hoàn thành thao tác này" sau khi thực hiện image.EndInit(); bất kỳ giải pháp cho điều này ..? –

+0

là tập hợp imageData của bạn? Phương thức này hoạt động nếu các byte được lưu trước tiên vào luồng hoặc nếu bạn tải byte của tệp hình ảnh vào bộ nhớ - hãy xem tại đây: http://msdn.microsoft.com/de-de/library/system.windows.media.imaging .bitmapimage.endinit.aspx – Carsten

+0

Cảm ơn Carsten, bạn đã tiết kiệm thời gian của tôi :) – Homam

4

Nếu bạn có mảng như thế này:

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

Và bạn muốn một cái gì đó như: enter image description here

Sử dụng:

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

Image.Source = bitmapSource; 

Trong XAML:

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

Câu trả lời của bạn đã cứu được ngày của tôi! Dễ hiểu chỉ là bản chất. Sau 2 giờ làm rối tung xung quanh với Pixelformats và BitmapPalettes thật vui khi thấy nó thực sự dễ dàng như thế nào. – 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

bạn có thể muốn thêm một số giải thích .... – Jaap

Các vấn đề liên quan