Программа чтения файлов PGM не читает асимметричные файлы

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

введите описание изображения здесьвведите описание изображения здесь

        // 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

Решение

Немного возился с этим и придумал хотя бы большую часть решения. Используя функцию .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;
}
0

Другие решения


По вопросам рекламы [email protected]