繁体   English   中英

使用Image.FromStream返回图像

[英]Returning Image using Image.FromStream

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

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

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

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

提前致谢!!

这就是为什么它不适合你(来自https://msdn.microsoft.com/en-us/library/93z9ee4x(v=vs.110).aspx ):

Image.FromStream方法备注:您必须在Image的生命周期内保持流打开。

这里有一篇文章更多地介绍了这个问题: 从流中加载图像而不保持流打开

尝试这个:

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”,将在图像上调用Dispose(),这也将Dispose()并释放Image使用的底层MemoryStream。

使用MemoryStream并且不要显式关闭它。 Bitmap将在其Dispose方法中关闭它。 没有内存泄漏,只要你记得在完成后使用Dispose() Bitmap (即使你没有, MemoryStream最终会收集垃圾,只要你在某个时候放开Bitmap并且Bitmap是唯一持有它的引用。)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM