/* * odd fields only (ignored even fields), steve@media.mit.edu * (based on ndf's pnmdiff.c) * (parsing of pnm header: sbeck helped me with) */ #include #include #include #include #include struct image_params { char * filename; int width; int height; /* max_val is the maximum colour component value - often 255 */ int max_val; /* type is either '5' to indicate a P5 file or '6' to indicate a P6 file */ int type; }; /* double pow(double x, double y); */ void usage(void) { fprintf(stderr, "Use: pnmodd [-mark] image1 [-o imageout]\n"); exit(EXIT_SUCCESS); } void parse_commandline(int argc, char ** argv, struct image_params * a_params, char ** output_filename, int * mark) { int i; if (argc<3) usage(); for (i=1;ifilename==NULL) a_params->filename=(char *)strdup(argv[i]); else usage(); } if (a_params->filename==NULL) usage(); } void get_image_params(FILE * ifs, struct image_params * params) { int c; int dims[3]; int dims_scanned; if( ifs == NULL ) { fprintf(stderr,"get_frame_params: non-existant file\n"); exit(EXIT_FAILURE); } if (fgetc(ifs)!='P') { fprintf(stderr, "get_frame_params: file is not a ppm file - format " "not recognized.\n"); exit(EXIT_FAILURE); } c=fgetc(ifs); if (c!='5' && c!='6') { fprintf(stderr, "get_frame_params: I only speak P5 and P6.\n"); exit(EXIT_FAILURE); } params->type=c; /* enter a loop * skip comments which start with # * and look for the dimensions */ dims_scanned = 0; do { char line[80]; fgets( line, sizeof(line), ifs ); printf("got line [%s]\n", line ); if( *line != '#' ) { char *p = strtok(line," \n" ); while( p && (*p != '#') ) { sscanf(p,"%d", &dims[dims_scanned] ); dims_scanned++; p = strtok( NULL, " \n" ); } } printf("dims_scanned:%d\n", dims_scanned); } while( dims_scanned < 3 ); params->width = dims[0]; params->height = dims[1]; params->max_val = dims[2]; if( params->max_val != 255 ){ fprintf(stderr,"get_frame_params: max value must be 255\n"); exit( EXIT_FAILURE ); } } int main(int argc, char ** argv) { struct image_params a_params={NULL,0,0,0,0}; char * dest_filename=NULL; FILE * a, * b, * dest; double p_inv; /* 1.0/p */ double scale_factor; /* to make the result on same interval is input */ unsigned char a_pixel[3]; unsigned char same_pixel[3]= {0,0,0}; unsigned char out_pixel[3]; int mark=0; int bytes_per_pixel, i; int m,n; parse_commandline(argc, argv, &a_params, &dest_filename, &mark); if ((a=fopen(a_params.filename, "r"))==NULL) { fprintf(stderr, "Unable to open %s.\n", a_params.filename); exit(EXIT_FAILURE); } if (dest_filename==NULL) dest=stdout; else if ((dest=fopen(dest_filename, "w"))==NULL) { fprintf(stderr, "Unable to open %s.\n", dest_filename); exit(EXIT_FAILURE); } get_image_params(a, &a_params); if (a_params.type=='5') bytes_per_pixel=1; else bytes_per_pixel=3; *out_pixel=out_pixel[1]=out_pixel[2]=a_params.max_val; fprintf(dest, "P%c\n%d %d\n%d\n", a_params.type, a_params.width, a_params.height/2, a_params.max_val); m=0; n=0; while (!feof(a)) { fread(a_pixel, sizeof(unsigned char), bytes_per_pixel, a); if (!mark) for (i=0;i