高效处理超宽但不高的位图?

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

我可以更有效地执行此操作,例如直接将其创建为gif,而不是稍后保存它吗?

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

你必须记住,你加载到内存中的任何图像,无论它是GIF还是JPEG或磁盘上的任何东西,都会被转换为32位位图,这意味着每个像素有4个字节。

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

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

你通过尝试创建一个大的图像基本上是在吹嘘你的记忆。

无论你想要完成什么, 答案都是平铺和缓存你的形象

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

您将不得不以块的forms打破位图以处理大小的图像。

你将不得不:

  • 强制x64环境并获得堆栈的RAM负载。

  • 改变你的架构

您的图像将略高于2 GB。

我可以更高效地做到这一点,比如直接创建它作为gif,而不是在我保存它的时候吗?

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

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

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

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

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