2013-06-18 108 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发信号通知初始化已完成 。初始化后,属性更改将被忽略。