Lecture et ecriture d'une image pgm en C

Résolu/Fermé
Utilisateur anonyme - Modifié par crapoulou le 22/01/2016 à 21:32
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 23 janv. 2016 à 16:27
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.

2 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
23 janv. 2016 à 00:31
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