Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用C++;代码 因为我对C++和图像处理很安静,所以我有一个问题,修改和添加代码的函数。 要求仅在RGB颜色之间切换 #include "stdio.h" #include "stdlib.h" #include "string.h" #include "ctype.h" #include "math.h" class myImageData { private: int mW; int mH; int mCH; double * mData; void SkipComments(FILE *fp) { int ch; char line[100]; while ((ch = fgetc(fp)) != EOF && isspace(ch)) ; if (ch == '#') { fgets(line, sizeof(line), fp); SkipComments(fp); } else { fseek(fp, -1, SEEK_CUR); } } public: myImageData(void) { this->mData = NULL; } ~myImageData() { if (this->mData != NULL) { delete[] this->mData; } } void init(int W, int H, int CH) { this->mW = W; this->mH = H; this->mCH = CH; if (this->mData != NULL) delete[] this->mData; this->mData = new double[(this->mW)*(this->mH)*(this->mCH)]; } int getWidth(void) { return this->mW; } int getHeight(void) { return this->mH; } int getCH(void) { return this->mCH; } double * getDataPtr(void) { return this->mData; } double get(int x, int y) { return this->mData[y*(this->mW) + x]; } double get(int x, int y, int CH) { return this->mData[this->mCH * (y*(this->mW) + x) + CH]; } void set(int x, int y, double value) { this->mData[y*(this->mW) + x] = value; } void set(int x, int y, int CH, double value) { this->mData[this->mCH *(y*(this->mW) + x) + CH] = value; } void read(const char *filename); void save(const char *filename); }; void myImageData::read(const char *filename) { FILE *file = fopen(filename, "r"); if (file == NULL){ printf("Cannot open %s\n", filename); exit(1); //abnormal termination } printf("Read an image from: %s\n", filename); // read ppm/pgm header char buf[256]; char filetype[256]; int W, H, Range, CH; fgets(buf, sizeof(buf), file); sscanf(buf, "%s", filetype); SkipComments(file); fgets(buf, sizeof(buf), file); sscanf(buf, "%d%d", &W, &H); SkipComments(file); fgets(buf, sizeof(buf), file); sscanf(buf, "%d", &Range); //printf("Header: %s, %d, %d, %d\n", filetype, W, H, Range); SkipComments(file); if (strcmp(filetype, "P5") == 0) { CH = 1; } else if (strcmp(filetype, "P6") == 0) { CH = 3; } else { printf("Unknown image type\n"); exit(1); //abnormal termination } if (Range != 255){ printf("Invalid data\n"); exit(1); //abnormal termination } // create myImageData class init(W, H, CH); // read ppm data int datalength = this->mW * this->mH * this->mCH; unsigned char * temp = new unsigned char[datalength]; fread(temp, sizeof(unsigned char), datalength, file); double * ptr1 = this->mData; unsigned char *ptr2 = temp; for (int i = 0; i < datalength; i++){ *ptr1 = (double)*ptr2; ptr1++; ptr2++; } delete[] temp; fclose(file); } void myImageData::save(const char *filename){ char filenamefull[256]; if (this->mCH == 1){ sprintf(filenamefull, "%s.pgm", filename); } else{ sprintf(filenamefull, "%s.ppm", filename); } FILE *file = fopen(filenamefull, "w"); printf("Write an image to: %s \n", filenamefull); if (this->mCH == 1){ fprintf(file, "P5\n"); } else{ fprintf(file, "P6\n"); } fprintf(file, "%d %d\n", this->mW, this->mH); fprintf(file, "255\n"); int datalength = this->mW * this->mH * this->mCH; unsigned char * temp = new unsigned char[datalength]; double * ptr1 = this->mData; unsigned char * ptr2 = temp; for (int i = 0; i < datalength; i++){ double value = *ptr1; value = round(value); if (value > 255) value = 255; if (value < 0) value = 0; *ptr2 = (unsigned char)value; ptr1++; ptr2++; } fwrite(temp, sizeof(unsigned char), datalength, file); delete[] temp; fprintf(file, "Â¥n"); fclose(file); } #包括“stdio.h” #包括“stdlib.h” #包括“string.h” #包括“ctype.h” #包括“math.h” 类myImageData { 私人: 整数兆瓦; int mH; 国际妇幼卫生组织; 双*mData; 作废SkipComments(文件*fp) { int-ch; 字符行[100]; while((ch=fgetc(fp))!=EOF&&isspace(ch)) ; 如果(ch='#') { fgets(行,sizeof(行),fp); SkipComments(fp); } 其他的 { fseek(fp,-1,SEEK_CUR); } } 公众: myImageData(无效) { 此->mData=NULL; } ~myImageData() { 如果(此->mData!=NULL) { 删除[]此->mData; } } void init(int W,int H,int CH) { 这->mW=W; 这->mH=H; 这->mCH=CH; 如果(此->mData!=NULL) 删除[]此->mData; 这->mData=新的双[(这->微波)*(这->微波)*(这->微波)*(这->微波)*(这->妇幼保健)]; } int getWidth(void) { 返回此->mW; } int getHeight(void) { 返回此->mH; } int getCH(无效) { 返回此->妇幼保健; } 双*getDataPtr(无效) { 返回此->mData; } 双进位(整数x,整数y) { 返回this->mData[y*(this->mW)+x]; } 双进位(整数x,整数y,整数CH) { 返回this->mData[this->mCH*(y*(this->mW)+x)+CH]; } 无效集(整数x,整数y,双值) { this->mData[y*(this->mW)+x]=值; } 无效集(整数x,整数y,整数CH,双值) { this->mData[this->mCH*(y*(this->mW)+x)+CH]=值; } 无效读取(常量字符*文件名); 无效保存(常量字符*文件名); }; void myImageData::read(常量字符*文件名) { FILE*FILE=fopen(文件名,“r”); if(file==NULL){ printf(“无法打开%s\n”,文件名); 退出(1);//异常终止 } printf(“从以下位置读取图像:%s\n”,文件名); //读取ppm/pgm头 char-buf[256]; char文件类型[256]; int W,H,范围,CH; fgets(buf,sizeof(buf),文件); sscanf(buf,“%s”,文件类型); SkipComments(文件); fgets(buf,sizeof(buf),文件); sscanf(buf、%d%d、&W和&H); SkipComments(文件); fgets(buf,sizeof(buf),文件); sscanf(buf、%d、&Range); //printf(“头:%s,%d,%d,%d\n”,文件类型,W,H,范围); SkipComments(文件); if(strcmp(文件类型,“P5”)==0) { CH=1; } else if(strcmp(文件类型,“P6”)==0) { CH=3; } 其他的 { printf(“未知图像类型\n”); 退出(1);//异常终止 } 如果(范围!=255){ printf(“无效数据”); 退出(1);//异常终止 } //创建myImageData类 初始值(W,H,CH); //读取ppm数据 int datalength=this->mW*this->mH*this->mCH; unsigned char*temp=新的unsigned char[datalength]; fread(temp,sizeof(unsigned char),datalength,file); double*ptr1=this->mData; 无符号字符*ptr2=temp; 对于(int i=0;imCH==1){ sprintf(filenamefull,“%s.pgm”,文件名); } 否则{ sprintf(filenamefull,“%s.ppm”,文件名); } FILE*FILE=fopen(filenamefull,“w”); printf(“将图像写入:%s\n”,filenamefull); 如果(本->mCH==1){ fprintf(文件“P5\n”); } 否则{ fprintf(文件“P6\n”); } fprintf(文件,“%d%d\n”,this->mW,this->mH); fprintf(文件“255\n”); int datalength=this->mW*this->mH*this->mCH; unsigned char*temp=新的unsigned char[datalength]; double*ptr1=this->mData; 无符号字符*ptr2=temp; 对于(int i=0;i255)值=255; 如果(值也基本上是C++中的薄C +单板。没关系,每个人都得从某个地方开始。但是,您可以执行以下操作,而不是使用new创建数组: // read ppm data int datalength = this->mW * this->mH * this->mCH; // using a std::vector here means that the allocated memory will be freed // automatically, even in the result of an error occurring. std::vector<unsigned char> temp(datalength); fread(&temp[0], sizeof(unsigned char), datalength, file); 你的问题是什么?我们需要一些背景。向我们展示要修改的函数。这是一个很好的简单问题,如果您提供了代码,这个问题可能已经得到了解答!另外,提及您可能正在使用的编译器和库也会有所帮助。对不起,我现在正在添加代码。哪个函数会给您带来问题?它到底需要做什么?(颜色之间的切换太模糊了!只输出一个通道?交换通道?)您尝试了什么?非常感谢。。。我在这个领域还是新手,非常感谢你的帮助。 // read ppm data int datalength = this->mW * this->mH * this->mCH; // using a std::vector here means that the allocated memory will be freed // automatically, even in the result of an error occurring. std::vector<unsigned char> temp(datalength); fread(&temp[0], sizeof(unsigned char), datalength, file); void swapRB(myImageData& image) { assert(image.getCH() == 3); for (int x = 0; x < image.getWidth()) { for (int y = 0; x < image.getHeight()) { double R = image.get(x, y, 0); double G = image.get(x, y, 1); double B = image.get(x, y, 2); image.set(x, y, 0, B); image.set(x, y, 2, R); } } }_C++_Image Processing - Fatal编程技术网 mData=NULL; } ~myImageData() { 如果(此->mData!=NULL) { 删除[]此->mData; } } void init(int W,int H,int CH) { 这->mW=W; 这->mH=H; 这->mCH=CH; 如果(此->mData!=NULL) 删除[]此->mData; 这->mData=新的双[(这->微波)*(这->微波)*(这->微波)*(这->微波)*(这->妇幼保健)]; } int getWidth(void) { 返回此->mW; } int getHeight(void) { 返回此->mH; } int getCH(无效) { 返回此->妇幼保健; } 双*getDataPtr(无效) { 返回此->mData; } 双进位(整数x,整数y) { 返回this->mData[y*(this->mW)+x]; } 双进位(整数x,整数y,整数CH) { 返回this->mData[this->mCH*(y*(this->mW)+x)+CH]; } 无效集(整数x,整数y,双值) { this->mData[y*(this->mW)+x]=值; } 无效集(整数x,整数y,整数CH,双值) { this->mData[this->mCH*(y*(this->mW)+x)+CH]=值; } 无效读取(常量字符*文件名); 无效保存(常量字符*文件名); }; void myImageData::read(常量字符*文件名) { FILE*FILE=fopen(文件名,“r”); if(file==NULL){ printf(“无法打开%s\n”,文件名); 退出(1);//异常终止 } printf(“从以下位置读取图像:%s\n”,文件名); //读取ppm/pgm头 char-buf[256]; char文件类型[256]; int W,H,范围,CH; fgets(buf,sizeof(buf),文件); sscanf(buf,“%s”,文件类型); SkipComments(文件); fgets(buf,sizeof(buf),文件); sscanf(buf、%d%d、&W和&H); SkipComments(文件); fgets(buf,sizeof(buf),文件); sscanf(buf、%d、&Range); //printf(“头:%s,%d,%d,%d\n”,文件类型,W,H,范围); SkipComments(文件); if(strcmp(文件类型,“P5”)==0) { CH=1; } else if(strcmp(文件类型,“P6”)==0) { CH=3; } 其他的 { printf(“未知图像类型\n”); 退出(1);//异常终止 } 如果(范围!=255){ printf(“无效数据”); 退出(1);//异常终止 } //创建myImageData类 初始值(W,H,CH); //读取ppm数据 int datalength=this->mW*this->mH*this->mCH; unsigned char*temp=新的unsigned char[datalength]; fread(temp,sizeof(unsigned char),datalength,file); double*ptr1=this->mData; 无符号字符*ptr2=temp; 对于(int i=0;imCH==1){ sprintf(filenamefull,“%s.pgm”,文件名); } 否则{ sprintf(filenamefull,“%s.ppm”,文件名); } FILE*FILE=fopen(filenamefull,“w”); printf(“将图像写入:%s\n”,filenamefull); 如果(本->mCH==1){ fprintf(文件“P5\n”); } 否则{ fprintf(文件“P6\n”); } fprintf(文件,“%d%d\n”,this->mW,this->mH); fprintf(文件“255\n”); int datalength=this->mW*this->mH*this->mCH; unsigned char*temp=新的unsigned char[datalength]; double*ptr1=this->mData; 无符号字符*ptr2=temp; 对于(int i=0;i255)值=255; 如果(值也基本上是C++中的薄C +单板。没关系,每个人都得从某个地方开始。但是,您可以执行以下操作,而不是使用new创建数组: // read ppm data int datalength = this->mW * this->mH * this->mCH; // using a std::vector here means that the allocated memory will be freed // automatically, even in the result of an error occurring. std::vector<unsigned char> temp(datalength); fread(&temp[0], sizeof(unsigned char), datalength, file); 你的问题是什么?我们需要一些背景。向我们展示要修改的函数。这是一个很好的简单问题,如果您提供了代码,这个问题可能已经得到了解答!另外,提及您可能正在使用的编译器和库也会有所帮助。对不起,我现在正在添加代码。哪个函数会给您带来问题?它到底需要做什么?(颜色之间的切换太模糊了!只输出一个通道?交换通道?)您尝试了什么?非常感谢。。。我在这个领域还是新手,非常感谢你的帮助。 // read ppm data int datalength = this->mW * this->mH * this->mCH; // using a std::vector here means that the allocated memory will be freed // automatically, even in the result of an error occurring. std::vector<unsigned char> temp(datalength); fread(&temp[0], sizeof(unsigned char), datalength, file); void swapRB(myImageData& image) { assert(image.getCH() == 3); for (int x = 0; x < image.getWidth()) { for (int y = 0; x < image.getHeight()) { double R = image.get(x, y, 0); double G = image.get(x, y, 1); double B = image.get(x, y, 2); image.set(x, y, 0, B); image.set(x, y, 2, R); } } },c++,image-processing,C++,Image Processing" /> mData=NULL; } ~myImageData() { 如果(此->mData!=NULL) { 删除[]此->mData; } } void init(int W,int H,int CH) { 这->mW=W; 这->mH=H; 这->mCH=CH; 如果(此->mData!=NULL) 删除[]此->mData; 这->mData=新的双[(这->微波)*(这->微波)*(这->微波)*(这->微波)*(这->妇幼保健)]; } int getWidth(void) { 返回此->mW; } int getHeight(void) { 返回此->mH; } int getCH(无效) { 返回此->妇幼保健; } 双*getDataPtr(无效) { 返回此->mData; } 双进位(整数x,整数y) { 返回this->mData[y*(this->mW)+x]; } 双进位(整数x,整数y,整数CH) { 返回this->mData[this->mCH*(y*(this->mW)+x)+CH]; } 无效集(整数x,整数y,双值) { this->mData[y*(this->mW)+x]=值; } 无效集(整数x,整数y,整数CH,双值) { this->mData[this->mCH*(y*(this->mW)+x)+CH]=值; } 无效读取(常量字符*文件名); 无效保存(常量字符*文件名); }; void myImageData::read(常量字符*文件名) { FILE*FILE=fopen(文件名,“r”); if(file==NULL){ printf(“无法打开%s\n”,文件名); 退出(1);//异常终止 } printf(“从以下位置读取图像:%s\n”,文件名); //读取ppm/pgm头 char-buf[256]; char文件类型[256]; int W,H,范围,CH; fgets(buf,sizeof(buf),文件); sscanf(buf,“%s”,文件类型); SkipComments(文件); fgets(buf,sizeof(buf),文件); sscanf(buf、%d%d、&W和&H); SkipComments(文件); fgets(buf,sizeof(buf),文件); sscanf(buf、%d、&Range); //printf(“头:%s,%d,%d,%d\n”,文件类型,W,H,范围); SkipComments(文件); if(strcmp(文件类型,“P5”)==0) { CH=1; } else if(strcmp(文件类型,“P6”)==0) { CH=3; } 其他的 { printf(“未知图像类型\n”); 退出(1);//异常终止 } 如果(范围!=255){ printf(“无效数据”); 退出(1);//异常终止 } //创建myImageData类 初始值(W,H,CH); //读取ppm数据 int datalength=this->mW*this->mH*this->mCH; unsigned char*temp=新的unsigned char[datalength]; fread(temp,sizeof(unsigned char),datalength,file); double*ptr1=this->mData; 无符号字符*ptr2=temp; 对于(int i=0;imCH==1){ sprintf(filenamefull,“%s.pgm”,文件名); } 否则{ sprintf(filenamefull,“%s.ppm”,文件名); } FILE*FILE=fopen(filenamefull,“w”); printf(“将图像写入:%s\n”,filenamefull); 如果(本->mCH==1){ fprintf(文件“P5\n”); } 否则{ fprintf(文件“P6\n”); } fprintf(文件,“%d%d\n”,this->mW,this->mH); fprintf(文件“255\n”); int datalength=this->mW*this->mH*this->mCH; unsigned char*temp=新的unsigned char[datalength]; double*ptr1=this->mData; 无符号字符*ptr2=temp; 对于(int i=0;i255)值=255; 如果(值也基本上是C++中的薄C +单板。没关系,每个人都得从某个地方开始。但是,您可以执行以下操作,而不是使用new创建数组: // read ppm data int datalength = this->mW * this->mH * this->mCH; // using a std::vector here means that the allocated memory will be freed // automatically, even in the result of an error occurring. std::vector<unsigned char> temp(datalength); fread(&temp[0], sizeof(unsigned char), datalength, file); 你的问题是什么?我们需要一些背景。向我们展示要修改的函数。这是一个很好的简单问题,如果您提供了代码,这个问题可能已经得到了解答!另外,提及您可能正在使用的编译器和库也会有所帮助。对不起,我现在正在添加代码。哪个函数会给您带来问题?它到底需要做什么?(颜色之间的切换太模糊了!只输出一个通道?交换通道?)您尝试了什么?非常感谢。。。我在这个领域还是新手,非常感谢你的帮助。 // read ppm data int datalength = this->mW * this->mH * this->mCH; // using a std::vector here means that the allocated memory will be freed // automatically, even in the result of an error occurring. std::vector<unsigned char> temp(datalength); fread(&temp[0], sizeof(unsigned char), datalength, file); void swapRB(myImageData& image) { assert(image.getCH() == 3); for (int x = 0; x < image.getWidth()) { for (int y = 0; x < image.getHeight()) { double R = image.get(x, y, 0); double G = image.get(x, y, 1); double B = image.get(x, y, 2); image.set(x, y, 0, B); image.set(x, y, 2, R); } } },c++,image-processing,C++,Image Processing" />

