2016-01-06 78 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