我正在研究一个必须处理大型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之后,计算填充大小并手动删除它.这似乎太麻烦和复杂.必须有一个更好的解决方案.
最佳答案 当你面临缺乏记忆时(因为它会导致创建另一个数组),“从阵列中手动删除”某些东西是个坏主意.我认为,解决问题的正确方法是在处理方法中添加两个额外的参数,因此它的siganture将如下所示:
void ProcessSection(byte[] data, int offset, int count);
然后迭代数据不是从0到data.Length,而是从offset到count.这是处理.Net中数组的常用方法(例如,查看fs.Read()方法),没有其他可以做的事情.是的,您必须根据您的位图属性计算偏移/计数.
或者,当你调用fs.Seek方法时(例如当你计算sectionStart时),你可以考虑偏移,但我认为第一个apporach更通用.