【发布时间】:2015-05-24 09:31:31
【问题描述】:
理论上,如果你有足够的内存,它应该是 65,535 x 65,535,大约 17GB。
但是,创建一个 .NET 4.5 控制台应用程序来测试它,它会抛出 System.ArgumentException: Parameter is not valid。
该应用程序是为 64 位平台构建的。在 64 位平台上运行,内存为 32GB。我能够获得的最大分辨率是 22,000 x 22,000 像素。
我找不到任何关于此的文档。
奇怪的行为是,即使是 22,000 x 22,000 像素,它也并不总是有效。它有时有效,有时会引发异常。这让我觉得它与连续内存分配有关,但大约有 30GB 的可用内存。
有人有这方面的经验吗?如果我想使用 100,000 x 100,000 像素或更大的图像,除了实现我自己的位图之外,最好的方法是什么?
编辑:问题不在于 .NET 最大对象大小。这可以通过针对 64 位平台并在应用程序配置中设置 gcAllowVeryLargeObjects 标志来克服。通过这种方式,我可以让应用程序使用单个整数数组消耗超过 15GB 的内存。到目前为止,答案似乎在于 GDI+ 的底层实现,但我该如何解决呢?
【问题讨论】:
-
.NET 位图使用 GDI+,有关限制的讨论请参阅此问题stackoverflow.com/questions/2932436/…
-
我反汇编了 Bitmap(int,int) 的构造函数,它调用了 GdipCreateBitmapFromScan0,它必须返回一个错误代码。 Bitmap 构造函数将错误代码映射到各种 .NET 异常。
-
似乎没有真正的限制。
new Bitmap(33.488.914, 1)是在单个维度上对我有用的最大值。 -
65535 x 65535 是 jpeg 格式的最大限制 256*256