gpt4 book ai didi

c# - C# .NET 位图的最大分辨率是多少?

转载 作者:太空狗 更新时间:2023-10-29 17:30:51 26 4
gpt4 key购买 nike

理论上,如果您有足够的内存(大约 17GB),它应该是 65,535 x 65,535。

但是,创建 .NET 4.5 控制台应用程序对其进行测试时,它会抛出 System.ArgumentException:参数无效。

该应用程序是为 64 位平台构建的。运行在具有 32GB 内存的 64 位平台上。我能够获得的最大分辨率是 22,000 x 22,000 像素。

我找不到关于此的任何文档。

奇怪的是,即使在 22,000 x 22,000 像素下,它也不总是有效。它有时有效,有时会抛出异常。这让我认为它与连续内存分配有关,但大约有 30GB 的可用内存。

有人有这方面的经验吗?如果我想使用 100,000 x 100,000 像素或更大的图像,除了实现我自己的位图之外,最好的方法是什么?

编辑:问题不在于 .NET 最大对象大小。这可以通过针对 64 位平台并在应用程序配置中设置 gcAllowVeryLargeObjects 标志来克服。通过这种方式,我可以让应用程序使用一个整数数组消耗超过 15GB 的内存。到目前为止,答案似乎在于 GDI+ 的底层实现,但我该如何绕过它?

最佳答案

这是 Windows 强加的 GDI+ 限制。 GDI+ 为位图的像素数据创建内存映射文件 View 。这使得它非常高效,位图往往很大并且 MMF 有助于将像素数据保留在页面文件之外。 RAM 页面可以简单地丢弃并从文件中重新读取。同样相当臭名昭著的是,许多程序员在忘记处理旧位图时看到他们的 Save() 调用失败并出现奇怪的异常。

Windows 限制 MMF 上的 View 可以有多大,换句话说,文件中可以直接寻址的数据量,如 this MSDN article 中所述。 :

The size of a file mapping object that is backed by a named file is limited by disk space. The size of a file view is limited to the largest available contiguous block of unreserved virtual memory. This is at most 2 GB minus the virtual memory already reserved by the process.

“最大可用连续 block ”是 32 位进程中的限制,往往徘徊在 ~600 MB 左右,或多或少。 2 GB 限制适用于 64 位进程。从技术上讲,GDI+ 可以通过重新映射 View 来绕过这个限制。但事实并非如此,LockBits() 方法(也在内部大量使用)效率低下且使用起来非常笨拙。

要使用更大的位图,您需要转到 GDI+ 的后继者 WIC (Windows Imaging Component)。通过 System.Windows.Media.Imaging 命名空间在 .NET 中公开。

关于c# - C# .NET 位图的最大分辨率是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29175585/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com