我是新手,并且对此并不太了解。
我编写了一个代码,尝试读取名为owl.pgm
的ASCII .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];
}
}
我的代码有一些错误。如果有人帮我纠正,我将感激不尽。
答案 0 :(得分: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];
}