将文件加载到位图中但保持原始文件不变在C#中如何做到这一点?如果我使用Bitmap.FromFile(),原始文件将被锁定。如果我使用Bitmap.FromStream(),原始文件不会被锁定,但文档中说“您必须在图像的生命周期内保持流打开”。这可能意味着文件仍然链接到图像对象(例如,如果文件发生变化,则对象发生变化,反之亦然)。我想要做的就是读取位图并将其保存到对象,然后文件和Image对象之间没有链接有关此行为的一些背景信息:Bitmapsusememorymappedfilestoaccesspixelsinthebitmap。这是WindowsAPI中的一个非常基本的工具,它允许非常有效的内存映射到文件数据。只有当程序读取内存时才从文件中读取数据,虚拟内存页面不占用Windows页面文件中的任何空间。完全相同的机制用于加载.NET程序集。内存映射锁定文件。这就是程序集在.NET程序中使用时被锁定的原因。Image.Dispose()方法释放锁。打锁通常意味着你忘记丢弃位图。非常重要的是,忘记调用Dispose()通常不会导致.NET类出现问题,但Bitmap除外,因为它需要大量(非托管)内存。是的,FromStream()阻止类进行这种优化。成本高,加载位图时需要双倍内存。当位图很大时,这将是一个问题,并且当程序运行一段时间(拆分地址空间)并且它不是在64位操作系统上运行时,你就会绕过OOM。如果位图的宽x高x4>=45MB,无论取舍,绝对避免这样做。一些代码,因此您不必跳过CopyStream圈:publicstaticImageLoadImageNoLock(stringpath){varms=newMemoryStream(File.ReadAllBytes(path));//不要使用using!!返回Image.FromStream(ms);请注意,您不想处理MemoryStream,如果您使用的是位图,则很难诊断“一般错误”。由Image类引起的惰性读取流。通过将文件从FileStream复制到MemoryStream来将文件读入内存。(在StackOverflow中搜索CopyStream以找到大量有关如何安全执行此操作的示例。基本上在读取时循环,将每个块写入内存流,直到没有更多数据可读取。)然后倒回MemoryStream(设置Position=0)和然后将其传递给Bitmap.FromStream。为了在不锁定文件的情况下创建图像,您必须创建图像的FileStream的副本。检查此页面在两个Stream实例之间复制的最佳方式-C#以了解如何复制流。之后,只需从复制的流中创建您的图像,您就可以开始了。我多次使用这种复制到MemoryStream,然后将MemoryStream发送到Bitmap.FromStream的技术。然而,该技术也存在问题。如果您打算稍后在加载的图像上使用Bitmap.Save方法之一,那么您将必须保持流活动(即在加载图像后不要处理它),否则您将得到可怕的“AgenericGDI+error发生了“异常!以上是C#学习教程:加载文件成位图,但保持原文件不变。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文来自网络收集,不代表作品如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处:
