我正在研究一个必须处理大型bmp文件的应用程序,这些文件往往太大而无法容纳在内存中。作为我们在项目创建时开发的软件的一部分,我的应用程序将数据从bmp文件转换为允许在部分中轻松检索的不同格式。
目前,由于文件通常太大而无法放入内存,因此软件直接从文件中读取一段字节数据,对其进行处理,然后移到下一部分。读取文件的代码类似于下面显示的代码(为简洁起见,简化了):
FileStream fs = File.OpenRead(fileName);
fs.Seek(sectionStart, SeekOrigin.Begin);
currentSectionAsBytes = new byte[sectionSize];
fs.Read(currentSectionAsBytes, 0, currentSectionAsBytes.Length);
由于我们使用的文件都有一个可被4整除的宽度,所以这个工作已经很好了,因此bmp文件没有填充。
最近,我们一直在处理不同大小的图像,这些图像在每行数据的末尾都有填充,导致采集的数据错误。
我的问题是,有没有人知道直接从文件中获取bmp数据的更好方法。如前所述,由于文件较大,我无法从文件中读取位图。目前我最好的想法是,在获取currentSectionAsBytes之后,计算填充大小并手动删除它。这似乎太麻烦和复杂。必须有一个更好的解决方案。
答案 0 :(得分:2)
当你面临内存不足时(从而导致创建另一个数组),从一个数组中手动删除某些东西是个坏主意。我认为,解决问题的正确方法是在处理方法中添加两个额外的参数,因此它的结果将如下所示:
void ProcessSection(byte[] data, int offset, int count);
然后迭代data
而不是0
到data.Length
,而是从offset
到count
。这是处理.Net中数组的常用方法(例如,查看fs.Read()
方法),没有太多可以做的事情。是的,您必须根据您的位图属性计算偏移/计数。
Ofc,或者,当您调用fs.Seek
方法时(例如,当您计算sectionStart
时),您可以考虑偏移量,但我认为第一个应用程序更具普遍性。