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

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”

最佳答案

BitmapImage.StreamSource属性仅接受包含编码位图缓冲区的流,例如PNG或JPEG。

为了从原始像素数据创建BitmapSourceBitmapImage的基类),可以使用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; }

关于c# - 从Byte []显示图像的最简单方法是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38477499/

10-13 07:46