xamarin 以base64字符串形式从URL加载图像

x759pob2  于 2023-04-09  发布在  其他
关注(0)|答案(4)|浏览(201)

我试图加载一个图像作为一个base 64字符串,这样我就可以显示在一个html像这样:

<html><body><img src="data:image/jpeg;base64,/></img></body></html>

下面是我的代码,但它并不真正工作:

public async static Task<string> getImage(string url)
   {
    var request = (HttpWebRequest)WebRequest.Create(url);
   request.Accept = "data:image/jpg;charset=base64";
   request.Credentials = new NetworkCredential(user, pw);
   using (var response = (HttpWebResponse)(await Task<WebResponse>.Factory.FromAsync(request.BeginGetResponse, request.EndGetResponse, null)))
        {
            StreamReader sr = new StreamReader(response.GetResponseStream());
            return sr.ReadToEnd();
        }

我试着用这个方法把return-String编码为base64,但是当把它放在html中时,图像只显示典型的占位符。

public static string Base64Encode(string plainText)
    {
        var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(plainText);
        return System.Convert.ToBase64String(plainTextBytes);
    }

编辑:
下面是HTML的外观:

fwzugrvs

fwzugrvs1#

在我看来,您需要将base64部分(仅在HTML中需要)与从响应中获取数据分开,只需从URL中获取二进制数据并将其转换为base64,使用HttpClient可以简化此操作:

public async static Task<string> GetImageAsBase64Url(string url)
{
    var credentials = new NetworkCredential(user, pw);
    using (var handler = new HttpClientHandler { Credentials = credentials })
    using (var client = new HttpClient(handler))
    {
        var bytes = await client.GetByteArrayAsync(url);
        return "image/jpeg;base64," + Convert.ToBase64String(bytes);
    }
}

这假设图像总是 * 将 * 是JPEG。如果它有时可能是不同的内容类型,您可能希望以HttpResponse的形式获取响应并使用它来传播内容类型。
我猜你可能也想在这里添加缓存:)

i7uq4tfw

i7uq4tfw2#

using (HttpClient client = new HttpClient())
                {
                    try
                    {
                        using (Stream stream = await client.GetStreamAsync(uri))
                        {
                            if (stream == null)
                                return (Picture)null;
                            byte[] buffer = new byte[16384];
                            using (MemoryStream ms = new MemoryStream())
                            {
                                while (true)
                                {
                                    int num = await stream.ReadAsync(buffer, 0, buffer.Length, cancellation);
                                    int read;
                                    if ((read = num) > 0)
                                        ms.Write(buffer, 0, read);
                                    else
                                        break;
                                }
                                imageData = Convert.ToBase64String(ms.ToArray());
                            }
                            buffer = (byte[])null;
                        } 
                    }
                    catch (Exception ex)
                    {
                         
                    }
                }
ukqbszuj

ukqbszuj3#

此解决方案适用于.NET Core 3.1

public static async Task<string> ImageUrlToBase64(string imageUrl)
  {
     using var httClient = new HttpClient();
     var imageBytes = await httClient.GetByteArrayAsync(imageUrl);                
     return Convert.ToBase64String(imageBytes);
  }

var encodedBase64 = WebUtility.UrlEncode(await ImageUrlToBase64(ImageUrl));

如果你在前端有JS,请使用以下代码:

var base64String = 'data:image/png;base64,' + encodedBase64;
$("#photo").attr('src', base64String);
bogh5gae

bogh5gae4#

你必须首先从磁盘中获取镜像,然后将其转换为byte[],然后再转换为base64。

public string ImageToBase64(Image image, System.Drawing.Imaging.ImageFormat format)
    {
      using (MemoryStream ms = new MemoryStream())
      {
    // Convert Image to byte[]
    image.Save(ms, format);
    byte[] imageBytes = ms.ToArray();

    // Convert byte[] to Base64 String
    string base64String = Convert.ToBase64String(imageBytes);
    return base64String;
  }
}

相关问题