Ric*_*oss 14 c# image stream out-of-memory
是否可以使用System.Drawing.Image的FromStream方法而不必在图像的生命周期内保持流打开?
我有它加载了一堆从资源文件工具栏的图形,使用的组合应用程序Image.FromStream
和Assembly.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 +必须能够在Bitmap或Image对象的生命周期内访问图像的源位.
记录的解决方法是使用Graphics.DrawImage
或创建Bitmap
从原始图像索引的非索引图像,如下所述: