【发布时间】:2012-06-19 09:50:22
【问题描述】:
我正在从事一些大学项目,但遇到了内存问题。 我使用以下代码在 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 对象要大两倍以上呢?不会发生任何解压缩问题和转换为其他格式的问题。
【问题讨论】:
-
@Jason:是的,但这个问题没有实际答案。不知道他们为什么要监督内存映射文件。
-
位图使用什么编码?有 RLE 压缩吗?
-
位图的编码是 24 位的,没有 RLE 压缩,所以我唯一想要的就是反序列化像素数组 :( 它的大小是 16k X 32k 像素,所以每个像素 3 个字节需要 1.42GB所以我真的不明白为什么用该文件创建的 Bitmap 对象需要额外的 2GB 数据
-
忽略磁盘大小,图像的尺寸和位深度是多少。这将告诉您将图像数据保存在内存中的最低要求(将它们全部相乘 - 假设它不是索引图像 - 并且位深度为每个像素的字节数)。然后,这将告诉您是压缩等还是 Bitmap 类的内存开销是您的问题。