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