Lecture et ecriture d'une image pgm en C
Résolu
Utilisateur anonyme
-
fiddy Messages postés 441 Date d'inscription Statut Contributeur Dernière intervention -
fiddy Messages postés 441 Date d'inscription Statut Contributeur Dernière intervention -
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
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
-
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. -
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