Lecture et ecriture d'une image pgm en C

Résolu
Utilisateur anonyme -  
fiddy Messages postés 11653 Statut Contributeur -
Bonjour,
Dans le cadre d mon projet sur le traitement des images dans langage c,je dois lire une image PGM puis recopier les valeurs de ses pixels dans un autre fichier
exemple du pgm:
P5
512 512
255
.....
ligne 1 :correspond au "magic number"
ligne 2 :hauteur largeur
ligne 3:la valeur maximale qu'un pixel peut prendre
à la suite valeur de chaque pixel

quelle est le prblm de ce code svp



#include<stdio.h>
#include<stdlib.h>
#include"outils.h"

int main(){
       
       char nom[21];
    int nbc,nbl,max,i,j;
       FILE *fo,*f;
      
       printf("donnez une image\n");
       scanf("%s",nom);
       
    fo=fopen(nom,"r");
       fscanf(fo,"%s %d %d %d",&nom,&nbc,&nbl,&max);            
       printf("%s\t\n",nom);
       printf("%d\t %d\n",nbc,nbl);
     
     unsigned char *Image=( unsigned char*)malloc((nbl*nbc)*sizeof( unsigned char*));
      
    
    
    
     
     char Ent[3];
    
     printf("\n Je suis dans la fonction LIRE :");
     
      f=fopen(nom, "r");
        
       fscanf(f,"%s %d %d %d", Ent, &nbc, &nbl, &max);
      
            
      for(i=0;i<nbl; i++){
   
      for(j=0;j<nbc; j++)
      {
      fscanf(f,"%c",*Image+i*nbc+j);
      
      }
      }
      fclose(f);
    
    
           
    
    printf("%c",*Image);                        //
       printf("1\n");
       
      
       
        f=fopen("nom.pgm", "w");
      
      fprintf(f,"%s\n%d %d\n%d\n", "P2", nbc, nbl, max);
    
 
       for(i=0;i<nbl; i++)
       {
      for(j=0;j<nbc; j++)
      
           fprintf(f,"%c",*Image+i*nbc+j);
           fprintf(f,"\n");
           }
      
      fclose(f);
     
       
       printf("2\n");
      
       system("Xnview.exe nom.pgm");
       
       
system("PAUSE");
return 0;
}


EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ici : ICI

Merci d'y penser dans tes prochains messages.
A voir également:

2 réponses

fiddy Messages postés 11653 Statut Contributeur 1 847
 
Bonjour,
Trop d'erreurs pour te dire précisément d'où ça vient.
Corrige déjà ceci :
int main(){
Le bon prototype est : int main(void)

fscanf(fo,"%s %d %d %d",&nom,&nbc,&nbl,&max);
Il ne faut pas mettre de & devant nom. C'est déjà une adresse dans ce contexte...
Attention, cette ligne serait juste si les différentes valeurs étaient sur une même ligne ; ce qui n'est pas le cas ici. Donc, utilise autant de fscanf() que de lignes.

unsigned char *Image=( unsigned char*)malloc((nbl*nbc)*sizeof( unsigned char*));
Conventionnellement, la 1ère lettre d'un nom de variable est minuscule. Le cast est superflu et même déconseillé. Ce n'est pas sizeof(unsigned char*) mais plutôt sizeof(unsigned char). A noter que ça vaut systématiquement 1. Donc inutile. Et si c'est pour la portabilité : utilise plutôt sizeof *image
Pourquoi ne pas utiliser une matrice plutôt ? Ca serait plus simple.

Attention tu déclares des variables un peu partout. Normalement, on le déclare en début de scope...

L'indentation est irrégulière...

fprintf(f,"%c",*Image+i*nbc+j);
fprintf(f,"\n");

Le fprintf(f, "\n"); est mal placé. Il doit être dans la seconde boucle for...

Dis-nous si cela a changé quelque chose. Si non, reposte ton code corrigé et on reregardera.
2
وهران سيما Messages postés 6 Statut Membre
 
Merci pour votre conseils fiddy,je crois j'ai corrigé les erreurs,je fais deux fichiers
main.c

#include<stdio.h>
#include<stdlib.h>
#include"fct.h"

int main(void){

       int *image;
       char nom[20],p[20];
       char nomOut[20];
    int nbc,nbl,max;
       FILE *ff;
       image=(int*)malloc(nbc*nbl*sizeof(*image));
       printf("donnez une image\n");
       scanf("%s",&nom);


       ff=fopen(nom,"r");
       if(ff==NULL){
                    printf("nulll");
                  }
       fscanf(ff,"%s\n%d %d\n%d",p,&nbl,&nbc,&max);

   


       Lire(nom,image,nbl,nbc,max);                               //



       printf("donnnez nomOut \n");
       scanf("%s",nomOut);

       Save(nomOut,image,nbl,nbc,max);


system("PAUSE");
return 0;
}




l'autre fichier "fct.h"
    // Lecture d'une image codée en format PGM ASCII
//passer d'un fichier sauvgarer sur le dique dure à une matrice qui représente l'image

void Lire(char nom[20],int *image,int nbl,int nbc,int max)
{
     int i,j;
     FILE *f;
     char Ent[20];
     printf("\n Je suis dans la fonction LIRE :");

     f=fopen(nom,"r");
     if(f==NULL){
                    printf("nulll");
                  }
                   

      fscanf(f,"%s\n%d %d\n%d",Ent,&nbl,&nbc,&max);

    
      for(i=0;i<nbl;i++)
      for(j=0;j<nbc;j++)
      {
      fscanf(f,"%d",image+i*nbc+j);

      }

      fclose(f);

}

// Sauvgarder ue image en format PGM ASCII
//passer d'une matrice à un fichier sauvgarer sur le dique dure

void Save(char nom[20],int *image,int nbl,int nbc,int max)
{
     int i, j;

     FILE *fo;
printf("\n Je suis dans la fonction SAVE :");

      fo=fopen(nom,"wt");
      if(fo==NULL){
                    printf("nulll");
                 }

      fprintf(fo,"%s\n%d %d\n%d\n","P2",nbl,nbc,max);
     



       for(i=0;i<nbl; i++)
       {
      for(j=0;j<nbc; j++)

           fprintf(fo,"%d ",*(image+i*nbc+j));
           fprintf(fo,"\n");
           }

      fclose(fo);

     }




mais il fonctionne seulement si la taille d'image est petite,
merci pour votre aide
0
fiddy Messages postés 11653 Statut Contributeur 1 847
 
Attention à pas changer trop de chose par rapport à ce que nous disons.. Sinon, il faut tout revérifier de 0...
En plus, je vois que tu as posé la même question sur un autre forum...
Je laisse donc l'autre forum répondre ;-).
0