4

我正在开发一个必须处理大型 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 之后,计算填充大小并手动删除它。这似乎太麻烦和复杂了。必须有更好的解决方案。

4

1 回答 1

2

当您面临内存不足时(因为它会导致创建另一个数组),从数组中“手动删除”某些东西是一个坏主意。我认为,解决您的问题的正确方法是在您的处理方法中添加两个额外的参数,因此它的签名将如下所示:

void ProcessSection(byte[] data, int offset, int count);

然后data不是从0to迭代data.Length,而是从offsetto迭代count。这是在 .Net 中处理数组的常用方法(fs.Read()例如查看方法),没有什么其他可以做的。是的,您必须根据您的位图属性计算偏移量/计数。

Ofc,或者,您可以在调用fs.Seek方法时(例如,当您计算时sectionStart)考虑偏移量,但我认为第一个方法更通用。

于 2013-07-30T10:58:53.853 回答