3 * \brief Librairie de lecture/ecriture d'image ppm/pgm 8/16 bits
6 * \date 20 decembre 2009
16 #include "lib_images.h"
21 * \fn int type_image_ppm(int *prof, int *i_dim, int *j_dim, int *level, char *file_name)
22 * \brief Fonction qui renvoie le type de l'image ppm et des caracteristiques
24 * \param[out] prof profondeur de l'image 1 pour pgm 3 pour ppm, 0 sinon
25 * \param[out] i_dim renvoie la dimension verticale de l'image (si NULL, renvoie que prof)
26 * \param[out] j_dim renvoie la dimension horizontale de l'image
27 * \param[out] level renvoie la dynamique de l'image
28 * \param[in] file_name fichier image
30 * \return 1 si ok O sinon
33 int type_image_ppm(int *prof, int *i_dim, int *j_dim, int *level, char *file_name)
35 char buffer[SIZE_LINE_TEXT] ;
40 file = fopen(file_name, "rb");
44 // lecture de la premiere ligne
45 fgets(buffer, SIZE_LINE_TEXT, file);
48 if ((buffer[0] == 'P') & (buffer[1] == '5'))
51 if ((buffer[0] == 'P') & (buffer[1] == '6'))
52 *prof = 3 ; // RVBRVBRVB
55 if (*prof == 0) return 0 ;
57 /* pour une utilisation du type */
58 /* ret = type_image_ppm(&prof, NULL, NULL, NULL, file_name) */
62 /* on saute les lignes de commentaires */
63 fgets(buffer, SIZE_LINE_TEXT, file);
64 while ((buffer[0] == '#')|(buffer[0] == '\n'))
65 fgets(buffer, SIZE_LINE_TEXT, file);
67 /* on lit les dimensions de l'image */
68 sscanf(buffer, "%d %d", j_dim, i_dim) ;
69 fgets(buffer, SIZE_LINE_TEXT, file);
70 sscanf(buffer, "%d", level) ;
81 * \fn void load_pgm2int(int **image, int i_dim, int j_dim,
82 * int nb_level, char *fichier_image)
83 * \brief lecture pgm 8 ou 16 bits
86 * \param[in] i_dim dimension verticale de l'image
87 * \param[in] j_dim dimension horizontale de l'image
88 * \param[in] nb_level dynamique de l'image
89 * \param[in] fichier_image fichier image
93 void load_pgm2int(int **image, int i_dim, int j_dim,
94 int nb_level, char *fichier_image)
97 char buffer[SIZE_LINE_TEXT] ;
99 unsigned short *ligne2;
100 FILE *file = fopen(fichier_image, "rb");
102 fgets(buffer, SIZE_LINE_TEXT, file); /* P5 */
103 /* on saute les lignes de commentaires */
104 fgets(buffer, SIZE_LINE_TEXT, file);
105 while ((buffer[0] == '#')|(buffer[0] == '\n'))
106 fgets(buffer, SIZE_LINE_TEXT, file);
107 /* derniere ligne lue : dimensions */
108 fgets(buffer, SIZE_LINE_TEXT, file); /* dynamique */
114 // fichier en char, on converti au format int
115 ligne = (unsigned char*)malloc(sizeof(unsigned char)*j_dim) ;
117 for (i=0;i<i_dim;i++)
119 fread(ligne, 1, j_dim, file);
120 for (j=0;j<j_dim;j++)
121 image[i][j] = (int)(ligne[j]) ;
127 // fichier en short, on converti au format int
128 ligne2 = (unsigned short*)malloc(sizeof(unsigned short)*j_dim) ;
130 for (i=0;i<i_dim;i++)
132 fread(ligne2, 2, j_dim, file);
133 for (j=0;j<j_dim;j++)
134 image[i][j] = (int)(ligne2[j]) ;
142 void load_pgm2ushort(unsigned short **image, int i_dim, int j_dim,
143 int nb_level, char *fichier_image)
146 char buffer[SIZE_LINE_TEXT] ;
147 unsigned char *ligne;
148 unsigned short *ligne2;
149 FILE *file = fopen(fichier_image, "rb");
151 fgets(buffer, SIZE_LINE_TEXT, file); /* P5 */
152 /* on saute les lignes de commentaires */
153 fgets(buffer, SIZE_LINE_TEXT, file);
154 while ((buffer[0] == '#')|(buffer[0] == '\n'))
155 fgets(buffer, SIZE_LINE_TEXT, file);
156 /* derniere ligne lue : dimensions */
157 fgets(buffer, SIZE_LINE_TEXT, file); /* dynamique */
163 // fichier en char, on converti au format ushort
164 ligne = (unsigned char*)malloc(sizeof(unsigned char)*j_dim) ;
166 for (i=0;i<i_dim;i++)
168 fread(ligne, 1, j_dim, file);
169 for (j=0;j<j_dim;j++)
170 image[i][j] = (unsigned short)(ligne[j]) ;
177 ligne2 = (unsigned short*)malloc(sizeof(unsigned short)*j_dim) ;
179 for (i=0;i<i_dim;i++)
181 fread(ligne2, 2, j_dim, file);
182 for (j=0;j<j_dim;j++)
183 image[i][j] = (unsigned short)(ligne2[j]) ;
193 * \fn void write_int2pgm(int **image, int i_dim, int j_dim, char *fichier_image, int recal)
194 * \brief copie au format pgm 8 bits
197 * \param[in] i_dim dimension verticale de l'image
198 * \param[in] j_dim dimension horizontale de l'image
199 * \param[in] fichier_image fichier image
200 * \param[in] recal recalage de l'image en 0-255
203 void write_int2pgm(int **image, int i_dim, int j_dim, char *fichier_image, int recal)
206 int val_min, val_max ;
208 unsigned char *ligne;
209 FILE *file=fopen(fichier_image,"wb");
213 fprintf(file, "P5\n") ;
214 fprintf(file, "# Physics and Images Processing Group\n") ;
215 fprintf(file, "# Fresnel Institut - Marseille - France\n") ;
217 fprintf(file, "%d %d\n", j_dim, i_dim) ;
219 fprintf(file, "%d\n" , 255 );
221 min_max_int1d(&val_min, &val_max, image[0], i_dim*j_dim) ;
222 coef = 255.0 / (val_max - val_min) ;
224 // on converti l'image en entier 8 bits (char)
225 ligne = (unsigned char*)malloc(sizeof(unsigned char)*j_dim );
226 for (i=0;i<i_dim;i++)
229 for (j=0;j<j_dim;j++) ligne[j] = (unsigned char)(coef * (image[i][j]-val_min)) ;
231 for (j=0;j<j_dim;j++) ligne[j] = (unsigned char)image[i][j] ;
232 fwrite(ligne, 1, j_dim, file);
239 void write_ushort2pgm(unsigned short **image, int i_dim, int j_dim, char *fichier_image, int recal)
242 int val_min, val_max ;
244 unsigned char *ligne;
245 FILE *file=fopen(fichier_image,"wb");
249 fprintf(file, "P5\n") ;
250 fprintf(file, "# Physics and Images Processing Group\n") ;
251 fprintf(file, "# Fresnel Institute - Marseille - France\n") ;
253 fprintf(file, "%d %d\n", j_dim, i_dim) ;
255 fprintf(file, "%d\n" , 255 );
257 min_max_ushort1d(&val_min, &val_max, image[0], i_dim*j_dim) ;
258 coef = 255.0 / (val_max - val_min) ;
260 // on converti l'image en entier 8 bits (char)
261 ligne = (unsigned char*)malloc(sizeof(unsigned char)*j_dim );
262 for (i=0;i<i_dim;i++)
265 for (j=0;j<j_dim;j++) ligne[j] = (unsigned char)(coef * (image[i][j]-val_min)) ;
267 for (j=0;j<j_dim;j++) ligne[j] = (unsigned char)image[i][j] ;
268 fwrite(ligne, 1, j_dim, file);
277 * \fn void imagesc(int **image, int i_dim, int j_dim)
278 * \brief affiche une image via xti
281 * \param[in] i_dim dimension verticale de l'image
282 * \param[in] j_dim dimension horizontale de l'image
285 void imagesc(int **image, int i_dim, int j_dim)
287 char nom[SIZE_NAME_FILE] ;
288 //char cmd[SIZE_LINE_TEXT] ;
290 sprintf(nom, "imagesc_%d.pgm", getuid());
291 write_int2pgm(image, i_dim, j_dim, nom, 1) ;
293 // affichage avec xti
294 //sprintf(cmd, "xti %s &", nom) ;
298 void imagesc_ushort(unsigned short **image, int i_dim, int j_dim)
300 char nom[SIZE_NAME_FILE] ;
301 //char cmd[SIZE_LINE_TEXT] ;
303 sprintf(nom, "imagesc_%d.pgm", getuid());
304 write_ushort2pgm(image, i_dim, j_dim, nom, 1) ;