【问题标题】:Load an image from URL as base64 string从 URL 加载图像作为 base64 字符串
【发布时间】:2016-05-26 04:35:39
【问题描述】:

我正在尝试将图像加载为 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();
        }

我尝试使用我在其他地方找到的这种方法将返回字符串编码为 base64,但是当将其放在 html 中时,图像仅显示典型的占位符。

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

编辑:

以下是 html 的外观:

【问题讨论】:

  • 恐怕真的不清楚你想做什么。网址是什么?图片?您是否正在创建 HTML,并希望将来自另一个 URL 的数据嵌入其中?如果是这样,我会在不使用 base64 或文本的情况下获取该数据...
  • 是的,网址指向图片并以 .jpg 结尾。这样做是有充分理由的,但它确实很复杂,我认为这不会增加我的问题。
  • @Liam 我不能这样做,html 会显示在不支持身份验证的 xamarin 表单 webview 中,所以这就是我需要手动加载图像的原因。
  • 在我写答案之前,你有什么理由不在这里使用HttpClient,而是使用旧的BeginGetResponseEndGetResponse
  • @JonSkeet 恐怕唯一的原因是我缺乏经验,所以我不知道更好:)

标签: c# url xamarin base64


【解决方案1】:

您必须先从磁盘获取图像,然后将其转换为 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;
  }
}

【讨论】:

  • 不,不需要先保存到磁盘。
  • @JonSkeet 我没这么说,重读我的答案,我说的是阅读
  • 那么我建议你重新阅读这个问题 - 图像不在 OP 机器上的 on 磁盘上。当然也没有必要在这里使用Image
【解决方案2】:

在我看来,您需要将仅在 HTML 中需要的 base64 部分与从响应中获取数据分开。只需从 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 的形式获取响应并使用它来传播内容类型。

我怀疑您可能也想在此处添加缓存:)

【讨论】:

  • 感谢您的回答,但遗憾的是,像我在问题中显示的那样将返回字符串输入到 html 字符串中仍然只会显示占位符
  • @StarterPack:所以您需要诊断出问题所在。查看方法中获得的字节 - 它们看起来适合您的图像吗?基本上,追溯整个过程。不知道发生了什么事,我不能再帮你了。
  • 我尝试在这里解码 base64 字符串 opinionatedgeek.com/dotnet/tools/base64decode 但它只是告诉我:“输入不是有效的 Base-64 字符串,因为它包含非 base 64 字符,超过两个填充字符,或填充字符中的非法字符。”显然输出已损坏,您还有其他想法我可以尝试什么吗?
  • 好吧,如果您尝试解码结果 * 包括图像/jpeg;base64,那么不,那是行不通的...用这么少的信息很难帮助您。我们不'不知道你得到了什么二进制数据,你的 HTML 最终是什么样的,等等。
  • 不,我没有包含“image/jpeg”等。我返回的字节数组大小为 [36623],所以我不知道如何向您展示。不过,当我查看时,我意识到所有条目都在 0-255 之间,所以一开始这似乎是一个不错的结果。
【解决方案3】:
 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)
                    {
                         
                    }
                }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-07
    • 2015-04-30
    • 1970-01-01
    • 2016-04-26
    • 2020-12-22
    相关资源
    最近更新 更多