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

Langages de programmation Discussion :

Lire le format d'images PPM : de la lecture binaire ou texte des fichiers


Sujet :

Langages de programmation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur
    Avatar de cladsam
    Profil pro
    Inscrit en
    Août 2003
    Messages
    1 787
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Août 2003
    Messages : 1 787
    Par défaut Lire le format d'images PPM : de la lecture binaire ou texte des fichiers
    Bonjour,

    mon soucis vient de la lecture des fichiers PPM que je dois faire en Ocaml. J'ai choisi ce forum car le problème rencontré est général, il n'a rien de propre à Ocaml dans le sens ou, si j'avais eu à le coder en C ou en Java je me serais posé les mêmes questions :
    tout d'abord j'essaie de trouver une spécification claire de ce format et ce n'est pas chose aisée. J'ai bien trouvé le fait que ca commence par un nombre magique P3 ou P6 suivi de la taille de l'image, des valeurs de couleur pour les 3 couleurs de chaque pixel et agrémenté de commentaires qui se greffent n'importe où.

    Mes interrogations sont :
    1) En claire, quelle est la différence entre P3 et P6 : certains sites disent que le P3 ne contient qu'une image par fichier, d'autre disent le contraire

    2) j'ai téléchargé 2/3 fichiers PPM mais quand je les ouvrent avec notepad, je vois seulement le "nombre magique" en clair, le reste est illisible donc j'en conclue que c'est en binaire, pourtant, dans certaines specs que je trouve, je lis que c'est en ASCII .. du coup je ne sais que penser

    3) Imaginons que ce soit en binaire, on ouvre donc le fichier en binaire et la, il faut aller lire les caractères. Ce sera soit des Char ( cas des commentaires) soit des espaces ( ou tab ou retour chariot) soit des nombres (des int).
    Or, les lectures en binaire demandent de préciser le type : read_int, read_char etc... on fait comment lorsque l'on ne sait pas a priori ce qu'on est amené à lire ?


    Bon ca peut paraitre naif j'en suis désolé mes les accès fichiers c'est pas mon grand truc ....

    merci de votre aide

  2. #2
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Je pense que tu peux aussi essayer de chercher avec le terme : PGM plutôt que PPM


    D'après, mes souvenirs,
    P2 = niveau de gris et couleur en clair.
    P3 = niveau de gris où les couleurs sont enregistrés directement en char
    P5 = RGB en clair
    P6 = RGB en brut

    Quand je dis brut, c'est qu'au lieu de lire :
    245 dans le fichier comme ça, tu vas lire l'octet qui vaut 245


    Or, les lectures en binaire demandent de préciser le type : read_int, read_char etc... on fait comment lorsque l'on ne sait pas a priori ce qu'on est amené à lire ?
    Un exemple de code bourrin (qui prend pas en compte les commentaires). Les premières données sont toujours en clair. Seul les pixels sont en brut ou en clair.

    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
    
      char header[10];
      int largeur;
      int hauteur;  
     filePGM.getline(header, 10);
       int type = header[1];
       filePGM >> largeur >> hauteur >> maxIntensity;
      
    if(type==2) {
       int tabEntier[..];
       ...
        for(int i=0;i<largeur * hauteur;i++)
          filePGM >> tabEntier[i]; //on lit simplement comme des entiers
    }
    else
    if(type==3)
    {
       char tabChar[..];
       ....
    
        for(int i=0;i<largeur * hauteur;i++)
          filePGM >> tabChar[i]; //on lit simplement comme des entiers
    }

  3. #3
    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
    je n'ai pas la lecture, mais l'écriture (en C) ... ça peut t'aider à comprendre le format.. ;-)

    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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    /****************************************************************
    
        Note:    dans le format PPM aucune ligne ne doit contenir plus
        -----    de 70 caracteres. Derive de la librairie ppm.
    
    
            Copyright : Environnement Canada & COGITECH Jean Souviron 1996
    	Auteur    : Jean Souviron (COGITECH Jean Souviron)
    	            Octobre 1996
    
    
    ** Copyright (C) 1989 by Jef Poskanzer.
    **
    ** Permission to use, copy, modify, and distribute this software and its
    ** documentation for any purpose and without fee is hereby granted, provided
    ** that the above copyright notice appear in all copies and that both that
    ** copyright notice and this permission notice appear in supporting
    ** documentation.  This software is provided "as is" without express or
    ** implied warranty.
    
    *****************************************************************
    */
    
    #include <stdlib.h>
    #include <stdio.h>
    
    
    /*
     *  P p m W r i t e
     *
     */
    int PpmWrite ( char *Image, int Dim_X, int Dim_Y,
    	        int *R, int *G, int *B, int NbCols,
    	        char *Filename )
    {
       FILE    *out=NULL ;
       int      i, maxval, limit, pos, pos1 ;
       Boolean  Raw = False ;
    
    
        if ( strcmp ( Filename, "stdout" ) == 0 )
            out = stdout ;
        else
            if ( strcmp ( Filename, "stderr" ) == 0 )
    	    out = stderr ;
    	else
    	    out = fopen(Filename, "wb");
    
        if ( out != NULL )
          {
    	 /* Checks the max level of color to decide whether we use raw format */
    	 maxval = -1 ;
    	 for ( i = 0 ; i < NbCols ; i++ )
    	   {
    	      if ( R[i] > maxval )
    		 maxval = R[i] ;
    	      if ( G[i] > maxval )
    		 maxval = G[i] ;
    	      if ( B[i] > maxval )
    		 maxval = B[i] ;
    	   }
    
    	 if ( maxval <= 255 )
    	   {
    	      Raw = True ;
    	      fprintf (out, "P6\n%d %d\n%d\n",Dim_X,Dim_Y,NbCols);
    	   }
    	 else
    	   {
    	      Raw = False ;
    	      fprintf (out, "P3\n%d %d\n%d\n",Dim_X,Dim_Y,NbCols);
    	   }
    
    	 /* Raw format : bytes with no space inbetween */
    	 if ( Raw )
    	   {
    	      limit = 0 ;
    	      for ( i = 0 ; i < (Dim_X*Dim_Y); i++ )
    	        {
    		   fprintf (out, "%c%c%c", R[(int)Image[i]],G[(int)Image[i]],B[(int)Image[i]]);
    		   limit = limit + 3 ;
    		   if ( limit >= 65 )
    		     {
    			fprintf (out, "\n");
    			limit = 0 ;
    		     }
    		}
    	   }
    	 else
    	   {
    	      /* ASCII format */
    	      limit = 0 ;
    	      pos = ftell(out);
    
    	      for ( i = 0 ; i < (Dim_X*Dim_Y); i++ )
    	        {
    		   fprintf (out, "%d %d %d", R[(int)Image[i]],G[(int)Image[i]],B[(int)Image[i]]);
    		   pos1 = ftell(out);
    		   limit = limit + pos1 - pos ;
    		   if ( limit >= 65 )
    		     {
    			fprintf (out, "\n");
    			limit = 0 ;
    			pos = ftell(out);
    		     }
    		   else
    		       pos = pos1 ;
    		}
    	   }
    
    	 if ( (out != stdout) && (out != stderr) )
    	    fclose(out);
          }
        else
            return ERROR ;
    
    
       return SUCCESS ;
    }

Discussions similaires

  1. Lire et afficher une image au format pgm
    Par didi_di dans le forum C++
    Réponses: 4
    Dernier message: 17/12/2009, 15h19
  2. Lire une image .ppm et inverser ses couleurs
    Par virtuadrack dans le forum C++
    Réponses: 7
    Dernier message: 30/01/2009, 11h55
  3. Lire et afficher une image (format TIFF)
    Par nuans dans le forum Interfaces Graphiques
    Réponses: 2
    Dernier message: 30/04/2007, 15h33
  4. Format d'image .RAW ?
    Par shifty.net dans le forum OpenGL
    Réponses: 3
    Dernier message: 10/06/2004, 15h06
  5. Format d'image et texture directx
    Par Johngame dans le forum DirectX
    Réponses: 1
    Dernier message: 04/02/2004, 21h39

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