gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 22:09:02 26 4
gpt4 key购买 nike

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

这是一个十亿像素的图像拼接项目。我会使用已经存在的软件,除非图像中没有重叠(但我知道磁贴布局)。我需要能够将一些非常大的 BMP 文件 (192,000x1080) 作为行处理,并将它们逐行添加以创建最终图像,即 20.7 十亿像素。虽然我有 32GB 的内存,但最终的 20.7 g 像素图像将是 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 是一个 long 值,因此您不必担心会碰到 32 位整数的限制。

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

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com