2013-04-01 5 views
0

Поскольку файлы 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 МБ), поэтому я не могу использовать простой запоминающий поток и выполнять операцию поиска и свопинга, потому что я получу исключение «Из памяти».

+0

Почему вы упомянули, что вы не можете прочитать весь файл, но вы только что сделали? Кроме того, НИКОГДА не записывайте значения для массива, как вы. Не гарантируется, что будет ТОЧНО 138 байтов данных заголовка. –

+3

Если вы используете MemoryStream, вы получите исключение OOM, как вы можете выделить пространство для массива 'fullBMP' без получения того же исключения? – cdhowie

+1

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

ответ

0

Я не проверял спецификацию BMP, и я не знаю об этом. Я просто предполагаю, что вы говорите правду.

Большинство программ, отображающих растровые изображения, просто читают заголовок, чтобы узнать, насколько велика изображение, а затем читать данные сверху вниз, вместо этого рисуя растровое изображение снизу вверх. И вы также можете искать в большинстве файлов. Таким образом, вы можете использовать inStream и искать в этом, не требуя, чтобы весь файл находился в памяти.

Затем, если вы можете выделить массив байтов 600 MiB (т. Е. Структуру 600 MiB в памяти), то вы можете выделить MemoryStream, который занимает до 600 Мбайт пространства памяти. Или, если вы получите OutOfMemoryException, вы получите его независимо от того, используете ли вы byte[] или MemoryStream. С этим легче работать.

Ваша идея просто повернуть вспять все провалится, если вы не поймете, что вы также изменили цвета каждого пикселя из формата R-G-B (или что бы то ни было в данный момент) на B-G-R. И я не уверен в направлении линий сканирования BMP, но если они будут работать слева направо, тогда ваш обратный растровый рисунок будет отображаться горизонтально.

Причина, по которой вы видите часть изображения справа, которая отображается слева, состоит в том, что вы не можете просто перевернуть байты растрового изображения и ожидать, что он выйдет правильно. Кроме того, у вас, вероятно, длина строки сканирования неверна при ее рисовании.

Кроме того, вы говорите, что заголовок составляет 54 байта, но вы добавляете 138 байт к размеру массива в fullBMP. Проверьте свои константы: они гарантированно никогда не меняются, а затем делают их const. Могут ли они измениться? Затем прочитайте их из растрового изображения.

Смежные вопросы