如何在Windows 8应用程序中将字节数组绑定为图像

时间:2014-11-28 21:09:15

标签: c# database image xaml data-binding

我是这个网站的新手。这是我的第一个问题!希望somone知道答案。

这是交易,我有一个数据库,其实体将字节数组作为图片(实体属性之一)。 这是在将pic保存到DB之前将pic转换为byte []的代码:

public async Task<byte[]> ImageFileToByteArrayAsync(StorageFile file)
{
    IRandomAccessStream stream = await file.OpenAsync(Windows.Storage.FileAccessMode.Read);
    BitmapDecoder decoder = await BitmapDecoder.CreateAsync(stream);
    PixelDataProvider pixelData = await decoder.GetPixelDataAsync();
    return pixelData.DetachPixelData();
}

当我从数据库中拉出实体时,我发现它带有图片的正确数据为byte []。

我正在使用Windows 8.1应用程序和mvvmCross。在我的viewModel中,我有一个名为selectedGuest的完整道具。此属性包含当前访客。所有关于客人的信息都是succsessfuly转换为UI接受图像!这是图像的xaml:

 <Image Grid.Column="2" Source="{Binding SelectedGuest.Image, Converter={StaticResource ByteArrayToImageConverter}}"/>

这是转换器:

public class ByteArrayToImageConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        if (value == null || !(value is byte[]))
            return null;

        using (InMemoryRandomAccessStream stream = new InMemoryRandomAccessStream())
        {
            using (DataWriter writer = new DataWriter(stream.GetOutputStreamAt(0)))
            {
                writer.WriteBytes((byte[])value);
                writer.StoreAsync().GetResults();
            }
            BitmapImage image = new BitmapImage();
            image.DecodePixelHeight = 200;
            image.DecodePixelWidth = 150;
            image.SetSource(stream);
            return image;
        }
    }
    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        throw new NotImplementedException();
    }
}

当调试线程时,输入转换器和&#39;值&#39;是正确的!但是我无法看到图像。什么都没有,图像就不会显示出来了。

感谢观众!

1 个答案:

答案 0 :(得分:0)

您应该将原始编码图像缓冲区(即二进制图像文件内容)存储在数据库中,而不是原始像素数据:

public async Task<byte[]> ImageFileToByteArrayAsync(StorageFile file)
{
    var buffer = await FileIO.ReadBufferAsync(file);
    return buffer.ToArray();
}