从流加载图像而不保持流打开

Ric*_*oss 14 c# image stream out-of-memory

是否可以使用System.Drawing.Image的FromStream方法而不必在图像的生命周期内保持流打开?

我有它加载了一堆从资源文件工具栏的图形,使用的组合应用程序Image.FromStreamAssembly.GetManifestResourceStream.

我遇到的问题是在Windows 7上工作正常,在Windows XP上,如果禁用链接到其中一个图像的用户界面元素,应用程序将崩溃.在Windows 7上,图像以灰度渲染.在XP上,它因内存不足异常而崩溃.

经过大量的脱毛后,我终于将它追溯到图像的初始加载.当然,如果我创建任何实现的对象IDisposable也在同一个方法中被销毁,我将它包装在using语句中,例如

using (Stream resourceStream = assembly.GetManifestResourceStream(resourceName))
{
   image = Image.FromStream(resourceStream);
}
Run Code Online (Sandbox Code Playgroud)

如果我删除using语句以便不处理流,则应用程序不再在XP上崩溃.但我现在有一堆"孤儿"流 - 图像存储在命令类中,这些图像在处理时正确处理图像,但原始流不是.

我检查了文档,FromStream确认流需要保持打开状态.为什么这个没有在Windows 7开发系统上崩溃和烧毁是一个谜!

我真的不希望这个流徘徊,我当然不希望存储对这个流以及图像的引用,以便我以后可以处理它.我只需要那个流一次,所以我想摆脱它:)

是否有可能创建图像,然后杀死那里的流?

Dir*_*mar 20

流需要打开的原因如下:

GDI +以及System.Drawing命名空间可以推迟原始图像位的解码,直到图像需要这些位.另外,即使在图像被解码之后,GDI +也可以确定丢弃用于大位图的存储器并且稍后重新解码更有效.因此,GDI +必须能够在BitmapImage对象的生命周期内访问图像的源位.

记录的解决方法是使用Graphics.DrawImage或创建Bitmap从原始图像索引的非索引图像,如下所述:

Bitmap和Image构造函数依赖项

  • Fwiw:他们在Vista版本的gdiplus.dll中解决了索引像素格式的几个问题.很高兴他们这样做,但是当你的代码需要在XP上运行时很头疼.一般来说,远离它们以避免这种麻烦. (2认同)