字节数组到WriteableBitmap图像IValueConverter用于WP7

时间:2012-03-30 18:07:17

标签: c# wpf silverlight windows-phone-7

我一直在解决这个问题。我从我的数据库中获取图像作为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对象。我仍然得到一个未指明的错误。可能是我通过了流的最大长度吗?

2 个答案:

答案 0 :(得分:2)

我使用它但返回BitmapImage。你需要WriteableBitmap返回吗?

编辑:正如Ritch在评论中提到的,如果你确实需要返回WriteableBitmap添加

var writeableBitmap = new WriteableBitmap(bitmapImage);
return writeableBitmap
  

第二个问题是关于传递给的固定大小   WriteableBitmap构造函数,我怎么知道照片的大小   来自db?

创建BitmapImage后,您可以访问bitmapImage.PixelWidthbitmapImage.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();
}
}