直接从文件中读取大量bmp数据
本文关键字:bmp 数据 读取 文件 | 更新日期: 2023-09-27 18:25:38
我正在开发一个应用程序,该应用程序必须处理大型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后,计算填充大小并手动删除它。这看起来太麻烦和复杂了。必须有更好的解决方案。
当您面临内存不足时(因为这会导致创建另一个数组),从数组中"手动删除"某些内容是个坏主意。我认为,解决问题的正确方法是在处理方法中添加两个额外的参数,因此其信号看起来像:
void ProcessSection(byte[] data, int offset, int count);
然后不是从0
到data.Length
迭代data
,而是从offset
到count
迭代。这是在.Net中处理数组的常见方法(例如,看看fs.Read()
方法),没有太多其他方法可以做。是的,您必须根据位图属性计算偏移量/计数。
Ofc,或者,当你调用fs.Seek
方法时(例如,当你计算sectionStart
时),你可以考虑偏移,但我认为第一种方法更通用。