3 * \brief Librairie de lecture/ecriture d'image ppm/pgm 8/16 bits
6 * \date 20 decembre 2009
15 #include "lib_images.h"
20 * \fn int type_image_ppm(int *prof, int *i_dim, int *j_dim, int *level, char *file_name)
21 * \brief Fonction qui renvoie le type de l'image ppm et des caracteristiques
23 * \param[out] prof profondeur de l'image 1 pour pgm 3 pour ppm, 0 sinon
24 * \param[out] i_dim renvoie la dimension verticale de l'image (si NULL, renvoie que prof)
25 * \param[out] j_dim renvoie la dimension horizontale de l'image
26 * \param[out] level renvoie la dynamique de l'image
27 * \param[in] file_name fichier image
29 * \return 1 si ok O sinon
32 int type_image_ppm(int *prof, uint32 *i_dim, uint32 *j_dim, int *level, char *file_name)
34 char buffer[SIZE_LINE_TEXT] ;
39 file = fopen(file_name, "rb");
43 // lecture de la premiere ligne
44 fgets(buffer, SIZE_LINE_TEXT, file);
47 if ((buffer[0] == 'P') & (buffer[1] == '5'))
50 if ((buffer[0] == 'P') & (buffer[1] == '6'))
51 *prof = 3 ; // RVBRVBRVB
54 if (*prof == 0) return 0 ;
56 /* pour une utilisation du type */
57 /* ret = type_image_ppm(&prof, NULL, NULL, NULL, file_name) */
61 /* on saute les lignes de commentaires */
62 fgets(buffer, SIZE_LINE_TEXT, file);
63 while ((buffer[0] == '#')|(buffer[0] == '\n'))
64 fgets(buffer, SIZE_LINE_TEXT, file);
66 /* on lit les dimensions de l'image */
67 sscanf(buffer, "%d %d", j_dim, i_dim) ;
68 fgets(buffer, SIZE_LINE_TEXT, file);
69 sscanf(buffer, "%d", level) ;
80 * \fn void load_pgm2int(int **image, int i_dim, int j_dim,
81 * int nb_level, char *fichier_image)
82 * \brief lecture pgm 8 ou 16 bits
85 * \param[in] i_dim dimension verticale de l'image
86 * \param[in] j_dim dimension horizontale de l'image
87 * \param[in] nb_level dynamique de l'image
88 * \param[in] fichier_image fichier image
92 void load_pgm2int(int **image, int i_dim, int j_dim,
93 int nb_level, char *fichier_image)
96 char buffer[SIZE_LINE_TEXT] ;
98 unsigned short *ligne2;
99 FILE *file = fopen(fichier_image, "rb");
101 fgets(buffer, SIZE_LINE_TEXT, file); /* P5 */
102 /* on saute les lignes de commentaires */
103 fgets(buffer, SIZE_LINE_TEXT, file);
104 while ((buffer[0] == '#')|(buffer[0] == '\n'))
105 fgets(buffer, SIZE_LINE_TEXT, file);
106 /* derniere ligne lue : dimensions */
107 fgets(buffer, SIZE_LINE_TEXT, file); /* dynamique */
113 // fichier en char, on converti au format int
114 ligne = malloc(sizeof(unsigned char)*j_dim) ;
116 for (i=0;i<i_dim;i++)
118 fread(ligne, 1, j_dim, file);
119 for (j=0;j<j_dim;j++)
120 image[i][j] = (int)(ligne[j]) ;
126 // fichier en short, on converti au format int
127 ligne2 = malloc(sizeof(unsigned short)*j_dim) ;
129 for (i=0;i<i_dim;i++)
131 fread(ligne2, 2, j_dim, file);
132 for (j=0;j<j_dim;j++)
133 image[i][j] = (int)(ligne2[j]) ;
141 void load_pgm2ushort(unsigned short **image, int i_dim, int j_dim,
142 int nb_level, char *fichier_image)
145 char buffer[SIZE_LINE_TEXT] ;
146 unsigned char *ligne;
147 unsigned short *ligne2;
148 FILE *file = fopen(fichier_image, "rb");
150 fgets(buffer, SIZE_LINE_TEXT, file); /* P5 */
151 /* on saute les lignes de commentaires */
152 fgets(buffer, SIZE_LINE_TEXT, file);
153 while ((buffer[0] == '#')|(buffer[0] == '\n'))
154 fgets(buffer, SIZE_LINE_TEXT, file);
155 /* derniere ligne lue : dimensions */
156 fgets(buffer, SIZE_LINE_TEXT, file); /* dynamique */
162 // fichier en char, on converti au format ushort
163 ligne = malloc(sizeof(unsigned char)*j_dim) ;
165 for (i=0;i<i_dim;i++)
167 fread(ligne, 1, j_dim, file);
168 for (j=0;j<j_dim;j++)
169 image[i][j] = (unsigned short)(ligne[j]) ;
176 ligne2 = malloc(sizeof(unsigned short)*j_dim) ;
178 for (i=0;i<i_dim;i++)
180 fread(ligne2, 2, j_dim, file);
181 for (j=0;j<j_dim;j++)
182 image[i][j] = (unsigned short)(ligne2[j]) ;
192 * \fn void write_int2pgm(int **image, int i_dim, int j_dim, char *fichier_image, int recal)
193 * \brief copie au format pgm 8 bits
196 * \param[in] i_dim dimension verticale de l'image
197 * \param[in] j_dim dimension horizontale de l'image
198 * \param[in] fichier_image fichier image
199 * \param[in] recal recalage de l'image en 0-255
202 void write_int2pgm(int **image, int i_dim, int j_dim, char *fichier_image, int recal)
205 int val_min, val_max ;
207 unsigned char *ligne;
208 FILE *file=fopen(fichier_image,"wb");
212 fprintf(file, "P5\n") ;
213 fprintf(file, "# Physics and Images Processing Group\n") ;
214 fprintf(file, "# Fresnel Institut - Marseille - France\n") ;
216 fprintf(file, "%d %d\n", j_dim, i_dim) ;
218 fprintf(file, "%d\n" , 255 );
220 min_max_int1d(&val_min, &val_max, image[0], i_dim*j_dim) ;
221 coef = 255.0 / (val_max - val_min) ;
223 // on converti l'image en entier 8 bits (char)
224 ligne = malloc(sizeof(unsigned char)*j_dim );
225 for (i=0;i<i_dim;i++)
228 for (j=0;j<j_dim;j++) ligne[j] = (unsigned char)(coef * (image[i][j]-val_min)) ;
230 for (j=0;j<j_dim;j++) ligne[j] = (unsigned char)image[i][j] ;
231 fwrite(ligne, 1, j_dim, file);
238 void write_ushort2pgm(unsigned short **image, int i_dim, int j_dim, char *fichier_image, int recal)
241 int val_min, val_max ;
243 unsigned char *ligne;
244 FILE *file=fopen(fichier_image,"wb");
248 fprintf(file, "P5\n") ;
249 fprintf(file, "# Physics and Images Processing Group\n") ;
250 fprintf(file, "# Fresnel Institute - Marseille - France\n") ;
252 fprintf(file, "%d %d\n", j_dim, i_dim) ;
254 fprintf(file, "%d\n" , 255 );
256 min_max_ushort1d(&val_min, &val_max, image[0], i_dim*j_dim) ;
257 coef = 255.0 / (val_max - val_min) ;
259 // on converti l'image en entier 8 bits (char)
260 ligne = malloc(sizeof(unsigned char)*j_dim );
261 for (i=0;i<i_dim;i++)
264 for (j=0;j<j_dim;j++) ligne[j] = (unsigned char)(coef * (image[i][j]-val_min)) ;
266 for (j=0;j<j_dim;j++) ligne[j] = (unsigned char)image[i][j] ;
267 fwrite(ligne, 1, j_dim, file);
276 * \fn void imagesc(int **image, int i_dim, int j_dim)
277 * \brief affiche une image via xti
280 * \param[in] i_dim dimension verticale de l'image
281 * \param[in] j_dim dimension horizontale de l'image
284 void imagesc(int **image, int i_dim, int j_dim)
286 char nom[SIZE_NAME_FILE] ;
287 //char cmd[SIZE_LINE_TEXT] ;
289 sprintf(nom, "imagesc_%d.pgm", getuid());
290 write_int2pgm(image, i_dim, j_dim, nom, 1) ;
292 // affichage avec xti
293 //sprintf(cmd, "xti %s &", nom) ;
297 void imagesc_ushort(unsigned short **image, int i_dim, int j_dim)
299 char nom[SIZE_NAME_FILE] ;
300 //char cmd[SIZE_LINE_TEXT] ;
302 sprintf(nom, "imagesc_%d.pgm", getuid());
303 write_ushort2pgm(image, i_dim, j_dim, nom, 1) ;