将 byte[] 转换为 Windows.UI.Xaml.Media.Imaging.BitmapImage

Convert byte[] to Windows.UI.Xaml.Media.Imaging.BitmapImage

正在开发通用 Windows 应用程序并尝试在 xaml 中绑定作为字节数组的图像。我有点迷路了。在 xaml 我有类似的东西:

<Image Source="{Binding SelectedImageSource}"
           Stretch="UniformToFill"
           Grid.Row="1"/>

在我的视图模型中我有

private byte[] _selectedImageSource;
    public byte[] SelectedImageSource
    {
        get { return _selectedImageSource; }
        set
        {
            _selectedImageSource = value;
            OnPropertyChanged(nameof(SelectedImageSource));
        }
    }

但是我这里看不到图片。我认为我需要做的是将 byte[] 转换为 Windows.UI.Xaml.Media.Imaging.BitmapImage。我不是 100% 确定该怎么做,也不确定那是否是正确的做法。

试试这个:

public static async Task<BitmapImage> GetBitmapAsync(byte[] data)
{
    var bitmapImage = new BitmapImage();

    using (var stream = new InMemoryRandomAccessStream())
    {
        using (var writer = new DataWriter(stream))
        {
            writer.WriteBytes(data);
            await writer.StoreAsync();
            await writer.FlushAsync();
            writer.DetachStream();
        }

        stream.Seek(0);
        await bitmapImage.SetSourceAsync(stream);
    }

    return bitmapImage;
}

您也可以尝试更简单的版本 described here,但我认为我遇到了一些问题,这就是为什么我现在使用上面的代码。

@Andrey Ashikhmin 你的方法真好。

不过我还有一个方法就是使用WriteableBitmap。您可以通过 URI 和文件设置图像。

UWP 可以转换 WriteableBitmapbyte[]

将属性改为

private WriteableBitmap _selectedImageSource;
public WriteableBitmap SelectedImageSource
{
    get { return _selectedImageSource; }
    set
    {
        _selectedImageSource = value;
        OnPropertyChanged(nameof(SelectedImageSource));
    }
}

并将byte[]设置为WriteableBitmap

private async Task<ImageSource> FromBase64(byte[] bytes)
{

    var image = bytes.AsBuffer().AsStream().AsRandomAccessStream();

    // decode image
    var decoder = await BitmapDecoder.CreateAsync(image);
    image.Seek(0);

    // create bitmap
    var output = new WriteableBitmap((int)decoder.PixelHeight, (int)decoder.PixelWidth);
    await output.SetSourceAsync(image);
    return output;
}

如果你想从文件中读取,使用

    private static async Task<WriteableBitmap> OpenWriteableBitmapFile(StorageFile file)
    {
        using (IRandomAccessStream stream = await file.OpenAsync(FileAccessMode.Read))
        {
            BitmapDecoder decoder = await BitmapDecoder.CreateAsync(stream);
            WriteableBitmap image = new WriteableBitmap((int)decoder.PixelWidth, (int)decoder.PixelHeight);
            image.SetSource(stream);

            return image;
        }
    }

如果要将 WriteableBitmap 转换为 byte[],请参阅:http://lindexi.oschina.io/lindexi/post/win10-uwp-%E8%AF%BB%E5%8F%96%E4%BF%9D%E5%AD%98WriteableBitmap-BitmapImage/

Thx https://codepaste.net/ijx28i 给出代码。

工作正常:

    public async Task<BitmapImage> MyBitmapAsync(byte[] value)
    {
        if (value == null || !(value is byte[]))
            return null;
        using (InMemoryRandomAccessStream ms = new InMemoryRandomAccessStream())
        {
            using (DataWriter writer = new DataWriter(ms.GetOutputStreamAt(0)))
            {
                writer.WriteBytes((byte[])value);
                writer.StoreAsync().GetResults();
            }
            var image = new BitmapImage();
            image.SetSource(ms);
            return image;
        }
    }