使用C++;代码 因为我对C++和图像处理很安静,所以我有一个问题,修改和添加代码的函数。 要求仅在RGB颜色之间切换 #include "stdio.h" #include "stdlib.h" #include "string.h" #include "ctype.h" #include "math.h" class myImageData { private: int mW; int mH; int mCH; double * mData; void SkipComments(FILE *fp) { int ch; char line[100]; while ((ch = fgetc(fp)) != EOF && isspace(ch)) ; if (ch == '#') { fgets(line, sizeof(line), fp); SkipComments(fp); } else { fseek(fp, -1, SEEK_CUR); } } public: myImageData(void) { this->mData = NULL; } ~myImageData() { if (this->mData != NULL) { delete[] this->mData; } } void init(int W, int H, int CH) { this->mW = W; this->mH = H; this->mCH = CH; if (this->mData != NULL) delete[] this->mData; this->mData = new double[(this->mW)*(this->mH)*(this->mCH)]; } int getWidth(void) { return this->mW; } int getHeight(void) { return this->mH; } int getCH(void) { return this->mCH; } double * getDataPtr(void) { return this->mData; } double get(int x, int y) { return this->mData[y*(this->mW) + x]; } double get(int x, int y, int CH) { return this->mData[this->mCH * (y*(this->mW) + x) + CH]; } void set(int x, int y, double value) { this->mData[y*(this->mW) + x] = value; } void set(int x, int y, int CH, double value) { this->mData[this->mCH *(y*(this->mW) + x) + CH] = value; } void read(const char *filename); void save(const char *filename); }; void myImageData::read(const char *filename) { FILE *file = fopen(filename, "r"); if (file == NULL){ printf("Cannot open %s\n", filename); exit(1); //abnormal termination } printf("Read an image from: %s\n", filename); // read ppm/pgm header char buf[256]; char filetype[256]; int W, H, Range, CH; fgets(buf, sizeof(buf), file); sscanf(buf, "%s", filetype); SkipComments(file); fgets(buf, sizeof(buf), file); sscanf(buf, "%d%d", &W, &H); SkipComments(file); fgets(buf, sizeof(buf), file); sscanf(buf, "%d", &Range); //printf("Header: %s, %d, %d, %d\n", filetype, W, H, Range); SkipComments(file); if (strcmp(filetype, "P5") == 0) { CH = 1; } else if (strcmp(filetype, "P6") == 0) { CH = 3; } else { printf("Unknown image type\n"); exit(1); //abnormal termination } if (Range != 255){ printf("Invalid data\n"); exit(1); //abnormal termination } // create myImageData class init(W, H, CH); // read ppm data int datalength = this->mW * this->mH * this->mCH; unsigned char * temp = new unsigned char[datalength]; fread(temp, sizeof(unsigned char), datalength, file); double * ptr1 = this->mData; unsigned char *ptr2 = temp; for (int i = 0; i < datalength; i++){ *ptr1 = (double)*ptr2; ptr1++; ptr2++; } delete[] temp; fclose(file); } void myImageData::save(const char *filename){ char filenamefull[256]; if (this->mCH == 1){ sprintf(filenamefull, "%s.pgm", filename); } else{ sprintf(filenamefull, "%s.ppm", filename); } FILE *file = fopen(filenamefull, "w"); printf("Write an image to: %s \n", filenamefull); if (this->mCH == 1){ fprintf(file, "P5\n"); } else{ fprintf(file, "P6\n"); } fprintf(file, "%d %d\n", this->mW, this->mH); fprintf(file, "255\n"); int datalength = this->mW * this->mH * this->mCH; unsigned char * temp = new unsigned char[datalength]; double * ptr1 = this->mData; unsigned char * ptr2 = temp; for (int i = 0; i < datalength; i++){ double value = *ptr1; value = round(value); if (value > 255) value = 255; if (value < 0) value = 0; *ptr2 = (unsigned char)value; ptr1++; ptr2++; } fwrite(temp, sizeof(unsigned char), datalength, file); delete[] temp; fprintf(file, "Â¥n"); fclose(file); } #包括“stdio.h” #包括“stdlib.h” #包括“string.h” #包括“ctype.h” #包括“math.h” 类myImageData { 私人: 整数兆瓦; int mH; 国际妇幼卫生组织; 双*mData; 作废SkipComments(文件*fp) { int-ch; 字符行[100]; while((ch=fgetc(fp))!=EOF&&isspace(ch)) ; 如果(ch='#') { fgets(行,sizeof(行),fp); SkipComments(fp); } 其他的 { fseek(fp,-1,SEEK_CUR); } } 公众: myImageData(无效) { 此->mData=NULL; } ~myImageData() { 如果(此->mData!=NULL) { 删除[]此->mData; } } void init(int W,int H,int CH) { 这->mW=W; 这->mH=H; 这->mCH=CH; 如果(此->mData!=NULL) 删除[]此->mData; 这->mData=新的双[(这->微波)*(这->微波)*(这->微波)*(这->微波)*(这->妇幼保健)]; } int getWidth(void) { 返回此->mW; } int getHeight(void) { 返回此->mH; } int getCH(无效) { 返回此->妇幼保健; } 双*getDataPtr(无效) { 返回此->mData; } 双进位(整数x,整数y) { 返回this->mData[y*(this->mW)+x]; } 双进位(整数x,整数y,整数CH) { 返回this->mData[this->mCH*(y*(this->mW)+x)+CH]; } 无效集(整数x,整数y,双值) { this->mData[y*(this->mW)+x]=值; } 无效集(整数x,整数y,整数CH,双值) { this->mData[this->mCH*(y*(this->mW)+x)+CH]=值; } 无效读取(常量字符*文件名); 无效保存(常量字符*文件名); }; void myImageData::read(常量字符*文件名) { FILE*FILE=fopen(文件名,“r”); if(file==NULL){ printf(“无法打开%s\n”,文件名); 退出(1);//异常终止 } printf(“从以下位置读取图像:%s\n”,文件名); //读取ppm/pgm头 char-buf[256]; char文件类型[256]; int W,H,范围,CH; fgets(buf,sizeof(buf),文件); sscanf(buf,“%s”,文件类型); SkipComments(文件); fgets(buf,sizeof(buf),文件); sscanf(buf、%d%d、&W和&H); SkipComments(文件); fgets(buf,sizeof(buf),文件); sscanf(buf、%d、&Range); //printf(“头:%s,%d,%d,%d\n”,文件类型,W,H,范围); SkipComments(文件); if(strcmp(文件类型,“P5”)==0) { CH=1; } else if(strcmp(文件类型,“P6”)==0) { CH=3; } 其他的 { printf(“未知图像类型\n”); 退出(1);//异常终止 } 如果(范围!=255){ printf(“无效数据”); 退出(1);//异常终止 } //创建myImageData类 初始值(W,H,CH); //读取ppm数据 int datalength=this->mW*this->mH*this->mCH; unsigned char*temp=新的unsigned char[datalength]; fread(temp,sizeof(unsigned char),datalength,file); double*ptr1=this->mData; 无符号字符*ptr2=temp; 对于(int i=0;imCH==1){ sprintf(filenamefull,“%s.pgm”,文件名); } 否则{ sprintf(filenamefull,“%s.ppm”,文件名); } FILE*FILE=fopen(filenamefull,“w”); printf(“将图像写入:%s\n”,filenamefull); 如果(本->mCH==1){ fprintf(文件“P5\n”); } 否则{ fprintf(文件“P6\n”); } fprintf(文件,“%d%d\n”,this->mW,this->mH); fprintf(文件“255\n”); int datalength=this->mW*this->mH*this->mCH; unsigned char*temp=新的unsigned char[datalength]; double*ptr1=this->mData; 无符号字符*ptr2=temp; 对于(int i=0;i255)值=255; 如果(值也基本上是C++中的薄C +单板。没关系,每个人都得从某个地方开始。但是,您可以执行以下操作,而不是使用new创建数组: // read ppm data int datalength = this->mW * this->mH * this->mCH; // using a std::vector here means that the allocated memory will be freed // automatically, even in the result of an error occurring. std::vector<unsigned char> temp(datalength); fread(&temp[0], sizeof(unsigned char), datalength, file); 你的问题是什么?我们需要一些背景。向我们展示要修改的函数。这是一个很好的简单问题,如果您提供了代码,这个问题可能已经得到了解答!另外,提及您可能正在使用的编译器和库也会有所帮助。对不起,我现在正在添加代码。哪个函数会给您带来问题?它到底需要做什么?(颜色之间的切换太模糊了!只输出一个通道?交换通道?)您尝试了什么?非常感谢。。。我在这个领域还是新手,非常感谢你的帮助。 // read ppm data int datalength = this->mW * this->mH * this->mCH; // using a std::vector here means that the allocated memory will be freed // automatically, even in the result of an error occurring. std::vector<unsigned char> temp(datalength); fread(&temp[0], sizeof(unsigned char), datalength, file); void swapRB(myImageData& image) { assert(image.getCH() == 3); for (int x = 0; x < image.getWidth()) { for (int y = 0; x < image.getHeight()) { double R = image.get(x, y, 0); double G = image.get(x, y, 1); double B = image.get(x, y, 2); image.set(x, y, 0, B); image.set(x, y, 2, R); } } }

