Как читать / записывать 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];
}
Другие вопросы по тегам