байтовый массив для изображения WriteableBitmap IValueConverter для WP7 - PullRequest
0 голосов
/ 30 марта 2012

Я уже давно занимаюсь этой проблемой. Я получаю изображение из моей БД в виде байта [] и хочу преобразовать его в 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. Как я могу узнать размер фотографии, поступающей из БД? я могу сделать это как-то динамически? Я думаю, что вторая проблема является причиной первой.

Спасибо.

EDIT

Я также пытаюсь использовать PictureDecoder.DecodeJpeg() вот так:

            MemoryStream stream = new MemoryStream((Byte[])value);
            WriteableBitmap bmp = PictureDecoder.DecodeJpeg(stream);
            return bmp;

но это тоже не сработало. в этом случае PictureDecoder.DecodeJpeg предположим, что я создаю объект bmp. Я все еще получаю неуказанную ошибку. Может ли быть так, что я передал максимальную длину, разрешенную для потока?

Ответы [ 2 ]

2 голосов
/ 30 марта 2012

Я использую это, но он возвращает BitmapImage.Вам нужно WriteableBitmap вернуть?

edit: как упоминалось в комментариях Ritch, если вам нужно вернуть WriteableBitmap add

var writeableBitmap = new WriteableBitmap(bitmapImage);
return writeableBitmap

Вторая проблема касается фиксированного размера, передаваемого конструктору WriteableBitmapКак я могу узнать размер фотографии, которая поступает из БД?

После создания 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 голос
/ 30 марта 2012

Спасибо за ваш ответ

Кажется, проблема была в том, что поток, поступающий из БД, был как-то поврежден.преобразователь значений был на самом деле в порядке.я изменил его, чтобы использовать 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();
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...