2010-04-12 44 views
5

有什么办法可以创建更多的空间/资源高效位图? 目前我尝试渲染一个文件,大约800px高,但大约720000px宽。 它崩溃我的应用程序,可能是因为位图的共享内存大小。有效处理超宽,但不是很高的位图?

我可以更有效地做到这一点,就像直接创建它,而不是以后保存它?

我尝试从真实世界的阅读中保存一系列线条/矩形,并且我希望它是每1/100秒的1px。

+1

对于谷歌开放ID的帮助,请检查meta.stackoverflow.com – MPelletier 2010-04-12 18:03:33

+0

您可能需要考虑以纯文本格式存储数据,并将用户请求的任何部分呈现为图像(使用提供的导出/导入功能)。由于用户需要使用您的程序来处理数据,所以您可能会担心这会更令人沮丧,但处理巨大图像对用户来说也很困难,所以您无论如何都会遇到麻烦。 – Brian 2010-04-12 18:13:58

+0

我很想知道你为什么需要这样的图像。 – Foole 2010-04-13 03:39:21

回答

2

你将不得不采取:

  • 力的x64环境,并获得RAM堆叠负荷。

  • 更改架构

你的形象将是一点点超过2 GB。

+1

即使切换到x64也不会立即解决问题。即使在.NET 2.0运行时的x64版本中,GC堆中的最大对象大小仍然为2GB。 – 2010-04-12 18:20:03

14

您必须记住,无论GIF或JPEG或磁盘上的任何图像,您加载到内存中的任何图像都会变成32位位图,这意味着每像素4个字节。

这意味着你正在创建的图像将是:

4 bytes * 800 pixels high * 720,000 pixels wide = 2,304,000,000 bytes 

你基本上,试图创建一个形象,大吹你的记忆。

无论你想要完成什么,答案是平铺和缓存你的图像

2

您的图像大约是2.3 gig,并且您可以拥有的最大的.Net对象是2 gig,无论该机器是32位还是64位。

你将不得不分解位图来处理大小的图像。

+0

+1 .NET obj大小天花板上的细节很好。 – 2011-01-21 02:00:12

0

我可以做得更有效率,就像直接创建它作为一个GIF,而不是以后当我保存它?

您可以在写入图像时压缩图像。它将不再处于(未压缩/未编码)“位图”格式。压缩算法的例子包括“游程长度编码”和“霍夫曼”。

另外,使用尽可能少的颜色深度:优选的黑白,即每像素1位。

也可以将它保存在几个较小的不连续的内存块中:而不是一个巨大的内存块(如此之大以至于甚至无法分配到最初)。

0

如果您将它创建为720000px高,800px宽的bmp,​​并在实际显示它时旋转它(*), ,则可以将数据直接流式传输到位图文件中。也许使用RLE而不是原始位图;在这种情况下,以这种方式流式传输仍然是可能的。

(*)显示它作为练习留给读者。你需要平铺或其他东西。