6

我正在做一些大学项目,但遇到了内存问题。我在 HDD 上加载了一个大约 1.5GB 的位图,代码如下:

Bitmap bmp = new Bitmap(pathToFile); 

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

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

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

PS:我需要将整个位图保存在内存中,因此将其分成几部分不是解决方案。

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

4

3 回答 3

1

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

如果您需要更多详细信息,请告诉我。

于 2012-06-16T17:48:00.470 回答
0

您可以停止内存缓存。

代替

Bitmap bmp = new Bitmap(pathToFile);

利用

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

https://stackoverflow.com/a/47424918/887092

于 2017-11-22T00:28:32.353 回答