加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 从流中加载图像,而不保持流打开

发布时间:2020-12-15 17:44:33 所属栏目:百科 来源:网络整理
导读:可以使用System.Drawing. Image的FromStream方法,而不必在图像的生命周期中保持流的打开状态吗? 我有一个应用程序从资源文件加载一堆工具栏图形,使用 Image.FromStream 和 Assembly.GetManifestResourceStream 的组合. 我遇到的问题是在Windows 7上工作正常
可以使用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);
}

如果我删除使用语句,以便流不被处理,那么应用程序不再在XP上崩溃.但是我现在有一堆“孤儿”流挂起来 – 图像存储在命令类中,并且在处理它们时正确处理图像,但原始流不是.

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

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

是否可以创建图像,然后杀死流,然后呢?

解决方法

流需要开放的原因是 following:

GDI+,and therefore the System.Drawing namespace,may defer the decoding of raw image bits until the bits are required by the image. Additionally,even after the image has been decoded,GDI+ may determine that it is more efficient to discard the memory for a large Bitmap and to re-decode later. Therefore,GDI+ must have access to the source bits for the image for the life of the Bitmap or the Image object.

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

07001

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读