/* pgmio.c -- Read and write the pgm image format. Written november 12, 2011 by Eric Olson for Math 761 */ #include #include #include void readimage(double x[], int n, char *p) { char buf[256]; FILE *fp; printf("Reading %s...\n", p); if(!(fp = fopen(p, "r"))) { fprintf(stderr, "Can't open %s for read!\n", p); exit(1); } int d, i = 0; int stage = 0; while(fgets(buf, sizeof(buf), fp)) { if(buf[0] == '#') continue; switch (stage) { case 0:; if(!strncmp(buf, "P2", 2)) { stage++; break; } fprintf(stderr, "Expecting P2 but found %s!\n", buf); exit(2); case 1:; int n1, n2; if(sscanf(buf, "%d %d", &n1, &n2) == 2) { if(n1 == n && n2 == n) { stage++; break; } } fprintf(stderr, "Expecting %d %d but found %s!\n", n, n, buf); exit(3); case 2:; if(sscanf(buf, "%d", &d) == 1) { if(d > 0) { stage++; break; } } fprintf(stderr, "Expecting d>0 but found d=%s!\n", buf); exit(4); case 3:; char *p, *q; p = buf; for(;;) { x[i] = (double) strtol(p, &q, 10) / d; if(p < q) { p = q; if(++i == n * n) { fclose(fp); return; } } else break; } } } fprintf(stderr, "Expecting %d pixels only found %d!\n", n * n, i); exit(5); } void writeimage(double x[], int n, char *p) { FILE *fp; printf("Writing %s...\n", p); if(!(fp = fopen(p, "w"))) { fprintf(stderr, "Can't open %s for write!\n", p); exit(6); } fprintf(fp, "P2\n# Created by writeimage.\n%d %d\n255\n", n, n); int i; for(i = 0; i < n * n; i++) { double r = x[i]; if(r > 1.0) r = 1.0; else if(r < 0.0) r = 0.0; int t = 255 * r + 0.5; fprintf(fp, "%d\n", t); } fclose(fp); }