我一直在解决这个问题。我从我的数据库中获取图像作为byte [],我想将其转换为WritableBitmap,因此我可以使用绑定在我的xaml页面上显示它。
我正在使用它:
public class ImageConverter : IValueConverter
{
/// <summary>
/// Converts a Jpeg byte array into a WriteableBitmap
/// </summary>
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value is byte[])
{
MemoryStream stream = new MemoryStream((Byte[])value);
WriteableBitmap bmp = new WriteableBitmap(200, 200);
bmp.LoadJpeg(stream);
return bmp;
}
else
return null;
}
/// <summary>
/// Converts a WriteableBitmap into a Jpeg byte array.
/// </summary>
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
第一个问题是它不起作用。当它命中bmp.LoadJpeg(stream);
第二个问题是关于传递给WriteableBitmap构造函数的固定大小,我怎么知道来自db的照片大小?我可以以某种方式使它动态吗?我想第二个问题是第一个问题的原因。
感谢。
修改
我也尝试使用PictureDecoder.DecodeJpeg()
这样:
MemoryStream stream = new MemoryStream((Byte[])value);
WriteableBitmap bmp = PictureDecoder.DecodeJpeg(stream);
return bmp;
但它也没有用。在这种情况下PictureDecoder.DecodeJpeg
假设为我创建bmp对象。我仍然得到一个未指明的错误。可能是我通过了流的最大长度吗?
答案 0 :(得分:2)
我使用它但返回BitmapImage
。你需要WriteableBitmap
返回吗?
编辑:正如Ritch在评论中提到的,如果你确实需要返回WriteableBitmap
添加
var writeableBitmap = new WriteableBitmap(bitmapImage);
return writeableBitmap
第二个问题是关于传递给的固定大小 WriteableBitmap构造函数,我怎么知道照片的大小 来自db?
创建BitmapImage后,您可以访问bitmapImage.PixelWidth
和bitmapImage.PixelHeight
。
public class ByteArraytoImageConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null) return null;
var byteBlob = value as byte[];
var ms = new MemoryStream(byteBlob);
var bmi = new BitmapImage();
bmi.SetSource(ms);
return bmi;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
答案 1 :(得分:1)
感谢您的回答
似乎问题是来自数据库的流以某种方式被破坏了。价值转换器实际上还可以。我已将其更改为使用PictureDecoder.DecodeJpeg()
,因此它将更加干净和动态
public class ImageConverter : IValueConverter
{
/// <summary>
/// Converts a Jpeg byte array into a WriteableBitmap
/// </summary>
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value is byte[])
{
MemoryStream stream = new MemoryStream((Byte[])value);
WriteableBitmap bmp = PictureDecoder.DecodeJpeg(stream);
return bmp;
}
else
return null;
}
/// <summary>
/// Converts a WriteableBitmap into a Jpeg byte array.
/// </summary>
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}