/** * \file lib_images.c * \brief Librairie de lecture/ecriture d'image ppm/pgm 8/16 bits * \author NB - PhyTI * \version x.x * \date 20 decembre 2009 * */ #include #include #include #include #include "lib_images.h" #include "lib_math.h" /** * \fn int type_image_ppm(int *prof, int *i_dim, int *j_dim, int *level, char *file_name) * \brief Fonction qui renvoie le type de l'image ppm et des caracteristiques * * \param[out] prof profondeur de l'image 1 pour pgm 3 pour ppm, 0 sinon * \param[out] i_dim renvoie la dimension verticale de l'image (si NULL, renvoie que prof) * \param[out] j_dim renvoie la dimension horizontale de l'image * \param[out] level renvoie la dynamique de l'image * \param[in] file_name fichier image * * \return 1 si ok O sinon * */ int type_image_ppm(int *prof, uint32 *i_dim, uint32 *j_dim, int *level, char *file_name) { char buffer[SIZE_LINE_TEXT] ; FILE *file ; *prof = 0 ; file = fopen(file_name, "rb"); if (file == NULL) return 0 ; // lecture de la premiere ligne fgets(buffer, SIZE_LINE_TEXT, file); /* pgm */ if ((buffer[0] == 'P') & (buffer[1] == '5')) *prof = 1 ; // GGG /* ppm */ if ((buffer[0] == 'P') & (buffer[1] == '6')) *prof = 3 ; // RVBRVBRVB /* type non gere */ if (*prof == 0) return 0 ; /* pour une utilisation du type */ /* ret = type_image_ppm(&prof, NULL, NULL, NULL, file_name) */ if (i_dim == NULL) return 1 ; /* on saute les lignes de commentaires */ fgets(buffer, SIZE_LINE_TEXT, file); while ((buffer[0] == '#')|(buffer[0] == '\n')) fgets(buffer, SIZE_LINE_TEXT, file); /* on lit les dimensions de l'image */ sscanf(buffer, "%d %d", j_dim, i_dim) ; fgets(buffer, SIZE_LINE_TEXT, file); sscanf(buffer, "%d", level) ; fclose(file); return 1 ; } /** * \fn void load_pgm2int(int **image, int i_dim, int j_dim, * int nb_level, char *fichier_image) * \brief lecture pgm 8 ou 16 bits * * \param[out] image * \param[in] i_dim dimension verticale de l'image * \param[in] j_dim dimension horizontale de l'image * \param[in] nb_level dynamique de l'image * \param[in] fichier_image fichier image * * */ void load_pgm2int(int **image, int i_dim, int j_dim, int nb_level, char *fichier_image) { int i, j ; char buffer[SIZE_LINE_TEXT] ; unsigned char *ligne; unsigned short *ligne2; FILE *file = fopen(fichier_image, "rb"); fgets(buffer, SIZE_LINE_TEXT, file); /* P5 */ /* on saute les lignes de commentaires */ fgets(buffer, SIZE_LINE_TEXT, file); while ((buffer[0] == '#')|(buffer[0] == '\n')) fgets(buffer, SIZE_LINE_TEXT, file); /* derniere ligne lue : dimensions */ fgets(buffer, SIZE_LINE_TEXT, file); /* dynamique */ /* data */ if (nb_level < 256) { // fichier en char, on converti au format int ligne = malloc(sizeof(unsigned char)*j_dim) ; for (i=0;i