2012-03-30 70 views
0

我一直在解決這個問題一段時間。我從我的數據庫中獲取圖像作爲byte [],我想將其轉換爲WritableBitmap,以便我可以使用綁定將其顯示在我的xaml頁面上。字節數組到WriteableBitmap圖像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構造函數的固定大小,我怎麼知道來自數據庫的照片的大小?我可以讓它動態嗎?我想第二個問題是第一個問題的原因。

謝謝。

編輯

我也嘗試使用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

這不包括文件中的原始alpha數據。 – 2013-09-26 07:45:11

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

只需添加'變種WB =新的WriteableBitmap的(BMI);返回wb;'用於返回一個WriteableBitmap,雖然它看起來並不像這個問題實際需要的那樣。 – 2012-03-30 19:16:13

+0

好點,我會補充一點。 – 2012-03-30 19:20:12