使用Image.FromStream返回图像

时间:2016-01-06 19:07:25

标签: c# .net

我知道有类似的帖子,但我没有得到任何答案我的问题,因此张贴这个。

我有一个从图像路径中检索并返回图像的方法。以下是我使用的代码段。在某些情况下,由于图像在返回后丢失,因此失败。

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); 

有人可以建议我解决此问题的最佳方法。

提前致谢!!

2 个答案:

答案 0 :(得分:3)

使用MemoryStream并且不要明确关闭它。 Bitmap会以Dispose方式关闭它。没有内存泄漏,只要你记得Dispose()完成后Bitmap。 (即使你没有,MemoryStream最终也会收集垃圾,只要你在某个时候放开BitmapBitmap是唯一可以引用的{{1}}它)。

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

答案 1 :(得分: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
}

通过包装" var image"在using语句中,Dispose()将在image上调用,它也将Dispose()并释放Image使用的底层MemoryStream。