C#从未知格式下载图像

本文关键字:下载 图像 格式 未知 | 更新日期: 2023-09-27 17:59:49

我正在处理批量下载程序,但有些URL没有正确发送数据。

例如,此页面:http://i.imgbox.com/absMQK6A.png

在任何互联网浏览器中,这个页面都会显示图像,但在我的程序中,会下载奇怪的数据。我认为这个URL是假的或受保护的(我不太了解HTML。)

顺便说一句,在IE中,我可以用鼠标右键正常下载该图像并保存为图像。所以我想在我的程序中模仿这种行为。

我该怎么做?

下面是我的程序代码的一部分。

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(DownloadAddress);
if (Proxy != null)
{
    request.Proxy = Proxy;
}
if (!string.IsNullOrWhiteSpace(UserAgent))
{
    request.UserAgent = UserAgent;
}
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream downloadHttpStream = response.GetResponseStream();
int read = downloadHttpStream.Read(buffer, 0, buffer.Length);
// output codes

UserAgent是包含浏览器信息的字符串。如IE、Firefox等

谢谢。

C#从未知格式下载图像

如果您查看代码返回的数据的前几个字节,您可以看到它以1F 8B 08开始。这表明数据是gzip数据(gzip编码在网络上很常见)。您可以包含AutomaticDecompression属性,使.Net代码自动解压缩此数据并获得有效的PNG(字节以89 50 4E 47开头):

var request = (HttpWebRequest)HttpWebRequest.Create(DownloadAddress);
request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;

我不确定这是否是你想要的,尽管试试

Image img;
var request = WebRequest.Create(DownloadAddress);
using (var response = request.GetResponse())
using (var stream = response.GetResponseStream())
{
    img = Bitmap.FromStream(stream);
}

我不知道你是想真正加载它还是只是下载它,但这样你就可以很容易地检查它是否可行

img.Save(somePath);

您可以随时使用下载图像

var webClient = new WebClient();
byte[] buffer = webClient.DownloadData("http://i.imgbox.com/absMQK6A.png");

你不会得到一个图像,因为它在Base64中,有了这个在线转换器,你可以粘贴网站上的响应,并将其转换为图像,只用于测试。

此外,浏览器内置了对Base64编码图像的支持。它们通常用于内联嵌入小图标,以避免额外的http请求。

关于如何解决您的问题:

  1. 试着像往常一样下载图像
  2. 检查它是否有效(尝试捕获异常并检查大小)
  3. 如果有异常,请尝试像这样从base64转换它
  4. 如果不起作用,则显示错误或将图像路径保存到某个位置以供稍后检查

此外,您还可以添加对WebP图像的支持,因为它们正悄悄地变得越来越流行。在codeplex 上有一个用于.net的WebP库