1

我正在显示来自 API 的 base 64 字符串中的图像。问题是,图像没有显示出来。

这是代码:

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。

4

3 回答 3

3

图像可能会被解码,如本答案所示:

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

您必须使用的原因BeginInit并在BitmapImage MSDN 文档EndInit的备注部分中进行了说明:

BitmapImage 实现 ISupportInitialize 接口以优化多个属性的初始化。属性更改只能在对象初始化期间发生。调用 BeginInit 表示初始化已经开始,调用 EndInit 表示初始化已经完成。初始化后,属性更改将被忽略。

于 2013-06-18T09:57:49.323 回答
0

这可能是急于处理流的情况之一;此外,Write这里是不必要的:您已经通过构造函数添加了数据。所以就:

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

那样有用吗?

于 2013-06-18T09:24:29.647 回答
0

您可以尝试以下方法

byte[] binaryData = Convert.FromBase64String(x);
using (MemoryStream ms = new MemoryStream(binaryData))
{
    bitmapImage = (Bitmap)Image.FromStream(ms);
}
于 2013-06-18T09:47:39.087 回答