Как читать / записывать ASCII .pgm файл

Я новичок в подаче и не очень много об этом.

Я написал код, который пытается прочитать файл ASCII .pgm с именем owl.pgm и пишет это как myowl.pgm файл:

#include <fstream>
const int MAXHEIGHT=221;
unsigned char *bitmap[MAXHEIGHT]={'\0'} ;// pointers to each pixel row
int main()
{
int width=201, height=221;
std::ifstream ifile("owl.pgm",std::ios::in);
std::ofstream ofile("myowl.pgm",std::ios::out);
for(int i=0;i<height;++i)
{
for(int j=0;j<width;++j)
ifile.read(bitmap[i][j],sizeof(bitmap));
}
ofile << "P2\n" << width << " " << height << "\n255\n";
for(int i=0;i<height;++i)
{
for(int j=0;j<width;++j)
ofile<<bitmap[i][j];
}
}

По моему коду есть некоторые ошибки. Я буду благодарен, если кто-нибудь поможет мне исправить это.

1

Решение

Кажется, проблема в том, как вы читаете пиксели из входного файла:

std::ifstream ifile("owl.pgm",std::ios::in);
for(int i=0;i<height;++i)
{
for(int j=0;j<width;++j)
ifile.read(bitmap[i][j],sizeof(bitmap));
}

Проблема 1: Вы должны убедиться, что ваша программа не воспринимает заголовок этого файла как фактические пиксели изображения. Смотрите формат заголовка PGM. Скорее всего, вам придется пропустить первые 3 строки перед чтением пикселей.

Проблема 2: Вы пытаетесь прочитать все растровое изображение одновременно, но вы делаете это в рамках вложенного цикла, который, очевидно, предназначался для считывания растрового изображения попиксельно.

Чтение пикселей может выглядеть так:

for(int i = 0; i < height; ++i)
{
for(int j = 0; j < width; ++j)
ifile >> bitmap[i][j];
}
2

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

Других решений пока нет …

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