c# - 读取文件 A 并附加到文件 B,跳过一些字节

标签 c# arrays byte filestream

我需要将一些 BMP 图像附加在一起。您可能知道,BMP 图像有一个 54 字节的 header 。我将自己的新 header 写入一个新文件,然后我需要循环遍历 BMP 文件列表并将它们相互附加,但我需要跳过每个文件的前 54 个字节。

这是一个十亿像素图像拼接项目。我会使用已经存在的软件,除了图像中没有重叠(但我知道平铺布局)。我需要能够将一些非常大的 BMP 文件 (192,000x1080) 作为行,并将它们一个接一个地附加到另一个下面以创建最终图像,即 20.7 GB。虽然我有 32GB 内存,但最终的 20.7 GB 图像将是 62.2GB(然后我将其转换为 PNG)。

考虑到这些巨大的内存需求,我如何读取每个 BMP 并将它们附加到最终文件而不使用所有内存?如果可能的话我想使用字节数组;因为这些是未压缩的 BMP,所以可以像这样读取它们并将其保存到另一个文件,而无需使用任何 GDI 对象。

最佳答案

您可以写入文件中的任意位置。也就是说:

using(var s = new FileStream("myBigImage.bmp", FileMode.Create, FileAccess.Write)) {
    //assume that you write out the header here
    foreach(var tileFile in tiles) {
        byte[] imgData = /*read image data into a byte[]*/;
        long y = /*obtain the correct y offset*/;

        s.Position = y * pixelWidth * imageWidth + 58;
        s.Write(imgData, 0, imgData.Length);

    }
}

基本上,您可以在文件中跳转以填写您想要的任何位置。 Position 是一个长整型值,因此您不必担心会遇到 32 位整数的限制。

幸运的是,因为您的图像基本上只是一堆高高的图 block ,所以您不必担心处理每条单独的线。在这种情况下,为了减少内存,您必须单独写出每个图 block 的行。

关于c# - 读取文件 A 并附加到文件 B,跳过一些字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15659297/

相关文章:

c - 为什么指针算术可用于非连续的2d数组?

c# - 在 ObservableCollection<T> 排序后如何刷新绑定(bind)的 GridView?

c# - Azure Durable Functions 如何恢复?

python - 将天文表中的行转换为 numpy 数组

javascript - 如何将预先生成的数组传递给 Angular 模板中的组件?

将字符串转到 ascii 字节数组

c# - 我需要有关使用 linq 的帮助

c# - WPF 根据需要以编程方式设置字段

c - 如何计算 bfOffBits

ios - NSData 查找字节序列