2012-03-30 15 views
0

私はしばらくこの問題に取り組んできました。私はDBからバイト[]としてイメージを取得し、WritableBitmapに変換したいので、バインディングを使ってxamlページに表示することができます。バイト配列からWriteableBitmapイメージへWPalueConverter for 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);

2番目の問題は、WriteableBitmapコンストラクタに渡される固定サイズに関するものです。どのようにしてdbから来ている写真のサイズを知ることができますか?何とかダイナミックにすることができますか?私は2番目の問題が最初の問題の原因だと思います。

ありがとうございました。

EDIT

は、私はまた、このようなPictureDecoder.DecodeJpeg()使用しようとしています

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

を、それはどちらか動作しませんでした。この場合、PictureDecoder.DecodeJpeg私のためのbmpオブジェクトを作成すると仮定します。私はまだ不特定のエラーが発生します。ストリームに許可されている最大長を超えている可能性がありますか?

答えて

1

おかげで問題は、DBからのストリームが何らかの形で破損したことだったようです。値コンバーターは実際に大丈夫でした。

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が返されますか?

編集:あなたが返す必要がない場合Ritchはコメントで述べたようにWriteableBitmapは、第二の問題は、私はサイズを知ることができる方法、 WriteableBitmapコンストラクタに渡された固定サイズについてです

var writeableBitmap = new WriteableBitmap(bitmapImage); 
return 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

ちょうど 'のvar WB =新しいWriteableBitmap(BMI)を追加し、よりクリーンでダイナミックになりますので、私が代わりにPictureDecoder.DecodeJpeg()を使用するように変更されました。 writeableBitmapを返すためには 'return wb;'が返されますが、実際にこの問題に必要なようには見えません。 –

+0

良い点、私はそれを追加します。 –

関連する問題