2012-01-17 65 views
14

我需要幫助,我有這樣的方法從一個byte []如何轉換字節[]到BitmapImage的

public BitmapSource ByteToBitmapSource(byte[] image) 
{ 
    BitmapImage imageSource = new BitmapImage(); 

    using (MemoryStream stream = new MemoryStream(image)) 
    { 
     stream.Seek(0, SeekOrigin.Begin); 
     imageSource.BeginInit(); 
     imageSource.StreamSource = stream; 
     imageSource.CacheOption = BitmapCacheOption.OnLoad; 
     imageSource.EndInit(); 
    } 

    return imageSource; 
} 

imageSource.EndInit();拋出一個錯誤得到的BitmapImage「我們找到了適合完成這個操作沒有成像組件「。

+2

格式是什麼你想圖像加載?你確定它支持嗎? – Shimmy 2012-01-17 15:27:56

回答

0

您應該爲我們提供更多關於您的圖片的信息。
我可以認爲它不受系統支持,我會建議您使用外部工具,例如imageMagik或任何其他專用於圖像的轉換器。

0

我做了類似的東西,但它不是與BitmapImage的,希望它可以幫助...

首先,我從路徑獲取圖像,所以我得到一個BMP,鑄成一個byte [] :

private byte[] LoadImage(string szPathname) 
    { 
    try 
    { 
     Bitmap image = new Bitmap(szPathname, true); 

     MemoryStream ms = new MemoryStream(); 
     image.Save(ms, ImageFormat.Bmp); 
     return ms.ToArray(); 
    }catch (Exception){...} 

    return null; 
    } 

我把這個在我的代碼是這樣的:

byte[] bitmapData1 = LoadImage(@"C:\Users\toto\Desktop\test1.bmp"); 

而當我想以字節[]澆鑄成System.Windows.Controls.Image我這樣做:

protected virtual void OnByteArrayChanged(DependencyPropertyChangedEventArgs e) 
    { 
    try 
    { 
     // PropertyChanged method 
     BitmapImage bmpi = new BitmapImage(); 
     bmpi.BeginInit(); 
     bmpi.StreamSource = new MemoryStream(ByteArray); 
     bmpi.EndInit(); 

     System.Windows.Controls.Image image1 = (get my image in my xaml); 
     image1.Source = bmpi; 
    }catch (Exception){...} 
    } 
24

Image.Source設置爲XAML中的字節數組屬性。

<Image x:Name="MyImage" Source="{Binding Path=MyByteArrayProperty}" /> 

如果你真的你可以在代碼中做背後這樣

public void DecodePhoto(byte[] byteVal) 
     { 
      if (byteVal == null) 
{ 
return ; 
} 


      try 
      { 
       MemoryStream strmImg = new MemoryStream(byteVal); 
       BitmapImage myBitmapImage = new BitmapImage(); 
       myBitmapImage.BeginInit(); 
       myBitmapImage.StreamSource = strmImg; 
       myBitmapImage.DecodePixelWidth = 200; 
       myBitmapImage.EndInit(); 
       MyImage.Source = myBitmapImage; 
      } 
      catch (Exception) 
      { 
      } 
     } 
+0

當ImageSource類型爲ImageSource時,如何將Image.Source設置爲byte []? – TimothyP 2012-11-26 09:56:29

+3

@TimothyP我的意思是在XAML中。 0x4f3759df 2012-11-26 14:59:32

0

這也可能有助於:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Navigation; 
using System.Windows.Shapes; 

using System.Drawing; 
using System.Runtime.InteropServices; 
using System.IO; 
using System.ComponentModel; 


public class MakeBitmapSource 
{ 
    [DllImport("kernel32.dll", EntryPoint = "RtlMoveMemory")] 
    public static extern void CopyMemory(IntPtr Destination, IntPtr Source, uint Length); 



    public static BitmapSource FromNativePointer(IntPtr pData, int w, int h, int ch) 
    { 
     PixelFormat format = PixelFormats.Default; 

     if (ch == 1) format = PixelFormats.Gray8; //grey scale image 0-255 
     if (ch == 3) format = PixelFormats.Bgr24; //RGB 
     if (ch == 4) format = PixelFormats.Bgr32; //RGB + alpha 


     WriteableBitmap wbm = new WriteableBitmap(w, h, 96, 96, format, null); 
     CopyMemory(wbm.BackBuffer, pData, (uint)(w * h * ch)); 

     wbm.Lock(); 
     wbm.AddDirtyRect(new Int32Rect(0, 0, wbm.PixelWidth, wbm.PixelHeight)); 
     wbm.Unlock(); 

     return wbm; 
    } 

    public static BitmapSource FromArray(byte[] data, int w, int h, int ch) 
    { 
     PixelFormat format = PixelFormats.Default; 

     if (ch == 1) format = PixelFormats.Gray8; //grey scale image 0-255 
     if (ch == 3) format = PixelFormats.Bgr24; //RGB 
     if (ch == 4) format = PixelFormats.Bgr32; //RGB + alpha 


     WriteableBitmap wbm = new WriteableBitmap(w, h, 96, 96, format, null); 
     wbm.WritePixels(new Int32Rect(0, 0, w, h), data, ch * w, 0); 

     return wbm; 
    } 
}