从Byte []显示图像的最简单方法是什么?

时间:2016-07-20 09:31:46

标签: c# wpf image

我有一个包含黑白图像的结构:

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;
    }
}

但它不起作用:

  

&#34;来自HRESULT的异常:0x88982F50&#34;

2 个答案:

答案 0 :(得分: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; }

答案 1 :(得分: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;
    }