2013-11-27 40 views
0

我正在从web上下载图像以在本地保存它。它适用于任何其他图像格式,但下面的这个方法在尝试读取WebP图像时失败,出现参数异常。使用C#ImageFormat类的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

如果您只想将图像保存到本地,为什么还要将图像解析为图像?只要将它视为二进制blob并将其转储到文件中,例如使用'Stream.CopyTo(new FileStream(...))'。你不会在基类库中找到任何东西来处理WebP图像。 – Trillian

+0

如果我这样做,我将如何能够指定扩展名?不能硬编码,因为它可能是C#无法识别的另一种格式。我需要该文件在我保存后立即可用。 – strider

+0

@Trillian,请让我知道你是否有任何想法。忘了在最后的评论中标记你的名字,所以不知道你是否得到通知。 – strider

回答

2

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

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

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将会覆盖!