1

我正在从网络下载图像以将其保存在本地。它适用于任何其他图像格式,但是当我尝试读取 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 图像?我发现this other question允许在类型之间进行转换,但我不想为C#做那个WebP库

我不想这样做的原因是因为我认为它可能会失去一些质量。此外,我想知道为什么这不起作用。

4

2 回答 2

3

基类库不会帮助您处理 WebP 图像。但是,如果您只想将接收到的文件保存到磁盘,您甚至不必知道您正在处理的是 WebP 图像。您可以简单地将接收到的数据视为二进制 blob 并将其转储到文件中,例如使用Stream.CopyToFileStream.

Content-Type HTTP 标头将为您提供正在下载的文件的 MIME 类型,而Content -Disposition标头可以为您提供文件名和扩展名(尽管您可能需要进行一些解析)。HttpWebResponse.ContentType您可以使用和访问那些HttpWebResponse.Headers["Content-Disposition"]

于 2013-11-27T22:18:36.203 回答
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 将覆盖!

于 2013-12-04T17:39:42.627 回答