Appendix F - pgm.c
1: #include < stdio.h >
2: #include < stdlib.h >
3: #include "pgm.h"
4:
5: /**********************File I/O functions*******************************/
6: /***********************************************************************/
7:
8: /*Gets an ascii pgm image file, store as a color pgm.*/
9: void getPGMfile (char filename[], PGMImage *img)
10: {
11: FILE *in_file;
12: char ch;
13: int row, col, type;
14: int ch_int;
15:
16: in_file = fopen(filename, "r");
17: if (in_file == NULL)
18: {
19: fprintf(stderr, "Error: Unable to open file %s\n\n", filename);
20: exit(8);
21: }
22:
23: printf("\nReading image file: %s\n", filename);
24:
25: /*determine pgm image type (only type three can be used)*/
26: ch = getc(in_file);
27: if(ch != 'P')
28: {
29: printf("ERROR(1): Not valid pgm/ppm file type\n");
30: exit(1);
31: }
32: ch = getc(in_file);
33: /*convert the one digit integer currently represented as a character to
34: an integer(48 == '0')*/
35: type = ch - 48;
36: if((type != 2) && (type != 3) && (type != 5) && (type != 6))
37: {
38: printf("ERROR(2): Not valid pgm/ppm file type\n");
39: exit(1);
40: }
41:
42: while(getc(in_file) != '\n'); /* skip to end of line*/
43:
44: while (getc(in_file) == '#') /* skip comment lines */
45: {
46: while (getc(in_file) != '\n'); /* skip to end of comment line */
47: }
48:
49: /*there seems to be a difference between color and b/w. This line is needed
50: by b/w but doesn't effect color reading...*/
51: fseek(in_file, -1, SEEK_CUR); /* backup one character*/
52:
53: fscanf(in_file,"%d", &((*img).width));
54: fscanf(in_file,"%d", &((*img).height));
55: fscanf(in_file,"%d", &((*img).maxVal));
56:
57: printf("\n width = %d",(*img).width);
58: printf("\n height = %d",(*img).height);
59: printf("\n maxVal = %d",(*img).maxVal);
60: printf("\n");
61:
62: if (((*img).width > MAX) || ((*img).height > MAX))
63: {
64: printf("\n\n***ERROR - image too big for current image structure***\n\n");
65: exit(1);
66: }
67:
68: if(type == 2) /*uncompressed ascii file (B/W)*/
69: {
70: for (row=(*img).height-1; row >=0; row--)
71: for (col=0; col< (*img).width; col++)
72: {
73: fscanf(in_file,"%d", &ch_int);
74: (*img).data[row][col].red = ch_int;
75: (*img).data[row][col].green = ch_int;
76: (*img).data[row][col].blue = ch_int;
77: }
78: }
79: else if(type == 3) /*uncompressed ascii file (color)*/
80: {
81: for (row=(*img).height-1; row >=0; row--)
82: for (col=0; col< (*img).width; col++)
83: {
84:
85: fscanf(in_file,"%d", &ch_int);
86: ((*img).data[row][col].red) = (unsigned char)ch_int;
87:
88: fscanf(in_file,"%d", &ch_int);
89: ((*img).data[row][col].green) = (unsigned char)ch_int;
90:
91: fscanf(in_file,"%d", &ch_int);
92: ((*img).data[row][col].blue) = (unsigned char)ch_int;
93: }
94: }
95: else if(type == 5) /*compressed file (B/W)*/
96: /*note: this type remains untested at this time...*/
97: {
98: while(getc(in_file) != '\n'); /*skip to end of line*/
99:
100: for (row=(*img).height-1; row >=0; row--)
101: for (col=0; col< (*img).width; col++)
102: {
103: ch = getc(in_file);
104: (*img).data[row][col].red = ch;
105: (*img).data[row][col].green = ch;
106: (*img).data[row][col].blue = ch;
107: }
108: }
109:
110: else if(type == 6) /*compressed file (color)*/
111: {
112: while(getc(in_file) != '\n'); /*skip to end of line*/
113:
114: for (row=(*img).height-1; row >=0; row--)
115: for (col=0; col< (*img).width; col++)
116: {
117: (*img).data[row][col].red = getc(in_file);
118: (*img).data[row][col].green = getc(in_file);
119: (*img).data[row][col].blue = getc(in_file);
120: }
121: }
122:
123: fclose(in_file);
124: printf("\nDone reading file.\n");
125: }
126:
127:
128: void save(PGMImage *img)
129: {
130: int i, j, nr, nc, k;
131: int red, green, blue;
132: FILE *iop;
133:
134: nr = img- >height;
135: nc = img- >width;
136:
137: iop = fopen("image1.pgm", "w");
138: fprintf(iop, "P6\n");
139: fprintf(iop, "%d %d\n", nc, nr);
140: fprintf(iop, "255\n");
141:
142: k = 1;
143: for(i = nr - 1; i >= 0; i--)
144: {
145: for(j = 0; j < nc; j++)
146: {
147: red = img- >data[i][j].red;
148: green = img- >data[i][j].green;
149: blue = img- >data[i][j].blue;
150: if(red < 0)
151: {
152: printf("IMG_WRITE: Found value %d at row %d col %d\n", red, i, j);
153: printf(" Setting red to zero\n");
154: red = 0;
155: }
156: if(green < 0)
157: {
158: printf("IMG_WRITE: Found value %d at row %d col %d\n", green,i, j);
159: printf(" Setting green to zero\n");
160: green = 0;
161: }
162: if(blue < 0)
163: {
164: printf("IMG_WRITE: Found value %d at row %d col %d\n", blue, i, j);
165: printf(" Setting green to zero\n");
166: blue = 0;
167: }
168: if(red > 255)
169: {
170: printf("IMG_WRITE: Found value %d at row %d col %d\n", red, i, j);
171: printf(" Setting red to 255\n");
172: red = 255;
173: }
174: if(green > 255)
175: {
176: printf("IMG_WRITE: Found value %d at row %d col %d\n", green,i, j);
177: printf(" Setting green to 255\n");
178: green = 255;
179: }
180: if(blue > 255)
181: {
182: printf("IMG_WRITE: Found value %d at row %d col %d\n", blue, i, j);
183: printf(" Setting blue to 255\n");
184: blue = 255;
185: }
186:
187: putc(red, iop);
188: putc(green, iop);
189: putc(blue, iop);
190: }
191: }
192: fprintf(iop, "\n");
193: fclose(iop);
194: }