2016-07-20 9 views
1

私は黒と白の画像を含む構造を有する:Byte []から画像を表示する最も簡単な方法は何ですか?

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

マトリックス中に含有値はC#WPFを使用してコンポーネントでこの画像を表示するための最良の方法は、0または255

何ですか?

私はこれを試してみました:

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

の可能な重複Iをチェックし、その正確なコードはプロジェクトで私のために働いています – Paparazzi

+0

私はこの記事を見ましたが、私の 'LoadImage'はこれから始まりますが、例外があり、私のイメージが白黒であるために良い方法があるのだろうかと思っています –

答えて

5

BitmapImage.StreamSourceプロパティのみ符号化ビットマップバッファを含むストリームを受け入れ、例えばPNGまたはJPEG。

生のピクセルデータからBitmapSource(基本クラスはBitmapImage)を作成するには、BitmapSource.Create()メソッドを使用します。 1ピクセルあたりのビット数と、アルファチャンネルとカラーチャンネルの順序に応じて、適切な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; 
    } 
関連する問題