Поскольку файлы BMP написаны снизу вверх (с точки зрения пикселей), мне нужно прочитать BMP-файл в обратном порядке (и избавиться от 54-байтового заголовка). Мой код до сих пор:Чтение файла в обратном порядке
public string createNoHeaderBMP(string curBMP) //copies everything but the header from the curBMP to the tempBMP
{
string tempBMP = "C:\\TEMP.bmp";
Stream inStream = File.OpenRead(curBMP);
BinaryReader br = new BinaryReader(inStream);
byte[] fullBMP = new byte[(width * height * 3) + 138];
byte[] buffer = new Byte[1];
long bytesRead;
long totalBytes = 0;
while ((bytesRead = br.Read(buffer, 0, 1)) > 0)
{
fullBMP[fullBMP.Length - 1 - totalBytes] = buffer[0];
totalBytes++;
}
FileStream fs = new FileStream(tempBMP, FileMode.Create, FileAccess.Write);
fs.Write(fullBMP, 54, fullBMP.Length - 54);
fs.Close();
fs.Dispose();
return tempBMP;
}
по какой-то причине она не сможет выполнить эту работу полностью, и это приводит к изображению с части правой стороны расположен на левой стороне. Почему он не полностью меняет файл? Кроме того, эти файлы BMP очень большие (600 МБ), поэтому я не могу использовать простой запоминающий поток и выполнять операцию поиска и свопинга, потому что я получу исключение «Из памяти».
Почему вы упомянули, что вы не можете прочитать весь файл, но вы только что сделали? Кроме того, НИКОГДА не записывайте значения для массива, как вы. Не гарантируется, что будет ТОЧНО 138 байтов данных заголовка. –
Если вы используете MemoryStream, вы получите исключение OOM, как вы можете выделить пространство для массива 'fullBMP' без получения того же исключения? – cdhowie
MemoryStream и Byte [] - это, по сути, одно и то же, MS имеет некоторые дополнительные обертки, которые могут упростить обработку, хотя ... см. Http://stackoverflow.com/questions/16939/difference-between-a-byte-array -and-memorystream И http://stackoverflow.com/questions/11828599/c-sharp-memorystream-vs-byte-array – Nevyn