C#下载未知格式的图像

时间:2014-04-24 15:40:30

标签: c# html http

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

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

在任何互联网浏览器中,此页面显示图像,但在我的程序中,下载奇怪的数据。 我认为这个网址是假的或受到保护(我不太了解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等。

感谢。

4 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:0)

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

Image img;
var request = WebRequest.Create(DownloadAddress);

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

我不知道您是想要实际加载它还是只是下载它,但这样您就可以轻松检查它是否可行

img.Save(somePath);

答案 2 :(得分:0)

您无法获得图片,因为它位于Base64中,this online converter您可以粘贴来自网站的响应并将其转换为仅用于测试的图片。

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

如何解决问题:

  1. 尝试照常下载图片
  2. 检查它是否有效(尝试捕获异常并检查大小)
  3. 如果有例外,请尝试convert it from base64 like this
  4. 如果没有工作显示错误或将图像路径保存在某处以供日后查看
  5. 此外,您还可以添加对WebP图片的支持,因为它们正在变得越来越流行。有.net on codeplex

    的WebP库

答案 3 :(得分:0)

您可以随时使用

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