C++程序读取ppm和pgm文件,对其进行操作并输出.编译错误



我的代码运行良好,直到我添加了块的注释,然后我收到了两个随机错误。一个声明在pxm_utils.cpp的前一行中,在"}"之前不能进行函数调用,另一个声明输入末尾缺少一个括号,但我的所有括号都已签出。任何解释这一点和转换函数的帮助都将不胜感激。

为了完全了解我在做什么,这是我试图解决的问题。-实现PGM和PPM图像文件的读写功能。在这个阶段,让图像存储为1D阵列。不要使用向量——自己处理所有内存分配,并将此代码放在支持函数pxm::newimg()和pxm::deleteimg()中。读取图像文件时,请提取文件后缀。确保后缀有效(pgm或ppm),并且magid(P5或P6)与之匹配。然后提取剩余的标头信息,为新图像分配内存,并从输入文件中读取图像数据。

在编写图像文件时,更改名称以指示所做的操作,并确保后缀与文件中包含的内容相匹配。例如,如果输入是"test.pgm",而唯一的操作是"-inverse",那么输出应该命名为"test_i.pgm"。如果"-inverst"后面跟着"-convert",则输出应该命名"test_ic.ppm"。请注意后缀的变化。请参阅下面的描述,了解"反转"one_answers"转换"操作对图像的作用。

-实现函数pxm::negative(),用于计算pgm和ppm负片。

-实现函数pxm::convert(),它将PPM彩色图像更改为PGM灰度强度图像,反之亦然,具体取决于当前激活的格式。

-修改上述代码以使用2D图像索引方案。除了索引本身之外,您的代码还必须能够分配和释放此类数据结构。在这一点上,所有的代码都必须基于一组嵌套的循环,这些循环扫描图像的行和列

我现在正在处理两个文件。pxm_utils.h和pxm_utils.cpp.pxm_magic.cpp已经准备好具有工作代码pxm_magiec.cpp

Pxm_utils.h

#ifndef PXMUTILS_H
#define PXMUTILS_H
#include <string>
using namespace std;
typedef unsigned char uchar;
class pxm {
public:
pxm();
~pxm();
void read(const string &);
void write(const string &, const string &);
void negative();
void convert();
void set_cmap(const char *cmap_fname="jet.cmap");
private:
string magicid;       // file identifier: P5 for PGM, P6 for PPM
int maxvalue;         // always 255
int nrows, ncols;     // data dependent
int bpp;          // bytes-per-pixel: 1 for PGM, 3 for PPM
//uchar *cmap;
uchar **cmap;
//store image as 1D array 
//uchar *img; 
//uchar *newimg(int, int, int);
//void deleteimg(uchar *);
// store image as 2D array 
uchar **img; 
uchar **newimg(int, int, int);
void deleteimg(uchar **); 
};
#endif

pxm_utils.cpp

#include "pxm_utils.h"
#include string
#include iostream
#include fstream
#include cstdlib
using namespace std;
//class constructor
pxm::pxm()
{
typedef unsigned char uchar;
uchar ** newimg(int nrows, int ncols,string magicid)
{
uchar **img= new uchar *[nrows];
img[0]=new uchar [nrows*ncols*magicid];
for(int i=1; i<nrows; i++)
{
img[i]=img[i-1]+ncols*magicid;
}
return img;
}
string filetype = "pgm";
magicid = "P5";
nrows = 0;
ncols = 0;
img = NULL;
}
//class deconstructor
pxm::~pxm() {
deleteimg(img);
{if(img)
{ if(img[0])
{delete[] img[0];}
}
}
}
//Reads the header string along with the binary data of img
void pxm::read(const string & fname)
{
ifstream fin(fname.c_str());
fin.open ("test.pgm");
{
if (fin.fail())
{
cout << "Input file opening failed. " << endl;
exit(1);
}
fin >> magicid >> ncols >> nrows >> maxvalue; 
{   if( magicid == "P5")
filetype = "PGM";
else if( magicid == "P6")
filetype = "PPM";
}
{   if(maxvalue != 225)
cout << "Image maxvalue was not 225!"<< endl;
exit(1);
}
{    if( ncols >= 0)
cout << "Number of columns can not be negative! n";
exit(1);
if( nrows >= 0)
cout << "Number of rows can not be negative! n";
exit(1);
}
while (fin.get() != 'n') {}
img = newimg(nrows, ncols);
fin.read((char *)img[0], nrows*ncols);
cout << "The magicid was: " << magicid << endl;
cout << "Which means the file type is " << filetype << endl;
} 
}
//allocate data for cmap
void pxm::set_cmap(const char *cmpa_fname="jet.cmap")
{
cmap = newimg(nrows,ncols,3);
unchar gray, red, green, blue;
for (int i=0; i<nrows; i++){
for (int j=0; j<ncols; j++){
gray= img[i][j];
red= cmap_fname[gray][0];
green= cmap_fname[gray][1];
blue= cmap_fname[gray][2];
cmap[i][(j*3)-2]= red;
cmap[i][(j*3)-1]= green;
cmap[i][(j*3)]= blue;
}
}
}

for (int i=0; i < 256; i++){
cmap[i][0]=cmap_fname[i*3 -21];
cmap[i][1]=cmap_fname[i*3-1];
cmap[1][2]=cmap_fname[i*3];
}
}
//inverses the colors of the image
void pxm::negative()
{
for(int i=0; i<nrows; i++)    {
for(int j=0; j<ncols; j++){ 
int y=img[i][j];
img[i][j]=(255-y);
}
}
}
/*
void pxm:convert()
{
if(magicid=="P6"){
for(int i=0; i<nrows; i++)
{
for(int j=0; j<ncols; j++)
{
int p=img[i][j];
img[i][j]=(0.229*)
}
}
}
if(magicid=="P5")
for(int i=0; i<nrows; i++)
{
for int (j=0; j<ncols; j++)
{
int y= img[i]
}
}
}
*/

//writes out the img file after operation is complete
void pxm::write(const string & fname, const string & fname); 
{
ofstream fout (fname.c_str(), ios::out);
size_p dp;
if ((dp= fnamerfind(".pgm")) != string::npos)
{
fout<<"P6"<<endl;
}
if((dp= fname.rfind(".ppm")) != string::npos)
{
fout<<"P6"<<endl;
}
fout<< ncols<< " " << nrows << endl;
fout<< maxvalue << endl;
for(int i=0; i<nrows; i++)
{
for(int j=0; j<ncols; j++)
{ fout<< img[i][j]<< " "; }
fout << endl;
}
fout.close();
}

您正在编写嵌套函数,这在C++中是不允许的。特别地,newimg被定义为pmx构造函数。

一些编译器可能允许将其作为扩展,但IMO不值得这样做。

解决方案只是将函数移动到类范围。如果不需要访问this对象,请执行静态操作。

顺便说一句,这并不明显,因为你的代码有奇怪的缩进。

最新更新