使用C++;代码 因为我对C++和图像处理很安静,所以我有一个问题,修改和添加代码的函数。 要求仅在RGB颜色之间切换 #include "stdio.h" #include "stdlib.h" #include "string.h" #include "ctype.h" #include "math.h" class myImageData { private: int mW; int mH; int mCH; double * mData; void SkipComments(FILE *fp) { int ch; char line[100]; while ((ch = fgetc(fp)) != EOF && isspace(ch)) ; if (ch == '#') { fgets(line, sizeof(line), fp); SkipComments(fp); } else { fseek(fp, -1, SEEK_CUR); } } public: myImageData(void) { this->mData = NULL; } ~myImageData() { if (this->mData != NULL) { delete[] this->mData; } } void init(int W, int H, int CH) { this->mW = W; this->mH = H; this->mCH = CH; if (this->mData != NULL) delete[] this->mData; this->mData = new double[(this->mW)*(this->mH)*(this->mCH)]; } int getWidth(void) { return this->mW; } int getHeight(void) { return this->mH; } int getCH(void) { return this->mCH; } double * getDataPtr(void) { return this->mData; } double get(int x, int y) { return this->mData[y*(this->mW) + x]; } double get(int x, int y, int CH) { return this->mData[this->mCH * (y*(this->mW) + x) + CH]; } void set(int x, int y, double value) { this->mData[y*(this->mW) + x] = value; } void set(int x, int y, int CH, double value) { this->mData[this->mCH *(y*(this->mW) + x) + CH] = value; } void read(const char *filename); void save(const char *filename); }; void myImageData::read(const char *filename) { FILE *file = fopen(filename, "r"); if (file == NULL){ printf("Cannot open %s\n", filename); exit(1); //abnormal termination } printf("Read an image from: %s\n", filename); // read ppm/pgm header char buf[256]; char filetype[256]; int W, H, Range, CH; fgets(buf, sizeof(buf), file); sscanf(buf, "%s", filetype); SkipComments(file); fgets(buf, sizeof(buf), file); sscanf(buf, "%d%d", &W, &H); SkipComments(file); fgets(buf, sizeof(buf), file); sscanf(buf, "%d", &Range); //printf("Header: %s, %d, %d, %d\n", filetype, W, H, Range); SkipComments(file); if (strcmp(filetype, "P5") == 0) { CH = 1; } else if (strcmp(filetype, "P6") == 0) { CH = 3; } else { printf("Unknown image type\n"); exit(1); //abnormal termination } if (Range != 255){ printf("Invalid data\n"); exit(1); //abnormal termination } // create myImageData class init(W, H, CH); // read ppm data int datalength = this->mW * this->mH * this->mCH; unsigned char * temp = new unsigned char[datalength]; fread(temp, sizeof(unsigned char), datalength, file); double * ptr1 = this->mData; unsigned char *ptr2 = temp; for (int i = 0; i < datalength; i++){ *ptr1 = (double)*ptr2; ptr1++; ptr2++; } delete[] temp; fclose(file); } void myImageData::save(const char *filename){ char filenamefull[256]; if (this->mCH == 1){ sprintf(filenamefull, "%s.pgm", filename); } else{ sprintf(filenamefull, "%s.ppm", filename); } FILE *file = fopen(filenamefull, "w"); printf("Write an image to: %s \n", filenamefull); if (this->mCH == 1){ fprintf(file, "P5\n"); } else{ fprintf(file, "P6\n"); } fprintf(file, "%d %d\n", this->mW, this->mH); fprintf(file, "255\n"); int datalength = this->mW * this->mH * this->mCH; unsigned char * temp = new unsigned char[datalength]; double * ptr1 = this->mData; unsigned char * ptr2 = temp; for (int i = 0; i < datalength; i++){ double value = *ptr1; value = round(value); if (value > 255) value = 255; if (value < 0) value = 0; *ptr2 = (unsigned char)value; ptr1++; ptr2++; } fwrite(temp, sizeof(unsigned char), datalength, file); delete[] temp; fprintf(file, "Â¥n"); fclose(file); } #包括“stdio.h” #包括“stdlib.h” #包括“string.h” #包括“ctype.h” #包括“math.h” 类myImageData { 私人: 整数兆瓦; int mH; 国际妇幼卫生组织; 双*mData; 作废SkipComments(文件*fp) { int-ch; 字符行[100]; while((ch=fgetc(fp))!=EOF&&isspace(ch)) ; 如果(ch='#') { fgets(行,sizeof(行),fp); SkipComments(fp); } 其他的 { fseek(fp,-1,SEEK_CUR); } } 公众: myImageData(无效) { 此->mData=NULL; } ~myImageData() { 如果(此->mData!=NULL) { 删除[]此->mData; } } void init(int W,int H,int CH) { 这->mW=W; 这->mH=H; 这->mCH=CH; 如果(此->mData!=NULL) 删除[]此->mData; 这->mData=新的双[(这->微波)*(这->微波)*(这->微波)*(这->微波)*(这->妇幼保健)]; } int getWidth(void) { 返回此->mW; } int getHeight(void) { 返回此->mH; } int getCH(无效) { 返回此->妇幼保健; } 双*getDataPtr(无效) { 返回此->mData; } 双进位(整数x,整数y) { 返回this->mData[y*(this->mW)+x]; } 双进位(整数x,整数y,整数CH) { 返回this->mData[this->mCH*(y*(this->mW)+x)+CH]; } 无效集(整数x,整数y,双值) { this->mData[y*(this->mW)+x]=值; } 无效集(整数x,整数y,整数CH,双值) { this->mData[this->mCH*(y*(this->mW)+x)+CH]=值; } 无效读取(常量字符*文件名); 无效保存(常量字符*文件名); }; void myImageData::read(常量字符*文件名) { FILE*FILE=fopen(文件名,“r”); if(file==NULL){ printf(“无法打开%s\n”,文件名); 退出(1);//异常终止 } printf(“从以下位置读取图像:%s\n”,文件名); //读取ppm/pgm头 char-buf[256]; char文件类型[256]; int W,H,范围,CH; fgets(buf,sizeof(buf),文件); sscanf(buf,“%s”,文件类型); SkipComments(文件); fgets(buf,sizeof(buf),文件); sscanf(buf、%d%d、&W和&H); SkipComments(文件); fgets(buf,sizeof(buf),文件); sscanf(buf、%d、&Range); //printf(“头:%s,%d,%d,%d\n”,文件类型,W,H,范围); SkipComments(文件); if(strcmp(文件类型,“P5”)==0) { CH=1; } else if(strcmp(文件类型,“P6”)==0) { CH=3; } 其他的 { printf(“未知图像类型\n”); 退出(1);//异常终止 } 如果(范围!=255){ printf(“无效数据”); 退出(1);//异常终止 } //创建myImageData类 初始值(W,H,CH); //读取ppm数据 int datalength=this->mW*this->mH*this->mCH; unsigned char*temp=新的unsigned char[datalength]; fread(temp,sizeof(unsigned char),datalength,file); double*ptr1=this->mData; 无符号字符*ptr2=temp; 对于(int i=0;imCH==1){ sprintf(filenamefull,“%s.pgm”,文件名); } 否则{ sprintf(filenamefull,“%s.ppm”,文件名); } FILE*FILE=fopen(filenamefull,“w”); printf(“将图像写入:%s\n”,filenamefull); 如果(本->mCH==1){ fprintf(文件“P5\n”); } 否则{ fprintf(文件“P6\n”); } fprintf(文件,“%d%d\n”,this->mW,this->mH); fprintf(文件“255\n”); int datalength=this->mW*this->mH*this->mCH; unsigned char*temp=新的unsigned char[datalength]; double*ptr1=this->mData; 无符号字符*ptr2=temp; 对于(int i=0;i255)值=255; 如果(值也基本上是C++中的薄C +单板。没关系,每个人都得从某个地方开始。但是,您可以执行以下操作,而不是使用new创建数组: // read ppm data int datalength = this->mW * this->mH * this->mCH; // using a std::vector here means that the allocated memory will be freed // automatically, even in the result of an error occurring. std::vector<unsigned char> temp(datalength); fread(&temp[0], sizeof(unsigned char), datalength, file); 你的问题是什么?我们需要一些背景。向我们展示要修改的函数。这是一个很好的简单问题,如果您提供了代码,这个问题可能已经得到了解答!另外,提及您可能正在使用的编译器和库也会有所帮助。对不起,我现在正在添加代码。哪个函数会给您带来问题?它到底需要做什么?(颜色之间的切换太模糊了!只输出一个通道?交换通道?)您尝试了什么?非常感谢。。。我在这个领域还是新手,非常感谢你的帮助。 // read ppm data int datalength = this->mW * this->mH * this->mCH; // using a std::vector here means that the allocated memory will be freed // automatically, even in the result of an error occurring. std::vector<unsigned char> temp(datalength); fread(&temp[0], sizeof(unsigned char), datalength, file); void swapRB(myImageData& image) { assert(image.getCH() == 3); for (int x = 0; x < image.getWidth()) { for (int y = 0; x < image.getHeight()) { double R = image.get(x, y, 0); double G = image.get(x, y, 1); double B = image.get(x, y, 2); image.set(x, y, 0, B); image.set(x, y, 2, R); } } },c++,image-processing,C++,Image Processing,我所犯的错误: 错误LNK2019:未解析的外部符号\u main在函数\u\u tmainCRTStartup中引用 错误LNK1120:1未解析的外部首先,您没有main函数。毫不奇怪,您的代码不起作用。。您所拥有的只是一个用于加载、保存和操作PPM图像文件的类 在我看来,您使用的是Visual Studio,因此需要一个如下所示的函数: int _tmain(int argc, _TCHAR* argv[]) { myImageData image; image.read(

