2013-11-27 82 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將會覆蓋!