2016-07-20 120 views
1

我有一個包含在圖像的結構黑白:從Byte []顯示圖像的最簡單方法是什麼?

public class Img 
{ 
    public int height; 
    public int width; 
    public byte[] matrix; 
} 

含在基質中的值是0或者255

什麼是顯示使用C#WPF在組件此圖像的最佳方式?

我已經嘗試:

XAML:

<Image Grid.Row="0" 
     Stretch="Uniform" 
     Source="{Binding Picture, Mode=OneWay,UpdateSourceTrigger=PropertyChanged}"/> 

C#:

public BitmapImage Picture 
{ 
    get 
    { 
     return _picture; 
    } 
    private set 
    { 
     _picture = value; 
     OnPropertyChanged("Picture"); 
    } 
} 

public void Generate() 
{ 
    Img img = CreateImg(); 
    Picture = LoadImage(img.width, img.height, img.matrix); 
} 

private BitmapImage LoadImage(int w, int h, byte[] imageData) 
{ 
    using (MemoryStream memory = new MemoryStream(imageData)) 
    { 
     memory.Position = 0; 
     BitmapImage bitmapimage = new BitmapImage(); 
     bitmapimage.BeginInit(); 
     bitmapimage.StreamSource = memory; 
     bitmapimage.EndInit(); 
     return bitmapimage; 
    } 
} 

但它不工作:

從HRESULT

「異常: 0x88982F50「

+0

[轉換字節數組在WPF圖像](http://stackoverflow.com/questions/9564174/convert-byte-array-to-image-in-wpf)可能的複製 – JeffRSon

+0

我檢查和確切的代碼適合我在一個項目 – Paparazzi

+0

我看過這篇文章,我的'LoadImage'從這開始,但我有一個異常,並想知道是否有更好的方式,因爲我的圖像在黑色/白色 –

回答

5

BitmapImage.StreamSource屬性只接受包含一個編碼的位圖緩衝器的流,例如一個PNG或JPEG。

爲了從原始像素數據創建BitmapSource(基類BitmapImage),您可以使用BitmapSource.Create()方法。根據每個像素的位數以及alpha和顏色通道的順序,您還需要選擇合適的PixelFormat

假設一個8位灰度格式,你可以創建一個的BitmapSource這樣的:

private BitmapSource LoadImage(int width, int height, byte[] imageData) 
{ 
    var format = PixelFormats.Gray8; 
    var stride = (width * format.BitsPerPixel + 7)/8; 

    return BitmapSource.Create(width, height, 96, 96, format, null, imageData, stride); 
} 

當然,你也將不得不改變你的財產,以BitmapSource類型(這是比較靈活的,無論如何,因爲你仍然可以分配一個BitmapImage)。

public BitmapSource Picture { get; set; } 
+0

它完美的工作!謝謝 –

0

嘗試this

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; 
    } 
相關問題