我知道有类似的帖子,但我没有得到任何答案我的问题,因此张贴这个。
我有一个从图像路径中检索并返回图像的方法。以下是我使用的代码段。在某些情况下,由于图像在返回后丢失,因此失败。
public static Image GetImageFromPicPath(string strUrl)
{
WebResponse wrFileResponse;
wrFileResponse = WebRequest.Create(strUrl).GetResponse();
using (Stream objWebStream = wrFileResponse.GetResponseStream())
{
return Image.FromStream(objWebStream);
}
}
如果我使用Bitmap类并返回图像,则会丢失元数据。
如果我使用MemoryStream(如下所示)并且我没有配置MemoryStream它可以工作。但这里可能存在内存泄漏。如果我使用块,图像将丢失。
MemoryStream ms = new MemoryStream();
objWebStream.CopyTo(ms, 8192);
return System.Drawing.Image.FromStream(ms);
有人可以建议我解决此问题的最佳方法。
提前致谢!!
答案 0 :(得分:3)
使用MemoryStream
并且不要明确关闭它。 Bitmap
会以Dispose
方式关闭它。没有内存泄漏,只要你记得Dispose()
完成后Bitmap
。 (即使你没有,MemoryStream
最终也会收集垃圾,只要你在某个时候放开Bitmap
而Bitmap
是唯一可以引用的{{1}}它)。
答案 1 :(得分:3)
这就是为什么它不适合你(来自https://msdn.microsoft.com/en-us/library/93z9ee4x(v=vs.110).aspx):
这是一篇更详细介绍该问题的帖子: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
}
通过包装" var image"在using语句中,Dispose()将在image上调用,它也将Dispose()并释放Image使用的底层MemoryStream。