我正在做一个大学项目,结果被记忆问题卡住了。我用下面的代码在硬盘上加载了一个大约需要1.5 on的位图:
Bitmap bmp = new Bitmap(pathToFile); 问题是,新创建的Bitmap对象使用了大约3.5 is的RAM,这是我不能理解的(这是一个很大的包装器:E)。我需要找到像素数组,使用Bitmap类真的很有帮助(我稍后使用LockBits()方法,逐字节处理数组字节),但在本例中它是完全阻塞的。所以我的问题是:
有没有什么简单的方法来提取像素阵列,而不需要额外借出2 2gb?
我使用c#只是为了提取所需的数组,该数组稍后在c++中处理-也许我可以在c++中提取所有需要的数据(但这里出现了转换问题-我专注于24bgr格式)?
PS:我需要将整个位图保存在内存中,所以将它分成几个部分是没有解决办法的。
PS2:只是为了澄清一些问题:我知道文件扩展名和文件格式之间的区别。加载的文件是未压缩的位图,每像素3字节,大小约为1.42 is (16k x 32k像素),那么为什么bitmap对象要大两倍以上呢?任何解压和转换成其他格式的问题都不会发生。
发布于 2012-06-17 01:48:00
考虑使用内存映射文件来访问您的巨大数据:)。可以在这里找到一个专注于您所需的示例:http://visualstudiomagazine.com/articles/2010/06/23/memory-mapped-files.aspx它是在托管代码中,但您也可以从等效的本机代码中使用它。
如果你需要更多细节,请告诉我。
发布于 2013-10-16 19:52:08
您可以使用此解决方案,在C# http://www.codeproject.com/Tips/240428/Work-with-bitmap-faster-with-Csharp中更快地处理位图
或者,您可以使用内存映射文件
http://visualstudiomagazine.com/articles/2010/06/23/memory-mapped-files.aspx
发布于 2017-11-22 08:28:32
您可以停止内存缓存。
而不是
Bitmap bmp = new Bitmap(pathToFile);
使用
var bmp = (Bitmap)Image.FromStream(sourceFileStream, false, false);
https://stackoverflow.com/questions/11065689
复制相似问题