2013-06-18 105 views
1

我顯示了來自API的基本64字符串的圖像。問題是,圖像沒有被顯示。顯示來自base64string的圖像

下面的代碼:

profilePictureImg.Source = GetUserImage(user.MobileNumber); 


private BitmapImage GetUserImage(string phoneNumber) 
    { 
     BitmapImage bitmapImage = new BitmapImage(); 

     var baseAddress = "http://192.168.0.103/vchatapi/api/Images/" + phoneNumber; 

     var http = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(new System.Uri(baseAddress)); 
     http.Accept = "application/json"; 
     http.ContentType = "application/json"; 
     http.Method = "GET"; 

     var response = http.GetResponse(); 

     var stream = response.GetResponseStream(); 
     var sr = new StreamReader(stream); 
     var content = sr.ReadToEnd(); 
     var y =""; 
     var x = y.FromJson(content); 

     byte[] binaryData = Convert.FromBase64String(x); 

     using (MemoryStream ms = new MemoryStream(binaryData, 0, binaryData.Length)) 
     { 
      ms.Write(binaryData, 0, binaryData.Length); 
      bitmapImage.StreamSource = ms; 

     } 
     return bitmapImage; 
    } 

任何想法?謝謝!

編輯:

得到了修復。出於某種原因,它需要調用BeginInit和EndInit。

回答

0

這可能是其支付而不是太熱情地部署流的情況之一;此外,這裏不需要Write:您已經通過構造函數添加了數據。所以只是:

bitmapImage.StreamSource = new MemoryStream(binaryData); 
return bitmapImage; 

是否有效?

+0

謝謝你的回覆。但圖像仍然不顯示。 – ljpv14

+0

那麼首先要檢查的是:你的'binaryData'是你期望的字節數?即您是否已成功獲取數據? –

+0

我會檢查這個。儘管如此,我對binaryData非常有信心。一段時間後會回覆你。 – ljpv14

0

你可以嘗試以下

byte[] binaryData = Convert.FromBase64String(x); 
using (MemoryStream ms = new MemoryStream(binaryData)) 
{ 
    bitmapImage = (Bitmap)Image.FromStream(ms); 
} 
3

的圖像可能被解碼如圖this answer

var binaryData = Convert.FromBase64String(x); 
var bitmapImage = new BitmapImage(); 

using (var stream = new MemoryStream(binaryData)) 
{ 
    bitmapImage.BeginInit(); 
    bitmapImage.CacheOption = BitmapCacheOption.OnLoad; 
    bitmapImage.StreamSource = stream; 
    bitmapImage.EndInit(); 
} 

爲什麼要使用BeginInitEndInit中的註釋部分解釋原因BitmapImage MSDN documentation

BitmapI mage實現ISupportInitialize接口以優化多個屬性的初始化 。在對象初始化期間,屬性更改只能發生 。調用BeginInit發信號通知 初始化已經開始,EndInit發信號通知初始化已完成 。初始化後,屬性更改將被忽略。