【问题标题】:Returning Image using Image.FromStream使用 Image.FromStream 返回图像
【发布时间】:2016-01-06 19:07:24
【问题描述】:

我知道有类似的帖子,但我的问题没有任何答案,因此发布了这个。

我有一个从图像路径检索和返回图像的方法。下面是我使用的代码 sn-p。这在某些情况下会失败,因为图像在返回后会丢失。

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 它可以工作。但是这里可能存在内存泄漏。如果我使用 using 块,图像会丢失。

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

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

提前致谢!!

【问题讨论】:

  • “图像丢失”是什么意思?
  • 检索图像后,我试图显示它。它给了我 GDI+ 错误(如果使用我提到的第一个 sn-p)。我假设图像丢失了。不过不太确定。

标签: c# .net


【解决方案1】:

这就是为什么它不适合你(来自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
}

通过在 using 语句中包装“var image”,将在 image 上调用 Dispose(),同时 Dispose() 并释放 Image 正在使用的底层 MemoryStream。

【讨论】:

    【解决方案2】:

    使用MemoryStream,不要明确关闭它。 Bitmap 将在其 Dispose 方法中关闭它。没有内存泄漏,只要你完成后记得Dispose()Bitmap。 (即使你不这样做,MemoryStream 最终也会被垃圾回收,前提是你在某个时候放开了Bitmap,而Bitmap 是唯一持有对它的引用的东西。)

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

    【讨论】:

      猜你喜欢
      • 2014-09-30
      • 2010-10-15
      • 1970-01-01
      • 2017-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-30
      • 2021-07-30
      相关资源
      最近更新 更多