Lecture d'un fichier image

Signaler
Messages postés
8
Date d'inscription
vendredi 22 septembre 2006
Statut
Membre
Dernière intervention
21 mars 2009
-
Messages postés
8
Date d'inscription
vendredi 22 septembre 2006
Statut
Membre
Dernière intervention
21 mars 2009
-
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

Messages postés
1309
Date d'inscription
samedi 31 janvier 2009
Statut
Membre
Dernière intervention
5 juin 2013
12
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;
}
Messages postés
8
Date d'inscription
vendredi 22 septembre 2006
Statut
Membre
Dernière intervention
21 mars 2009

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