2012-03-30 1 views
0

Я занимаюсь этой проблемой в течение некоторого времени. Я получаю изображение из своей БД как байт [], и я хочу преобразовать его в WritableBitmap, поэтому я могу использовать привязку, чтобы показать ее на моей странице xaml.массив байтов для записиableBitmap изображение IValueConverter для WP7

Я использую это:

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? могу ли я сделать его динамичным как-то? Думаю, вторая проблема - причина первого.

Спасибо.

EDIT

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

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

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

ответ

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(); 
} 
} 
+0

Это не включает исходные альфа-данные из файла. –

2

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

редактировать: а Рич упоминается в комментариях, если вам нужно вернуться 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(); 
     } 
    } 
+0

Просто добавьте 'уаг М.Т. = новый WriteableBitmap (BMI); return wb; 'для возврата WriteableBitmap, хотя это не похоже, что это действительно необходимо для этой проблемы. –

+0

Хорошо, я добавлю. –

Смежные вопросы