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 :

Problème avec l'ouverture et la sauvegarde de fichiers PPM


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 188
    Par défaut Problème avec l'ouverture et la sauvegarde de fichiers PPM
    Bonjour en effet je veut juste ouvrir puis sauvegarder ( sans aucune perte sous le méme format PPM ) des image mais j'ai un soucis pour lequel je ne trouve pas de solution . l'ouverture s'arrete toujours au même endroit .

    exemple de fichier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    P3
    # CREATOR: The GIMP's PNM Filter Version 1.0
    300 225
    255
    65
    58
    56 ....
    l'ouverure se fait ainsi :

    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
    /*--recuperation de l'entete--*/
      fgets(temp1,100,fic);
      fgets(temps2,100,fic);
      fscanf(fic,"%d %d",&ta1,&ta2); // valeurs width , length
      fscanf(fic,"%d\n",&ta3); // MAX 
      /*--chargement dans la matrice--*/
      unsigned char varb,varv,varr;[/10]
      for(i=0;i<length;i++) for(j=0;j<width;j++)  
        { 
         fread(&varr,1,1,fic);
         fread(&varv,1,1,fic);
         fread(&varb,1,1,fic);
     
         matR[i][j]=varr;
         matV[i][j]=varv;
         matB[i][j]=varb;  
        }
    partie sauvegarde :

    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
     
      /*--sauvegarde de l'entete--*/
      fprintf(fic,"P3");
      fprintf(fic,"\n# IMG ");
      fprintf(fic,"%d %d",length,width);
      fprintf(fic,"\n255\n");
     
      /*--enregistrement--*/
      for(i=0;i<length;i++) 
      for(j=0;j<width;j++) 
        {
         fprintf(fic,"%c",(char)matR[i][j]);
         fprintf(fic,"%c",(char)matV[i][j]);
         fprintf(fic,"%c",(char)matB[i][j]);
     
        }
    Le resultat et que j'ai juste une partie de l'image qui s'affiche et en l'ouvrant avec GIMP j'ai un message : FIN DE FICHIER PREMATURE
    effectivement en comparant les deux fichier ( original et copie ) sur la copie 2 tiers voir plus d'informations manque .

    merci de m'aider si vous voyez des solutions .

  2. #2
    Membre éclairé Avatar de Bayard
    Inscrit en
    Juin 2002
    Messages
    863
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 863
    Par défaut
    Pourriez-vous:
    1. Donner le code complet (que l'on voit "du fopen et du fclose").
    2. Donner du code compilable Par exemple:
      unsigned char varb,varv,varr;[/10]
    3. faire un indentation notamment au niveau des boucles for en mettant bien les accolades allignées

  3. #3
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Par défaut
    Bonjour,

    étant donnée que tu utilises déjà fscanf, je te conseille de continuer à l'utiliser. Plutôt que de faire un mix entre fgets, fscanf et fread. Il me semble (à confirmer) que certains sont bufferisé et d'autres non. Donc un mix fera des erreurs.
    Ensuite tu mets les dimensions dans ta1, ta2, ta3 et ensuite tu utilises length et width.

    PS : je viens de regarder le format d'écriture du ppm et comme je m'en doutais, il fonctionne comme le pgm mais en écrivant les trois couleurs RGB. Donc tu ne dois pas écrire la valeur de la couleur (213 => '2' + '1' + '3') mais la caractère ASCII 213.
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 188
    Par défaut
    En effet j'ai remarquer que cela est surtout au niveau de la lecture et le stockage donc je vous donne toute la fonction qui fai ce travail ainsi vous pouvez peut etre maider la dessus .

    a noter que ta X et length width sont les méme c'est juste que je les ai mis dans define pour tester

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    void LoadPpm(char* name,float** matR,float** matV,float** matB,int length,int width)
     {
      int i,j;
      unsigned char varb,varv,varr;
      char buff[NBCHAR];
     
      char stringT1[NBCHAR],stringT2[NBCHAR];
     
      int ta1,ta2,ta3;
      FILE *fic;
     
      /*-----nom du fichier ppm-----*/
      strcpy(buff,name);
      strcat(buff,".ppm");
      printf("---> Ouverture de %s",buff);
     
      /*----ouverture du fichier----*/
      fic=fopen(buff,"rb");
      if (fic==NULL) 
       { printf("\n- Grave erreur a l'ouverture de %s  -\n",buff);
         exit(-1); }
     
      /*--recuperation de l'entete--*/
      fgets(stringTmp1,100,fic);
      fgets(stringTmp2,100,fic);
      fscanf(fic,"%d %d",&ta1,&ta2);
      fscanf(fic,"%d\n",&ta3);
     
      /*--affichage de l'entete--*/
      printf("\n\n--Entete--");
      printf("\n----------");
      printf("\n%s%s%d %d \n%d\n",stringTmp1,stringTmp2,ta1,ta2,ta3);
     
      /*--chargement dans la matrice--*/
      for(i=0;i<length;i++) for(j=0;j<width;j++)  
        { 
         fread(&varr,1,1,fic);
         fread(&varv,1,1,fic);
         fread(&varb,1,1,fic);
     
         matR[i][j]=varr;
         matV[i][j]=varv;
         matB[i][j]=varb;  
        }
     
       /*---fermeture du fichier---*/
      fclose(fic);
     }

    j'arrive a peine a stocker 1/3 du code du .PPM

    merci a vous

  5. #5
    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
    Il ne faut pas seulement dire merci, mais aussi lire les réponses !

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 188
    Par défaut
    j'aimerai bien mais justement un unsigned char ne change pas bcp par rapport a un unsigned int et donc c'est pas ca qui provoque un EOF prematuré sauf si je me trompe . autrement j'ai poster toute la fonction dans l'espoire que quelqu'un m'eclaissi la dessu .
    voila

  7. #7
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par ToTo13 Voir le message
    Bonjour,

    étant donnée que tu utilises déjà fscanf, je te conseille de continuer à l'utiliser. Plutôt que de faire un mix entre fgets, fscanf et fread. Il me semble (à confirmer) que certains sont bufferisé et d'autres non. Donc un mix fera des erreurs.
    Bufferisé ou non, ça dépend surtout du flux et non de la fonction. Lorsqu'il s'agit de lire un fichier, fgets(), fscanf() et fread() utilisent toutes trois un mécanisme de tampon.

    A part ça, je ne vois pas pourquoi il ne faut pas mélanger fgets() et fscanf(). J'aurais d'ailleurs plutôt tendance à ne pas utiliser fscanf() au profit d'une lecture à l'aide de fgets()+strtol/strtoul/strtod. S'il s'agit d'un fichier binaire, fread() est à mon avis la fonction à privilégier.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 188
    Par défaut
    Bonjour ,
    merci de votre reponse mais la j'ai un autre soucis en effet j'ai jamais fait du traitement d'image ( c'est plutot de la programmation parallele ce que j'essaie de faire UPC )

    la ma question est sur l'application du filtre sachant que j'ai entourer l'image pas un pixel 0

    00000
    0xxx0
    0xxx0
    00000

    puis j'essaie d'appliquer le filtre

    0-10
    -15-1
    0-10
    alors je procede comme suite :

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    void appliquerFiltre(char* name)
    {
    MatriceImgROut=fmatrix_allocate_2d(length,width);
    MatriceImgVOut=fmatrix_allocate_2d(length,width);
    MatriceImgBOut=fmatrix_allocate_2d(length,width);
    coefficients=fmatrix_allocate_2d(3,3);
     
     
     
    int h , w , i , j ;
     
     
    // matrice de trasformation
    coefficients = 0 ;
    coefficients = -1;
    coefficients = 0 ;
    coefficients = -1;
    coefficients = 5;
    coefficients = -1 ;
    coefficients = 0 ;
    coefficients = -1 ;
    coefficients = 0 ;
     
    for (h = 0 ; h < length ; h++)
    for (w = 0 ; w < width ; w++)
    {
     
    /*
    MatriceImgROut[h][w] = 0 ;
    MatriceImgVOut[h][w] = 0 ;
    MatriceImgBOut[h][w] = 0 ;*/
     
    for (i = 0 ; i < 3 ; i++)
    for (j = 0 ; j < 3 ; j++)
    {
    MatriceImgROut[h][w] += coefficients[j] * MatriceImgR[h+i][w+j] ;
    MatriceImgVOut[h][w] += coefficients[j] * MatriceImgV[h+i][w+j] ;
    MatriceImgBOut[h][w] += coefficients[j] * MatriceImgB[h+i][w+j] ;
    }
     
    if(MatriceImgROut[h][w]<0)
    MatriceImgROut[h][w]=0;
    else
    if(MatriceImgROut[h][w]>255)
    MatriceImgROut[h][w]=255;
     
    if(MatriceImgVOut[h][w]<0)
    MatriceImgVOut[h][w]=0;
    else
    if(MatriceImgVOut[h][w]>255)
    MatriceImgVOut[h][w]=255;
     
    if(MatriceImgBOut[h][w]<0)
    MatriceImgBOut[h][w]=0;
    else
    if(MatriceImgBOut[h][w]>255)
    MatriceImgBOut[h][w]=255;
     
    }
    puis j'affiche la nouvelle image est la j'ai un resultat different de ce que j'attend
    sachant que si j'ouvre et je sauvegarde sans modification l'image reste la méme donc c'est plutot au moment de l'application du filtre que j'ai un probleme

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Lazarus] [Linux Mint] Problème d'ouverture et de sauvegarde de fichiers
    Par ThWilliam dans le forum Lazarus
    Réponses: 3
    Dernier message: 29/06/2014, 09h12
  2. Problème avec l'ouverture d'un dossier
    Par Hamza dans le forum Windows XP
    Réponses: 1
    Dernier message: 14/02/2010, 20h43
  3. problème avec l'ouverture de fichier /usr/include/stdio.h
    Par Hisoka_Hunter dans le forum Linux
    Réponses: 1
    Dernier message: 11/12/2008, 09h28
  4. Problème avec l'ouverture de fichiers texte
    Par mithrendil dans le forum C#
    Réponses: 3
    Dernier message: 16/07/2007, 08h00
  5. [VBA-E][debutant] Problème avec l'ouverture de fichiers .INI
    Par Masmeta dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 20/03/2007, 08h36

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