从 URL 加载图像作为 base64 字符串
Load an image from URL as base64 string
我正在尝试将图像加载为 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 的外观如下:
您必须先从磁盘获取图像,然后将其转换为 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;
}
}
在我看来,您需要将仅在 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
获取并使用它来传播内容类型。
我怀疑您可能也想在这里添加缓存 :)
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)
{
}
}
我正在尝试将图像加载为 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 的外观如下:
您必须先从磁盘获取图像,然后将其转换为 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;
}
}
在我看来,您需要将仅在 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
获取并使用它来传播内容类型。
我怀疑您可能也想在这里添加缓存 :)
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)
{
}
}