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

C# 高效处理超宽但不太高的位图?,c#,bitmap,memory-management,C#,Bitmap,Memory Management,有没有办法创建更节省空间/资源的位图? 目前我尝试渲染一个文件,大约800px高,但大约720000px宽。 它使我的应用程序崩溃,可能是因为位图的共享内存大小 我是否可以更有效地执行此操作,比如直接将其创建为gif,而不是稍后保存时 我试图从真实世界的读数中保存一系列线条/矩形,我希望它是1px/1/100秒。您必须: 强制x64环境并获得RAM的堆栈负载 改变你的架构 您的图像将略高于2 GB。您必须记住,加载到内存中的任何图像,无论是GIF或JPEG还是磁盘上的任何图像,都将转换为32

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

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


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

您必须:

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

  • 改变你的架构


您的图像将略高于2 GB。

您必须记住,加载到内存中的任何图像,无论是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

要处理这样大小的图像,必须将位图分解成块

我是否可以更高效地执行此操作,比如直接将其创建为gif,而不是稍后保存时

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

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


也可以将其保存在几个较小的不连续内存块中:而不是单个巨大内存块(如此巨大,以至于一开始就无法分配)。

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


(*)显示它作为练习留给读者。在谷歌打开ID的帮助下,检查Meta。StAccOfFuff.com您可能想考虑以纯文本格式存储数据,并将用户请求的任何部分呈现为图像(提供导出/导入功能)。您可能会担心这会更令人沮丧,因为用户需要使用您的程序来处理数据,但是处理巨大的图像对用户来说也很困难,所以无论哪种方式,您都会遇到麻烦。我很想知道您为什么需要这样的图像。即使切换到x64也无法立即解决问题。GC堆中的最大对象大小仍然为2GB,即使在.NET 2.0运行时的x64版本中也是如此。