2015-08-04 3 views
0

Я пишу простой читатель PGM-файлов для основной идеи CV, и у меня есть странная проблема. Мой метод работает нормально для симметричных файлов (например, 255 х 255), но когда я пытаюсь прочитать асимметричный файл (300 х 246), я получаю какой-то странный ввод. Один файл читается в определенную точку, а затем сбрасывает символы ESCAPE (ASCII 27) в оставшуюся часть изображения (см. Ниже), а другие просто не читаются. Я думаю, что это может быть некорректная логика или проблема с памятью. Любая помощь будет оценена по достоинству.Чтение файлов PGM не читает асимметричные файлы

enter image description hereenter image description here

 // Process files of binary type (P5) 
    else if(holdString[1] == '5') { 
     // Assign fileType value 
     fileType = 5; 

     // Read in comments and discard 
     getline(fileIN, holdString); 

     // Read in image Width value 
     fileIN >> width; 

     // Read in image Height value 
     fileIN >> height; 

     // Read in Maximum Grayscale Value 
     fileIN >> max; 

     // Determine byte size if Maximum value is over 256 (1 byte) 
     if(max < 256) { 
      // Collection variable for bytes 
      char readChar; 

      // Assign image dynamic memory 
      *image = new int*[height]; 
      for(int index = 0; index < height; index++) { 
       (*image)[index] = new int[width]; 
      } 

      // Read in 1 byte at a time 
      for(int row = 0; row < height; row++) { 
       for(int column = 0; column < width; column++) { 
        fileIN.get(readChar); 
        (*image)[row][column] = (int) readChar; 
       } 
      } 

      // Close the file 
      fileIN.close(); 
     } else { 
      // Assign image dynamic memory 
      // Read in 2 bytes at a time 
      // Close the file 
     } 
    } 
+0

Попробуйте создать твердокодированное изображение [row] [column], где вы не динамически выделяете память. Это позволит вам определить, считывает ли файл файл или есть ли другая ошибка при динамическом распределении памяти. Часто в таких случаях индекс [y, x] изменяется на обратную или жестко запрограммирован как [x, x]. – Mark

ответ

0

возился с ним немного, и придумал, по крайней мере большинство из раствора. Используя функцию .read(), я смог нарисовать весь файл и затем прочитать его по частям в массив int. Я сохранил динамическую память, потому что хотел рисовать файлы разных размеров, но я больше обращал внимание на то, как это было прочитано в массиве, так что спасибо за предложение, Марк. Редакции, похоже, хорошо работают на файлах размером до 1000 пикселей или выше, что отлично подходит для того, для чего я его использую. После этого он искажает, но я все равно возьму это, не прочитав файл.

  if(max < 256) { 
      // Collection variable for bytes 
      int size = height * width; 
      unsigned char* data = new unsigned char[size]; 

      // Assign image dynamic memory 
      *image = new int*[height]; 
      for(int index = 0; index < height; index++) { 
       (*image)[index] = new int[width]; 
      } 

      // Read in 1 byte at a time 
      fileIN.read(reinterpret_cast<char*>(data), size * sizeof(unsigned char)); 

      // Close the file 
      fileIN.close(); 

      // Set data to the image 
      for(int row = 0; row < height; row++) { 
       for(int column = 0; column < width; column++) { 
        (*image)[row][column] = (int) data[row*width+column]; 
       } 
      } 

      // Delete temporary memory 
      delete[] data; 
     } 
Смежные вопросы