显示来自base64string的图像

本文关键字:图像 base64string 显示 | 更新日期: 2023-09-27 18:18:55

我正在显示来自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。

显示来自base64string的图像

图片可以解码为如下答案所示:

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文档的备注部分中解释:

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

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

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

可以吗?

您可以尝试以下操作

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