2013-07-09 48 views
2

我的WP7的應用程序有一個Image控件,其來源在XAML設定爲圖像設置爲內容的生成操作:如何將Image.Source轉換爲字節數組?

<Image x:Name="MyImage" Source="/Images/myimage.png"/> 

我需要這個圖像存儲在我的SQLCE數據庫作爲字節數組。這是我當前的代碼轉換爲byte []:

public byte[] ImageToArray() { 
    BitmapImage image = new BitmapImage(); 
    image.CreateOptions = BitmapCreateOptions.None; 
    image.UriSource = new Uri("/Images/myimage.png", UriKind.Relative); 
    WriteableBitmap wbmp = new WriteableBitmap(image); 
    return wbmp.ToArray(); 
} 

的字節數組保存到數據庫中,但是當我取回我的轉換器試圖將其轉換回(在不同的頁面),我得到「未指定錯誤。」這是我的轉換器:

public class BytesToImageConverter : IValueConverter { 
    public object Convert(object Value, Type TargetType, object Parameter, CultureInfo Culture) { 
     if(Value != null && Value is byte[]) { 
      byte[] bytes = Value as byte[]; 

      using(MemoryStream stream = new MemoryStream(bytes)) { 
       stream.Seek(0, SeekOrigin.Begin); 

       BitmapImage image = new BitmapImage(); 
       image.SetSource(stream); // Unspecified error here 
       return image; 
      } 
     } 

     return null; 
    } 

    public object ConvertBack(object Value, Type TargetType, object Parameter, CultureInfo Culture) { 
     throw new NotImplementedException("This converter only works for one way binding."); 
    } 
} 

我已經完成了相當多的搜索。就轉換器而言,我的代碼非常標準。我見過提及stream.Position = 0;是必要的,但我的理解是stream.Seek正在做同樣的事情;我已經嘗試了兩種。

由於我的轉換器與我現在在十幾個項目中使用的相同,我相當確信問題在於將Image控件的Source轉換爲字節數組,因此我的圖像數據已損壞。在我上面的代碼是硬編碼開放的,但我也試着

BitmapImage image = MyImage.Source as BitmapImage; 

沒有運氣。我已經在這裏呆了幾個小時,並在我的智慧結束。我錯過了什麼?

+0

此問題已經詢問[此處](http://stackoverflow.com/questions/9806332)。必須看到 –

回答

4

我認爲問題出在您的ImageToArray()方法中。您正在將您的WriteableBitmap對象轉換爲數組,但不是圖像本身。嘗試通過以下方法替換您的方法:

public byte[] ImageToArray() 
    { 
     BitmapImage image = new BitmapImage(); 
     image.CreateOptions = BitmapCreateOptions.None; 
     image.UriSource = new Uri("/Images/myimage.png", UriKind.Relative); 
     WriteableBitmap wbmp = new WriteableBitmap(image); 
     MemoryStream ms = new MemoryStream(); 
     wbmp.SaveJpeg(ms, wbmp.PixelWidth, wbmp.PixelHeight, 0, 100); 
     return ms.ToArray(); 
    } 

此方法將圖像寫入流爲jpg,並返回它的字節。我還沒有嘗試過這些代碼,但是你應該沒有問題使用你的轉換器將它轉換回BitmapImage

+1

我已經使用我的代碼一年多個已發佈的應用程序,但是如果你的代碼沒有解決它。看起來我需要重新評估我一直在做的事情。謝謝。 –

0

image.UriSource中的byte []可能是base64基數。您可以瀏覽SQL故事中的byte []或數據。 如果基數錯誤,不能逆轉爲從byte []流,所以如果基數是64,必須轉換爲16基數。