我所犯的错误:
错误LNK2019:未解析的外部符号\u main在函数\u\u tmainCRTStartup中引用

错误LNK1120:1未解析的外部

首先,您没有
main
函数。毫不奇怪,您的代码不起作用。。您所拥有的只是一个用于加载、保存和操作PPM图像文件的类

在我看来,您使用的是Visual Studio,因此需要一个如下所示的函数:

int _tmain(int argc, _TCHAR* argv[])
{
    myImageData image;
    image.read("atestfile.ppm");

    // do some stuff to your image

    image.write("outputfile.ppm");
}
我假设你有一个PPM格式的测试图像,当然你可以在这里使用

现在这是疯狂:

double * ptr1 = this->mData;
unsigned char * ptr2 = temp;

for (int i = 0; i < datalength; i++){
    double value = *ptr1;
    value = round(value);
    if (value > 255) value = 255;
    if (value < 0) value = 0;
    *ptr2 = (unsigned char)value;
    ptr1++;
    ptr2++;
}
<> P>也基本上是C++中的薄C +单板。没关系,每个人都得从某个地方开始。但是,您可以执行以下操作,而不是使用
new
创建数组:

// read ppm data

int datalength = this->mW * this->mH * this->mCH;

// using a std::vector here means that the allocated memory will be freed
// automatically, even in the result of an error occurring.
std::vector<unsigned char> temp(datalength);
fread(&temp[0], sizeof(unsigned char), datalength, file);

你的问题是什么?我们需要一些背景。向我们展示要修改的函数。这是一个很好的简单问题,如果您提供了代码,这个问题可能已经得到了解答!另外,提及您可能正在使用的编译器和库也会有所帮助。对不起,我现在正在添加代码。哪个函数会给您带来问题?它到底需要做什么?(颜色之间的切换太模糊了!只输出一个通道?交换通道?)您尝试了什么?非常感谢。。。我在这个领域还是新手,非常感谢你的帮助。
// read ppm data

int datalength = this->mW * this->mH * this->mCH;

// using a std::vector here means that the allocated memory will be freed
// automatically, even in the result of an error occurring.
std::vector<unsigned char> temp(datalength);
fread(&temp[0], sizeof(unsigned char), datalength, file);
void swapRB(myImageData& image)
{
    assert(image.getCH() == 3);

    for (int x = 0; x < image.getWidth())
    {
        for (int y = 0; x < image.getHeight())
        {
            double R = image.get(x, y, 0);
            double G = image.get(x, y, 1);
            double B = image.get(x, y, 2);

            image.set(x, y, 0, B);
            image.set(x, y, 2, R);
        }
    }
}