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]) ;
143 * \fn void write_int2pgm(int **image, int i_dim, int j_dim, char *fichier_image, int recal)
144 * \brief copie au format pgm 8 bits
147 * \param[in] i_dim dimension verticale de l'image
148 * \param[in] j_dim dimension horizontale de l'image
149 * \param[in] fichier_image fichier image
150 * \param[in] recal recalage de l'image en 0-255
153 void write_int2pgm(int **image, int i_dim, int j_dim, char *fichier_image, int recal)
156 int val_min, val_max ;
158 unsigned char *ligne;
159 FILE *file=fopen(fichier_image,"wb");
163 fprintf(file, "P5\n") ;
164 fprintf(file, "# Physics and Images Processing Group\n") ;
165 fprintf(file, "# Fresnel Institut - Marseille - France\n") ;
167 fprintf(file, "%d %d\n", j_dim, i_dim) ;
169 fprintf(file, "%d\n" , 255 );
171 min_max_int1d(&val_min, &val_max, image[0], i_dim*j_dim) ;
172 coef = 255.0 / (val_max - val_min) ;
174 // on converti l'image en entier 8 bits (char)
175 ligne = malloc(sizeof(unsigned char)*j_dim );
176 for (i=0;i<i_dim;i++)
179 for (j=0;j<j_dim;j++) ligne[j] = (unsigned char)(coef * (image[i][j]-val_min)) ;
181 for (j=0;j<j_dim;j++) ligne[j] = (unsigned char)image[i][j] ;
182 fwrite(ligne, 1, j_dim, file);
192 * \fn void imagesc(int **image, int i_dim, int j_dim)
193 * \brief affiche une image via xti
196 * \param[in] i_dim dimension verticale de l'image
197 * \param[in] j_dim dimension horizontale de l'image
200 void imagesc(int **image, int i_dim, int j_dim)
202 char nom[SIZE_NAME_FILE] ;
203 //char cmd[SIZE_LINE_TEXT] ;
205 sprintf(nom, "imagesc_%d_%d.pgm", getuid(), rand()%20);
206 write_int2pgm(image, i_dim, j_dim, nom, 1) ;
208 // affichage avec xti
209 //sprintf(cmd, "xti %s &", nom) ;