我正在从web下载图像以将其保存在本地。它适用于任何其他图像格式,但当我尝试读取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#中阅读.web图像的?我发现了另一个允许在类型之间转换的问题,但我不想为C#做WebP库
我不想这么做的原因是因为我认为它可能会失去一些质量。此外,我想知道为什么这不起作用。
基类库不会帮助您处理WebP映像。但是,如果您只想将收到的文件保存到磁盘上,您甚至不必知道您正在处理WebP图像。您可以简单地将接收到的数据视为二进制blob并将其转储到文件中,例如使用Stream.CopyTo
和FileStream
。
Content-Type HTTP标头将为您提供正在下载的文件的mime类型,Content-Disposition标头可以为您提供文件名和扩展名(尽管您可能需要进行一些解析)。您可以使用HttpWebResponse.ContentType
和HttpWebResponse.Headers["Content-Disposition"]
访问这些。
@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将覆盖!