Lecture et ecriture d'une image pgm en C
Résolu
Utilisateur anonyme
-
fiddy Messages postés 11653 Statut Contributeur -
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
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:
- Lire une image pgm en c
- Lire le coran en français pdf - Télécharger - Histoire & Religion
- Lire epub - Guide
- Lire fichier bin - Guide
- Légender une image - Guide
- Lire iso - Guide
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.
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
l'autre fichier "fct.h"
mais il fonctionne seulement si la taille d'image est petite,
merci pour votre aide
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