处理大型位图(最高3GB)

时间:2012-06-16 17:43:26

标签: c# file memory bitmap

我正在开展一些大学项目并且遇到内存问题。 我在硬盘上加载了一个大约1,5GB的位图,代码如下:

Bitmap bmp = new Bitmap(pathToFile); 

问题是新创建的Bitmap对象使用了大约3,5GB的RAM,这是我无法理解的(这是真正的大包装:E)。我需要到像素数组,并且使用Bitmap类非常有用(我稍后使用LockBits()方法,并且每个字节处理数组字节)但在这种情况下它是完全阻塞。所以这是我的问题:

有没有简单的方法来提取像素阵列而不需要额外的2gb?

我正在使用c#来提取所需的数组,后来用c ++处理 - 也许我可以用c ++提取所有需要的数据(但转换问题出现在这里 - 我专注于24bgr格式)?

PS:我需要将整个位图保留在内存中,因此将其拆分为部分并不是解决方法。

PS2:只是澄清一些问题:我知道文件扩展名和文件格式之间的区别。加载的文件是未压缩的位图,每个像素大小为1.42GB(16k x 32k像素)3个字节,那么为什么Bitmap对象大两倍多?任何解压缩问题和转换为其他格式都没有发生。

3 个答案:

答案 0 :(得分:1)

考虑使用内存映射文件来访问您的巨大数据:)。 您可以在此处找到一个关注您需要的示例:http://visualstudiomagazine.com/articles/2010/06/23/memory-mapped-files.aspx 它位于托管代码中,但您也可以使用等效的本机代码。

如果您需要更多详细信息,请与我们联系。

答案 1 :(得分:0)

您可以使用此解决方案,在C#中更快地使用位图 http://www.codeproject.com/Tips/240428/Work-with-bitmap-faster-with-Csharp

或者您可以使用内存映射文件

http://visualstudiomagazine.com/articles/2010/06/23/memory-mapped-files.aspx

答案 2 :(得分:0)

您可以停止内存缓存。

而不是

Bitmap bmp = new Bitmap(pathToFile);

使用

var bmp = (Bitmap)Image.FromStream(sourceFileStream, false, false);

请参阅https://stackoverflow.com/a/47424918/887092