1

我是新手,对它不太了解。

我编写了一个代码,试图读取一个名为 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];
    }
}

通过我的代码有一些错误。如果有人帮助我纠正它,我将不胜感激。

4

1 回答 1

2

问题似乎在于您从输入文件中读取像素的方式:

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];
}
于 2013-02-24T18:24:55.640 回答