C# 直接从文件中读取大量bmp数据

C# 直接从文件中读取大量bmp数据,c#,image,image-processing,C#,Image,Image Processing,我正在开发一个必须处理大型bmp文件的应用程序,这些文件通常太大,无法放入内存。作为我们在项目创建时开发的软件的一部分,我的应用程序将bmp文件中的数据转换为不同的格式,以便在部分中轻松检索 目前,由于文件通常太大,无法放入内存,软件直接从文件中读取一段字节数据,对其进行处理,然后移动到下一段。读取文件的代码类似于下面所示的代码(为清晰起见,简化了代码): 到目前为止,这一切都很好,因为我们处理的文件的宽度都可以被4整除,因此bmp文件没有填充 最近,我们一直在处理不同大小的图像,这些图像在每行

我正在开发一个必须处理大型bmp文件的应用程序,这些文件通常太大,无法放入内存。作为我们在项目创建时开发的软件的一部分,我的应用程序将bmp文件中的数据转换为不同的格式,以便在部分中轻松检索

目前,由于文件通常太大,无法放入内存,软件直接从文件中读取一段字节数据,对其进行处理,然后移动到下一段。读取文件的代码类似于下面所示的代码(为清晰起见,简化了代码):

到目前为止,这一切都很好,因为我们处理的文件的宽度都可以被4整除,因此bmp文件没有填充

最近,我们一直在处理不同大小的图像,这些图像在每行数据的末尾都有填充,从而导致获取的数据出错

我的问题是,有谁知道直接从文件中获取bmp数据的更好方法吗。如前所述,由于文件太大,我无法从文件中读取位图。目前我最好的办法是,在获取currentSectionAsBytes后,计算填充大小并手动删除它。这看起来太麻烦和复杂了。必须有更好的解决方案。

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

void ProcessSection(byte[] data, int offset, int count);
然后迭代
数据
不是从
0
data.Length
,而是从
偏移量
计数
。这是在.Net中处理数组的常用方法(例如查看
fs.Read()
method),除此之外没有什么可以做的。是的,您必须根据位图属性计算偏移/计数


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

我非常好奇您的项目处理大位图以加载到内存的目的。您正在处理斯隆数字天空测量的图像吗?或者您的计算机过时了,您可以添加一些RAM;)我最好的猜测是,您应该编写一个例程,在读取数据时过滤填充。@Mike de Klerk。恐怕没有什么比这更令人兴奋的了:p图像数据是从许多来源获取的,其中文件大小超出了我们的控制范围。同样,许多学者/学生在不同的机器上使用该软件,因此我们必须确保他们都能运行该软件。我认为你的想法可能是正确的。我只是希望有一个更优雅的解决方案。我想是一厢情愿吧。谢谢你的回复。如果我理解正确,那么最好的方法是一次读取一行文件流,然后跳过填充的单元格,然后再转到下一行?我期待着这样的事情,我只是不确定这是否是最好的解决方案。是的,您应该在读取操作之间跳过填充,或者读取整行,但在处理它时忽略与填充相对应的字节。
void ProcessSection(byte[] data, int offset, int count);