2016-01-06 28 views
0

我知道有類似的帖子,但我沒有得到任何答案我的問題,因此發佈此。使用Image.FromStream返回圖像

我有一個方法,從圖像路徑中檢索並返回圖像。以下是我使用的代碼片段。這在某些情況下會失敗,因爲圖像在返回後丟失。

public static Image GetImageFromPicPath(string strUrl) 
{ 
    WebResponse wrFileResponse; 
    wrFileResponse = WebRequest.Create(strUrl).GetResponse(); 
    using (Stream objWebStream = wrFileResponse.GetResponseStream()) 
    { 
     return Image.FromStream(objWebStream); 
    } 
} 

如果我使用位圖類並返回圖像,元數據將丟失。

如果我使用MemoryStream(如下圖所示),並且我不配置MemoryStream,它就可以工作。但是這裏可能有內存泄漏。如果我使用block,圖像會丟失。

MemoryStream ms = new MemoryStream(); 
objWebStream.CopyTo(ms, 8192); 
return System.Drawing.Image.FromStream(ms); 

有人可以建議我最好的方法來解決這個問題。

在此先感謝!

+0

「圖像丟失」是什麼意思? – CodeCaster

+0

檢索到圖像後,我試圖顯示它。它給了我GDI +錯誤(如果使用我提到的第一個片段)。我假設圖像丟失。雖然不是很確定。 – subbu

回答

3

這就是爲什麼它不爲你工作(從https://msdn.microsoft.com/en-us/library/93z9ee4x(v=vs.110).aspx):

Image.FromStream Method remarks: You must keep the stream open for the lifetime of the Image.

這裏的覆蓋問題多一點後:Loading an image from a stream without keeping the stream open

試試這個:

public static Image GetImageFromPicPath(string strUrl) 
{ 
    using (WebResponse wrFileResponse = WebRequest.Create(strUrl).GetResponse()) 
    using (Stream objWebStream = wrFileResponse.GetResponseStream()) 
    { 
     MemoryStream ms = new MemoryStream(); 
     objWebStream.CopyTo(ms, 8192); 
     return System.Drawing.Image.FromStream(ms); 
    } 
} 

在你消費的代碼做這樣的事情:

using (var image = GetImageFromPicPath("http://imgur.com/123456.png")) 
{ 
    //use image 
} 

通過在using語句包裹「VAR形象」,Dispose()方法將在圖像被稱爲這也將Dispose()並釋放Image使用的底層MemoryStream。

3

使用MemoryStream並且不顯式關閉它。 Bitmap將通過其Dispose方法關閉它。沒有內存泄漏,只要您記住Dispose()即可。Bitmap完成之後。 (即使你不這樣做,MemoryStream最終會得到收集垃圾提供你放開Bitmap的一些點和Bitmap的唯一持有對它的引用。)

https://support.microsoft.com/en-us/kb/814675