Lecture d'un fichier image

jonezy Messages postés 8 Date d'inscription vendredi 22 septembre 2006 Statut Membre Dernière intervention 21 mars 2009 - 19 mars 2009 à 18:52
jonezy Messages postés 8 Date d'inscription vendredi 22 septembre 2006 Statut Membre Dernière intervention 21 mars 2009 - 21 mars 2009 à 00:30
Bonjour,



Je dois ecrire une fonction qui alloue une nouvelle image a partir du fichier fournis en argument.



A l'execution j'ai une "erreur de segmentation".


J'ai du mal avec les fonctions de lecture de fichier, quelques conseils seraient bienvenue.



voici la structure et le code de ma fonction.

typedef struct
    {
    unsigned long nx;
    unsigned long ny;
    unsigned long nb_ng;
    unsigned char *buff;
    } image_t;

image_t *charger_image_pgm(char *nom_fichier){
   
    FILE *fic;
    image_t *img;
    char buff[TAILLE_BUFF];
   
    fic=fopen(nom_fichier,"r");
    if(fic==NULL){
        fprintf(stderr,"impossible d'ouvrir le fichier");
        return 0;
    }

    fgets(buff,TAILLE_BUFF,fic);
  
    fread(img->buff,img->nx,img->ny*sizeof(unsigned char),fic);
   
    fclose(fic);
    return img;
}

Merci

2 réponses

TychoBrahe Messages postés 1309 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 5 juin 2013 12
20 mars 2009 à 21:38
Salut,

Tu déclare un pointeur du type image_t mais tu ne le fait pointer vers aucun espace mémoire qui t'appartient, En gros, lors de sa déclaration il a pour valeur ... de la merde (ce qui se trouvais autrefosi en mémoire a son emplacement), Or, ce qui se trouve a l'emplacement dont l'adresse est "de la merde", ça a de fortes chance de ne pas être a toi ... et pan segfault !

Bref, il te faut simplement faire un joli malloc (que tu pensera a free dès que tu n'auras plus besoin de la valeur). Ceci corrigé, il te reste une grosse erreur : img->nx et img->ny sont utilisés alors qu'ils ne sont pas initialisés ! Dans l'exemple, je les ai symboliquement mis a 0 car je ne sais pas du tout ce a quoi ils correspondent (je me doute bien qu'ils ne devraient pas être a 0 en temps normal).

Exemple de code «corrigé» :

image_t *charger_image_pgm(char *nom_fichier){
   
    FILE *fic;
    image_t *img;
    char buff[TAILLE_BUFF];
    if ((img malloc(sizeof(*img))) NULL){
        fprintf(stderr,"memoire insufisante");
        return NULL;
    }
    img->nx = 0;
    img->ny = 0;
    if(( fic fopen(nom_fichier,"r")) NULL){
        fprintf(stderr,"impossible d'ouvrir le fichier");
        return 0;
    }

    fgets(buff,TAILLE_BUFF,fic);
  
    fread(img->buff, img->nx, img->ny * sizeof(unsigned char), fic);
   
    fclose(fic);
    return img;
}
0
jonezy Messages postés 8 Date d'inscription vendredi 22 septembre 2006 Statut Membre Dernière intervention 21 mars 2009
21 mars 2009 à 00:30
Salut
Merci TychoBrahe pour tes corrections, je n'est plus d'erreur de segmentation maintenant j'essaie de charger une photo, d'en faire une copie et de
sauvegarder cette copie, le probleme c'est que les fichiers ne sont pas
identiques la copie est une image toute blanche. Je suis débutant quelques conseils sont les bienvenue.

voici mes codes:

pour creer une image:
image_t *creer_image(){
    image_t * img1;
   
    img1 = (image_t*)malloc(sizeof(image_t));
    img1->nx=0;
    img1->ny=0;
    img1->nb_ng=0;
    img1->buff=NULL;

    return img1;
 }

pour copier une image:
image_t *copier_image(image_t *src){
    image_t *dest;   
    dest =creer_image();
    dest->nx= src->nx;
    dest->ny=src->ny;
    dest->nb_ng=src->nb_ng;
    dest->buff=(unsigned char*)malloc(src->nx*src->ny*sizeof(unsigned char));
    memcpy(dest->buff,src->buff,src->nx*src->ny*sizeof(unsigned char));

    return dest;
}

pour liberer la memoire :
void detruire_image(image_t *p){
    free(p->buff);
    free(p);

pour sauver l'image dans un fichier:
int sauver_image_pgm(char *nom_fichier, image_t *img){

    FILE *fic;
   
    fic =fopen(nom_fichier,"w");
    if(fic= =NULL){
        fprintf(stderr,"impossible d'ouvrir le fichier");
        return 0;
    }

    //en-tete de type texte ASCII
    fprintf(fic,"P5\n"); 
    fprintf(fic,"%d %d\n",img->nx,img->ny);
    fprintf(fic,"%d\n",img->nb_ng);

    fwrite(img->buff,img->nx,img->ny*sizeof(unsigned char),fic);
    fclose(fic);
   
    return 1;
}

pour lire l'image:

image_t *charger_image_pgm(char *nom_fichier){
   
    FILE *fic;
    image_t *img;
    char buff[TAILLE_BUFF];

    fic =fopen(nom_fichier,"r");
    if(fic==NULL){
        fprintf(stderr,"impossible d'ouvrir le fichier");
        return 0;
    }

    img=creer_image();

    fgets(buff,TAILLE_BUFF,fic);

   
    fread(img->buff,img->nx,img->ny*sizeof(unsigned char),fic);
   
    fclose(fic);
    return img;
}

MERCI
0
Rejoignez-nous