C语言中的PGM文件处理
对于C语言,我尝试从命令提示符读取输入PGM文件(P2、P5或P6)和输出文件,然后将数据读取到缓冲区,最后将其写入输出文件。一切都在编译,但当我查看输出文件时,只有P2看起来像原始文件。P5和P6看起来像一团彩虹。我包括我的代码C语言中的PGM文件处理,c,malloc,fwrite,pgm,C,Malloc,Fwrite,Pgm,对于C语言,我尝试从命令提示符读取输入PGM文件(P2、P5或P6)和输出文件,然后将数据读取到缓冲区,最后将其写入输出文件。一切都在编译,但当我查看输出文件时,只有P2看起来像原始文件。P5和P6看起来像一团彩虹。我包括我的代码 #include <stdio.h> #include <stdlib.h> unsigned char* getPGMfile(char filename[], int *lwidth, int *lheight, int *lchanne
#include <stdio.h>
#include <stdlib.h>
unsigned char* getPGMfile(char filename[], int *lwidth, int *lheight, int *lchannel);
int save(char filename[], unsigned char*data, int lwidth, int lheight, int lchannel);
int main(int argc, char **argv){
int lwidth, lheight, lchannel;
getPGMfile(argv[1], &lwidth, &lheight, &lchannel);
unsigned char* data=(getPGMfile(argv[1], &lwidth, &lheight, &lchannel));
printf("width, height, channel: %d %d %d\n",lwidth,lheight,lchannel);
save(argv[2], data, lwidth, lheight, lchannel);
return 0;
}
unsigned char* getPGMfile (char filename[], int *lwidth, int *lheight, int *lchannel){
FILE *in_file;
char ch;
int row, col, type;
int ch_int;
in_file = fopen(filename, "r");
if (in_file == NULL){
fprintf(stderr, "Unable to open file %s\n\n", filename);
exit(8);
}
printf("\nReading image file: %s\n", filename);
ch = getc(in_file);
if(ch != 'P'){
printf("Not valid pgm/ppm file type\n");
exit(1);
}
ch = getc(in_file);
type = ch - 48;
if((type != 2) && (type != 5) && (type != 6)){
printf("Not valid pgm/ppm file type\n");
exit(1);
}
while(getc(in_file) != '\n');
while (getc(in_file) == '#'){
while (getc(in_file) != '\n');
}
fseek(in_file, -1, SEEK_CUR);
int width, height;
fscanf(in_file,"%d%d", &width, &height);
printf("width and heigth: %d %d\n", width, height);
int intensity;
fscanf(in_file,"%d", &intensity);
printf("intensity: %d\n", intensity);
unsigned char *data;
if(type == 2){
*lchannel=5;
int k=0;
data = (unsigned char *) malloc((width*height)*sizeof(unsigned char));
for (row=height-1; row >=0; row--)
for (col=0; col<width; col++){
fscanf(in_file,"%d", &ch_int);
data[k]=ch_int;k++;
}
}
else if(type == 5){
*lchannel=6;
data=(unsigned char *) malloc(width*height*sizeof(unsigned char));
fread(data, 1, (width*height), in_file);
}
else if(type == 6){
*lchannel=6;
data=(unsigned char *) malloc(3*(width*height)*sizeof(unsigned char));
fread(data, 1, (3*(width*height)), in_file);
}
fclose(in_file);
printf("\nDone reading file\n");
*lwidth=width;
*lheight=height;
return data;
}
int save(char filename[],unsigned char *data, int lwidth, int lheight, int lchannel){
FILE *fp;
fp = fopen(filename, "wb");
const int dimx = 800, dimy = 800;
int i,j;
if(lchannel == 5){
fprintf(fp,"P5\n%u %u\n255\n", lwidth, lheight);
fwrite(data,1,(lwidth*lheight),fp);
printf("File %s saved.\n",filename);
}
else if(lchannel == 6){
fprintf(fp,"P6\n%u %u\n255\n", lwidth, lheight);
for(j=0;j<dimy;++j){
for(i=0;i<dimx;++i){
static unsigned char color[3];
color[0]=i%256;
color[1]=j%256;
color[2]=(i*j)%256;
fwrite(color,1,3,fp);
}
}
printf("File %s saved.\n",filename);
}
fclose(fp);
return(0);
free(data);
}
#包括
#包括
无符号char*getPGMfile(char filename[],int*lwidth,int*lheight,int*lchannel);
int save(字符文件名[],无符号字符*数据,int lwidth,int lheight,int lchannel);
int main(int argc,字符**argv){
国际宽度、高度、L通道;
getPGMfile(argv[1]、&lwidth、&lheight和&lchannel);
无符号字符*数据=(getPGMfile(argv[1]、&lwidth、&lheight、&lchannel));
printf(“宽度、高度、通道:%d%d%d\n”、宽度、高度、通道号);
保存(argv[2],数据,lwidth,lheight,lchannel);
返回0;
}
无符号char*getPGMfile(char filename[],int*lwidth,int*lheight,int*lchannel){
文件*在_文件中;
char ch;
int行、列、类型;
int CHU int;
in_file=fopen(文件名,“r”);
if(in_file==NULL){
fprintf(stderr,“无法打开文件%s\n\n”,文件名);
出口(8);
}
printf(“\n正在读取图像文件:%s\n”,文件名);
ch=getc(在文件中);
如果(ch!=“P”){
printf(“无效的pgm/ppm文件类型\n”);
出口(1);
}
ch=getc(在文件中);
类型=ch-48;
如果((类型!=2)&&(类型!=5)&&(类型!=6)){
printf(“无效的pgm/ppm文件类型\n”);
出口(1);
}
while(getc(在文件中)!='\n');
while(getc(在_文件中)='#'){
while(getc(在文件中)!='\n');
}
fseek(在文件中,-1,SEEK\u CUR);
int宽度、高度;
fscanf(在_文件中,“%d%d”、&宽度和高度);
printf(“宽度和高度:%d%d\n”,宽度和高度);
智力强度;
fscanf(在_文件中,“%d”&强度);
printf(“强度:%d\n”,强度);
无符号字符*数据;
如果(类型==2){
*l通道=5;
int k=0;
数据=(无符号字符*)malloc((宽度*高度)*sizeof(无符号字符));
对于(行=高度-1;行>=0;行--)
对于(col=0;colfread大小应该是sizeof(unsigned char)而不是1。删除了标记。是一个灵活的软件草图手册,是一种学习如何在视觉艺术环境中编码的语言。欢迎使用stackoverflow。您需要问一个特定的问题。“调试我的代码”这不是一个特定的问题。即使有人为您调试代码,但从长远来看对您没有帮助。您需要自己学习这样做。您是否在调试器中逐步完成代码?或添加调试打印?或任何其他调试步骤?当您的输入映像为p5或p6映像时,您会强制输出为p6映像。但在generator中,当图像为p6时,您明确地绘制了某种彩虹……您的问题到底是什么?您是否有强烈的愿望或要求编写自己的代码来读取和写入这些文件?因为已经提供了用于执行这些任务的漂亮、易用的库函数。sizeof(char)
定义为1。参见6.5.3.4:操作员的大小和\u对齐,第4段