IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

langage c et ppm.. et mes erreurs..


Sujet :

C

  1. #1
    Membre éclairé Avatar de Rniamo
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    508
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 508
    Par défaut langage c et ppm.. et mes erreurs..
    bonjour, je souhaite copier le contenu des couleurs d'une images dans un tableau de la taille de l'image.

    Pour cela, j'ai choisi le format ppm que je "reformate" en supprimer le P3 (ou Px) et la taille de 'limage.
    Je suis en noir et blanc donc une dimension suffit.

    j'ai le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    int main(void)
    {
    	FILE *image=fopen("image.ppm","r");
    	FILE *sortie=fopen("sortie.ppm","w");
    	int h=0,l=0,i,d=0;
    	ImageTP im_conv;
    	im_conv=InitialiserImageTP(128,128);
     
    	fseek(image,0,SEEK_SET);
    	h=0;l=0;
    	while(getc(image)!= EOF)
    	{
    		fscanf(image,"%d",&d);
    		im_conv.pixels[h][l]=d;
    		h=(h+1)%128;
    		if (h==0) {l=(l+1)%128;}
    	}					
     
    	fseek(image,0,SEEK_SET);
    	fprintf(sortie,"P3\n128 128\n");
    	for(l=0;l<128;l++)
    		for(h=0;h<128;h++)	
    	{
    		fprintf(sortie,"%d\n",im_conv.pixels[h][l]);
    		printf("%d\n",im_conv.pixels[h][l]);
    	}
     
    	fclose(image);
    	fclose(sortie);
    	return 0;
    }
    Et là pas grand-chose marche : la première partie (le "while(getc)") ne copie même pas chaque termes dans le tableau , je pense à une erreur dans mes incrémentations mais je ne la vois pas.

    Autre chose, quand je li chaque caractères directement (via un printf) le premier est tronquer : ex : j'ai 255 et j'écrit 55.

    Enfin la deuxième partie (les deux for) ne m'écrit pas du tout ce que je veux.

    Je ne m'y connais pas trop en lecture de fichier donc si quelqu'un peut me sortir de l'impasse ça me débloquerait la situation...surtout que j'ai plusieurs fontions qui attendent d'être testée.

  2. #2
    Membre éclairé Avatar de Rniamo
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    508
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 508
    Par défaut
    ah oui, j'ai oublié :

    ImageTP est un type un peu compliqué que j'ai récupérer d'un TP qu'un ami a fait ; il contient la hauteur, largeur du tableau et la couleur de ses pixels via le tableau nom.pixels[][].

  3. #3
    Membre éclairé Avatar de je®ome
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    while(getc(image)!= EOF)
    	{
    		fscanf(image,"%d",&d);
    		im_conv.pixels[h][l]=d;
    		h=(h+1)%128;
    		if (h==0) {l=(l+1)%128;}
    	}
    L'erreur vient probablement de la partie en rouge.
    fgetc() lit le caractère suivant depuis le flux stream et
    renvoie ce caractère, lu sous forme unsigned char, puis
    transformé en int, ou EOF en cas d'erreur ou de fin de
    fichier.

    getc() est équivalent à fgetc() sauf qu'il peut être
    implementé sous forme de macro, qui évalue l'argument
    stream plusieurs fois.
    En fait le premier caractère est lu par getc.

    a+

  4. #4
    Membre éclairé Avatar de Rniamo
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    508
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 508
    Par défaut
    j'ai essayé les deux mais ça ne change rien...je ne vois pas comment faire autrement. le fscanf ne suufit pas je pense et getc mé "mange un caractère"...
    et ça ne m'explique pas pourquoi mon tableau "rate" : j'ai regarder les indices h, le dernier est 2 et non 127!

  5. #5
    Membre éclairé Avatar de Rniamo
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    508
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 508
    Par défaut
    pour le reste de mes problèmes je pense que je me suis tromper au niveau de la lecture du ppm, j'ai 3*128*128 lignes donc pour mon images (128x128) 3 entiers par pixel. J e retest ce soir aprés conversion en P2 (je crois).

  6. #6
    Membre éclairé Avatar de je®ome
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Par défaut
    ou est le problème ??
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char c;
              while((c=getc(image)!=EOF){
              // c est le caractère lu à chaque tour de boucle
              }
    Maintenant, tout dépend de la structure de ton fichier.

  7. #7
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	while(getc(image)!= EOF)
    	{
    		fscanf(image,"%d",&d);
    Le test devrait porter sur la valeur de retour de fscanf qui doit retourner 1 (une conversion réussie) si la lecture a réussi et EOF sur la fin de fichier.
    Il serait interessant d'avoir des détails sur ImageTP et sur le code d'InitialiserImageTP. Cette partie du code est un peu étrange:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ImageTP im_conv=InitialiserImageTP(128,128);
    Apparemment, ImageTP est une structure, non créée dynamiquement, qui contient un champ pixels pour le tableau.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    im_conv.pixels[h][l]=d;
    Vraisemblablement InitialiserImageTP doit créer ce tableau dynamiquement (sous la forme d'un int**) par allocation d'un tableau de pointeurs sur des tableaux de int. Mais alors, qui détruit tout cela à la fin ?

  8. #8
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    absolument..

    d'autant plus que l'instruction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    	while(getc(image)!= EOF)
    	{
    		fscanf(image,"%d",&d);
    SAUTE un caractère sur N dans l'image... puisque getc avance d'un caractère et que fscanf avance aussi.....

    Le format .ppm n'est pas un caractère par valeur ??????

    Si oui, juste le fgetc devrait suffire :

    le mieux est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
      h=0;l=0;
     
     while ( (d = fgetc(image)) != EOF )
         {
             im_conv.pixels[h][l]=d;
             l = (l+1)%128 ;
             if ( l == 0 )
                h= h+1 ;
         }
    Sinon, remplacer le fgetc par le fcanf....

  9. #9
    Membre éclairé Avatar de Rniamo
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    508
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 508
    Par défaut
    en ce qui concerne ImageTP, voilà la source, celà n'est pas de moi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    typedef struct 
    {
    	int ** pixels;
    	int hauteur;
    	int largeur;
    } ImageTP;
     
    ImageTP InitialiserImageTP(int hauteur, int largeur) {
    	int h;
    	int ok;
    	ImageTP sortie;
    	sortie.hauteur = hauteur;
    	sortie.largeur = largeur;
    	sortie.pixels = (int **) malloc(hauteur * sizeof(*sortie.pixels));
    	ok = (sortie.pixels != 0);
    	for (h=0;h<hauteur && ok;h++) {
    		sortie.pixels[h]=(int*) malloc(largeur * sizeof(*sortie.pixels[h]));
    		ok = (sortie.pixels[h] != 0) && ok;
    		}
    	if (!ok) {
    		sortie.hauteur=0;
    		sortie.largeur=0;
    		}
    	return sortie;
    	}
    J'ai essayé le fgetc...j'obtiens des choses bizarres au niveau de mon image de sortie : j'ai un bout de l'image qui se ballade.

  10. #10
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    en ce qui concerne ImageTP, voilà la source, celà n'est pas de moi :
    Effectivement, InitialiserImageTP travaille comme je l'avais supposé lors d'un post précédent. A noter que cette fonction n'est pas très correcte puisqu'en cas d'échec d'une allocation, la mémoire déjà allouée n'est pas libérée (et d'ailleurs pixels devrait être mis à NULL dans ce cas).
    Par conséquent, il faut appeler une fonction qui libère toute cette mémoire allouée lorsqu'on n'a plus l'usage de l'ImageTP.

    fgetc ne convient pas : dans ce type de fichier, les données sont écrites en mode texte (pour P3) http://www.wotsit.org

  11. #11
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    bon j'ai retrouvé mon code ...

    Pour des ppm il y a 2 formats : brut (raw) et texte (ASCII), dépendamment du nombre de couleurs...

    8 bits (256 niveaux) : Raw (entête P6)
    plus que 8 bits : ASCII (entête P3).


    Le fichier contient :

    entête
    largeur hauteur
    nb couleurs

    Ensuite, si c'est ASCII :

    des triplets (R G B) se suivant (en entier (%d), séparés par un espace), avec au maximum 70 caractères par ligne

    Donc c'est un fgets qu'il faut utiliser.....


    Si c'est Raw :

    des triplets (RGB) se suivant (en char (%c), sans espaces entre), toujours avec au maximum 70 caractères par lignes.

    Donc la une boucle de fgetc

    Pour lire, changer de ligne dès que longueur lue > 65 caractères, ou que '\n' est atteint...

    Note : les triplets sont cohérents (impossible d'avoir un R G sur une ligne et B sur la suivante)..

  12. #12
    Membre éclairé Avatar de Rniamo
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    508
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 508
    Par défaut
    J'ai trouvé ...mais j'ai honte ...

    En fait je ne respectais pas la syntaxe du ppm dans mon fichier de sortie....donc forcément ça aide pas.

    Merci de votre aide, cela ma quand même aidé à mettr au clair certain points.

Discussions similaires

  1. Je vois pas mes erreurs
    Par étoile de mer dans le forum Débuter
    Réponses: 13
    Dernier message: 25/09/2008, 15h10
  2. Mes erreurs, prendre de bonnes habitudes
    Par Goodgame dans le forum Langage
    Réponses: 4
    Dernier message: 08/08/2008, 19h43
  3. customErrors sans trace de mes erreurs
    Par dudule dans le forum ASP.NET
    Réponses: 1
    Dernier message: 29/06/2007, 18h08
  4. Mes erreurs ne sont pas soulignées (D2005)
    Par Vincent BONNAL dans le forum Delphi
    Réponses: 3
    Dernier message: 20/03/2007, 14h22
  5. Réponses: 7
    Dernier message: 02/12/2005, 13h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo