我正在从网上下载图片以在本地保存。它适用于任何其他图像格式,但当我尝试读取WebP图像时,下面的方法失败并带有参数异常。
private static Image GetImage(string url)
{
try
{
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
return Image.FromStream(response.GetResponseStream());
}
catch
{
return null;
}
}
你如何在C#中阅读.webp图像? 我发现了另一个允许在不同类型之间进行转换的问题,但我不想这样做WebP library for C#
我不想这样做的原因是因为我认为它可能会失去一些品质。此外,我想知道为什么这不起作用。
答案 0 :(得分:3)
基类库不会帮助您处理WebP图像。但是,如果您只想将收到的文件保存到磁盘,则不必知道您正在处理WebP图像。您可以简单地将收到的数据视为二进制blob并将其转储到文件中,例如使用Stream.CopyTo
和FileStream
。
Content-Type HTTP标头会为您提供您正在下载的文件的mime类型,Content-Disposition标头可以为您提供文件名和扩展名(尽管您可能需要这样做)一些解析)。您可以使用HttpWebResponse.ContentType
和HttpWebResponse.Headers["Content-Disposition"]
。
答案 1 :(得分:1)
@Trillian钉了它。这是我根据他的建议做的代码片段。想要添加代码,不要将其作为评论发布。
要获得图像文件扩展名,您可以执行此操作
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
string fileExt = response.ContentType.Replace("image/", string.Empty);
要获取带扩展名的文件名,您可以执行以下操作并像上面那样进行解析。它只有更多的数据。
response.Headers["Content-Disposition"];
如果您有要保存的文件名,请创建文件流并将响应流复制到其中。
FileStream fs = new FileStream(targetPath + fileName, FileMode.Create);
response.GetResponseStream().CopyTo(fs);
假设您的应用有权访问目标,则应保存图像。确保添加try catch并正确处理异常。另请注意,如果文件已存在,FileMode.Create将覆盖!