1 ////////////////////////////////////////////////////////
2 // Name     : libppm.cpp
3 // Purpose  : Read/Write Portable Pixel Map images
4 // Author   : Chris M. Christoudias
5 // Modified by
6 // Created  : 03/20/2002
7 // Copyright: (c) Chris M. Christoudias
8 // Version  : v0.1
9 ////////////////////////////////////////////////////////
10 
11 #include "libppm.h"
12 #include <stdio.h>
13 #include <string.h>
14 
writePPMImage(char * filename,unsigned char * image,int height,int width,int depth,char * comments)15 int writePPMImage(char *filename, unsigned char *image, int height, int width, int depth, char *comments)
16 {
17 
18   if(!filename || !image) return PPM_NULL_PTR;
19   FILE *fp = fopen(filename, "wb");
20   if(!fp) return PPM_FILE_ERROR;
21 
22   //********************************************************
23   //Write header information and comments.
24   //********************************************************
25 
26   fprintf(fp, "P6\n%d %d", width, height);
27   if(comments && strlen(comments) <= 70) fprintf(fp, "%s\n", comments);
28   fprintf(fp, "%d %d\n%d\n", width, height, depth);
29 
30   //********************************************************
31   //Output raw image data.
32   //********************************************************
33 
34   int writeCount = fwrite(image, sizeof(unsigned char), height*width*3, fp);
35   fclose(fp);
36   if(writeCount !=height*width*3) return PPM_FILE_ERROR;
37   return PPM_NO_ERRORS;
38 }
39 
writePGMImage(char * filename,unsigned char * image,int height,int width,int depth,char * comments)40 int writePGMImage(char *filename, unsigned char *image, int height, int width, int depth, char *comments)
41 {
42 
43   if(!filename || !image) return PPM_NULL_PTR;
44   FILE *fp = fopen(filename, "wb");
45   if(!fp) return PPM_FILE_ERROR;
46 
47   //********************************************************
48   //Write header information and comments.
49   //********************************************************
50 
51   fprintf(fp, "P5\n%d %d", width, height);
52   if(comments && strlen(comments) <= 70) fprintf(fp, "%s\n", comments);
53   fprintf(fp, "%d %d\n%d\n", width, height, depth);
54 
55   //********************************************************
56   //Output raw image data.
57   //********************************************************
58 
59   int writeCount = fwrite(image, sizeof(unsigned char), height*width, fp);
60   fclose(fp);
61   if(writeCount !=height*width) return PPM_FILE_ERROR;
62   return PPM_NO_ERRORS;
63 }
64 
65 //write a PNM image
writePNMImage(char * filename,unsigned char * image,int height,int width,int depth,bool color,char * comments)66 int writePNMImage(char *filename , unsigned char *image, int height, int width, int depth, bool color,
67 		  char *comments)
68 {
69   int error;
70   if(color) {
71     error = writePPMImage(filename, image, height, width, depth, comments);
72   } else {
73     error = writePGMImage(filename, image, height, width, depth, comments);
74   }
75   return error;
76 }
77 
readPPMImage(char * filename,unsigned char ** image,int & height,int & width,int & depth)78 int readPPMImage(char *filename, unsigned char **image, int& height, int& width, int& depth)
79 {
80 
81   if(!filename) return PPM_NULL_PTR;
82   FILE *fp = fopen(filename, "rb");
83   if(!fp) return PPM_FILE_ERROR;
84 
85   //********************************************************
86   //Read header information.
87   //********************************************************
88 
89 /*
90   char buf[70];
91   if(!fgets(buf, 70, fp)) {
92 	  fclose(fp);
93 	  return PPM_FILE_ERROR;
94   }
95   if(strncmp(buf, "P6", 2)) {
96 	  fclose(fp);
97 	  return PPM_UNKNOWN_FORMAT;
98   }
99   do {
100     if(!fgets(buf, 70, fp)) {
101 	  fclose(fp);
102 	  return PPM_FILE_ERROR;
103   }
104   } while(buf[0] == '#');
105   sscanf(buf, "%d %d", &width, &height);
106   if(!fgets(buf, 70, fp)) {
107 	  fclose(fp);
108 	  return PPM_FILE_ERROR;
109   }
110   sscanf(buf , "%d", &depth);
111   */
112 
113   //!-Start modification by Sushil Mittal for handling different kinds of formats of .ppm file, 05/05/2009
114   char buf[70];
115   if(!fscanf(fp, "%69s", buf)) {
116 	  fclose(fp);
117 	  return PPM_FILE_ERROR;
118   }
119   if(strncmp(buf, "P6", 2)) {
120 	  fclose(fp);
121 	  return PPM_UNKNOWN_FORMAT;
122   }
123   fscanf(fp,"%69s",buf);
124   printf("%s\n",buf);
125   if(buf[0] == '#')
126   {
127 
128 	  while(buf[0] == '#')
129 	  {
130 		  if(!fscanf(fp, "%69s", buf)) {
131 			  fclose(fp);
132 			  return PPM_FILE_ERROR;
133 		  }
134 	  }
135   }
136   else
137   {
138 	  if(!fscanf(fp, "%69s", buf)) {
139 		  fclose(fp);
140 		  return PPM_FILE_ERROR;
141 	  }
142   }
143   sscanf(buf,"%d",&width);
144   if(!fscanf(fp, "%69s", buf)) {
145 	  fclose(fp);
146 	  return PPM_FILE_ERROR;
147   }
148   sscanf(buf,"%d",&height);
149   if(!fscanf(fp, "%69s", buf)) {
150 	  fclose(fp);
151 	  return PPM_FILE_ERROR;
152   }
153   sscanf(buf,"%d",&depth);
154   fgets(buf,70,fp);
155 
156 //!-End modification by Sushil Mittal for handling different kinds of formats of .ppm file, 05/05/2009
157   //********************************************************
158   //Read raw data information.
159   //********************************************************
160 
161   *image = new unsigned char [height * width * 3];
162   int readCount = fread(*image, sizeof(unsigned char), height*width*3, fp);
163   fclose(fp);
164   if(readCount != height*width*3) return PPM_FILE_ERROR;
165   return PPM_NO_ERRORS;
166 }
167 
readPGMImage(char * filename,unsigned char ** image,int & height,int & width,int & depth)168 int readPGMImage(char *filename, unsigned char **image, int& height, int& width, int& depth)
169 {
170 
171   if(!filename) return PPM_NULL_PTR;
172   FILE *fp = fopen(filename, "rb");
173 
174   //********************************************************
175   //Read header information.
176   //********************************************************
177 
178   char buf[70];
179   if(!fgets(buf, 70, fp)) {
180 	  fclose(fp);
181 	  return PPM_FILE_ERROR;
182   }
183   if(strncmp(buf, "P5", 2)) {
184 	  fclose(fp);
185 	  return PPM_UNKNOWN_FORMAT;
186   }
187   do {
188     if(!fgets(buf, 70, fp)) {
189 	    fclose(fp);
190 	    return PPM_FILE_ERROR;
191     }
192   } while(buf[0] == '#');
193   sscanf(buf, "%d %d", &width, &height);
194   if(!fgets(buf, 70, fp)) {
195 	  fclose(fp);
196 	  return PPM_FILE_ERROR;
197   }
198   sscanf(buf , "%d", &depth);
199 
200   //********************************************************
201   //Read raw data information.
202   //********************************************************
203 
204   *image = new unsigned char [height * width];
205   int readCount = fread(*image, sizeof(unsigned char), height*width, fp);
206   fclose(fp);
207   if(readCount != height*width) return PPM_FILE_ERROR;
208   return PPM_NO_ERRORS;
209 }
210 
211 //read a PNM image
readPNMImage(char * filename,unsigned char ** image,int & height,int & width,int & depth,bool & color)212 int readPNMImage(char *filename, unsigned char **image, int& height, int& width, int& depth, bool& color)
213 {
214   color = true; //assume PPM format
215   int error = readPPMImage(filename, image, height, width, depth);
216   if(error == PPM_UNKNOWN_FORMAT) {
217     color = false;
218     error = readPGMImage(filename, image, height, width, depth);
219   }
220   return error;
221 }
222 
223 
224