我已经编写了一些代码来从我的 Blogger 博客中导入内容。一旦我下载了所有的 HTML 内容,我就会浏览图像标签并下载相应的图像。在很多情况下,System.Drawing.Bitmap.FromStream 会抛出 ArgumentException。我正在下载的 URL 看起来不错,它按预期提供图像(这是问题图像之一的 URL: http://4.bp.blogspot.com/_tSWCyhtOc38/SgIPcctWRZI/AAAAAAAAAGg/2LLnVPxsogI/s1600-h/IMG_3590.jpg )。
private static System.Drawing.Image DownloadImage(string source)
{
System.Drawing.Image image = null;
// used to fetch content
var client = new HttpClient();
// used to store image data
var memoryStream = new MemoryStream();
try
{
// fetch the image
var imageStream = client.GetStreamAsync(source).Result;
// instantiate a system.drawing.image from the data
image = System.Drawing.Bitmap.FromStream(imageStream, false, false);
// save the image data to a memory stream
image.Save(memoryStream, image.RawFormat);
}
catch (IOException exception)
{
Debug.WriteLine("{0} {1}", exception.Message, source);
}
catch (ArgumentException exception)
{
// sometimes, an image will link to a web page, resulting in this exception
Debug.WriteLine("{0} {1}", exception.Message, source);
}
catch (AggregateException exception)
{
// sometimes, an image src will throw a 404
Debug.WriteLine("{0} {1}", exception.Message, source);
}
finally
{
// clean up our disposable resources
client.Dispose();
memoryStream.Dispose();
}
return image;
}
知道为什么在这里抛出 ArgumentException 吗?
编辑:我想到这可能是代理问题,所以我在 web.config 中添加了以下内容:
<system.net>
<defaultProxy enabled="true" useDefaultCredentials="true">
<proxy usesystemdefault="True" />
</defaultProxy>
</system.net>
但是,添加该部分没有任何区别。
编辑:此代码是从 EF 数据库初始值设定项的上下文中调用的。这是一个堆栈跟踪:
最佳答案
好的,我发现了问题。事实证明,在某些情况下,Blogger 会引用呈现图像的 HTML 页面,而不是引用图像本身。因此,这种情况下的响应不是有效图像。在尝试保存图像数据之前,我添加了代码来检查响应 header ,这解决了问题。为了其他遇到此问题的人的利益,这里是更新后的代码:
private static System.Drawing.Image DownloadImage(string source)
{
System.Drawing.Image image = null;
// used to fetch content
var client = new HttpClient();
// used to store image data
var memoryStream = new MemoryStream();
try
{
// Blogger tacks on a -h to an image Url to link to an HTML page instead
if (source.Contains("-h/"))
source = source.Replace("-h/", "/");
// fetch the image
var response = client.GetAsync(source).Result;
response.EnsureSuccessStatusCode();
var contentType = response.Content.Headers.ContentType.MediaType;
if (!contentType.StartsWith("image/"))
{
Debug.WriteLine(contentType);
throw new ArgumentException("Specified source did not return an image");
}
var imageStream = response.Content.ReadAsStreamAsync().Result;
// instantiate a system.drawing.image from the data
image = System.Drawing.Bitmap.FromStream(imageStream, true, true);
// save the image data to a memory stream
image.Save(memoryStream, image.RawFormat);
}
catch (HttpRequestException exception)
{
// sometimes, we'll get a 404 or other unexpected response
Debug.WriteLine("{0} {1}", exception.Message, source);
}
catch (IOException exception)
{
Debug.WriteLine("{0} {1}", exception.Message, source);
}
catch (ArgumentException exception)
{
// sometimes, an image will link to a web page, resulting in this exception
Debug.WriteLine("{0} {1}", exception.Message, source);
}
finally
{
// clean up our disposable resources
client.Dispose();
memoryStream.Dispose();
}
return image;
}
关于c# - 从流实例化位图时出现 ArgumentException,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11415461/