2016-07-20 3 views
1

У меня есть структура, содержащее изображение в черно-белом:Что является самым простым способом отображения изображения с байта []?

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(). В зависимости от количества бит на пиксель и порядка альфа-и цветных каналов вам также нужно будет выбрать подходящий 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; 
    } 
Смежные вопросы