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 :

S.O.S Imagerie ! Matrice d'une image en C


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Avril 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 6
    Points : 1
    Points
    1
    Par défaut S.O.S Imagerie ! Matrice d'une image en C

    Bonjour (ou Bonsoir à tous )

    Voila , je suis nouvelle dans le forum , et sur le point d'arracher mes cheveux !

    Je débute en traitement d'images , et j'utilise le langace C ( sous Dev) ,
    je veux extraire la matrice d'une image , pour avoir l'image luminance ,et appliquer un seuillage par la suite ...

    Mais impossible d'acceder à ces étapes , puisque je bloque sur l'extraction de la fameuse matrice

    j'ai établi un code , mais il ne fonctionne pas correctement .

    toute aide , correction , proposition , sont les bienvenues !

    voici le code en question :

    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
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>  // Pour la fonction strcat
     
    #define DEBUG        // Pour eviter les Bugs
     
    typedef unsigned char uc;   //pour faciliter la saisie
    typedef unsigned int ui; 
    typedef unsigned short us;
    // Declaration de la structure de l'en tête du fichier
    typedef struct {
            char sign[2];  // Signature BMP 
            ui total_size; // taille totale du fichier (sur 4 Octets)
         //???   int champ_res;
            int offset;
    // Declaration de la structure de l'en tête de l'image
     
          ui  taille; //taille en tête image
          ui  largeur; //largeur (width)
          ui  hauteur; //hauteur (height)
          us  nbr_plans; // toujours egal à 1
          int codage;  // sur 1,4,8,16,24, ou 32 bits
          us  compression;  // = O si pas de compression , et 1 2 ou 3 selon types
          int  taille_tot; //taille totale de l'image en octets
          ui  resolution_h;  //la resolution horizontale (nbre pixels)
          ui  resolution_v;  // la resolution verticale
          ui  nbre_coul;  // nombre de couleurs 
          unsigned char* pixel;   
            }bitmap;
    ////////////////////////////////////////////////////////
            //prototypes des fcts
    bitmap* lecture(char*) ;
    int conv (uc hex[4],ui) ;
     
    //??int vect[10304]; 
    int main(int argc, char *argv[])
    {   
        //declaration des variables utiles dans notre programme
        int h,l,i=0,j=0,k,nbl,nbc; 
        char nom[100],et[54];  unsigned char A[320],R[240][320],x,V[240][320],B[240][320],x1,x2; 
        bitmap *b;   // recupération des infos de l'image
     
        FILE* fp;
     
        // Recup du nom de l'image
        printf("Entrez le nom de l'image \n"); 
        gets(nom);  
        strcat(nom,".bmp");  
        printf("Nom de l'image avec l'extension : %s\n",nom); 
        // ouverture du fichier
        b=lecture(nom); 
        fp=fopen(nom,"r"); 
         //si l'image n'existe pas on affiche un message d'erreur
          if (fp==NULL){ 
           printf("Ouverture impossible de %s\n  ( - Erreur : Image introuvable )  \n",nom); 
           scanf("%*c"); 
           exit(0); 
                    }
         //sinon on récupèr les infos   
     
         //
     
         printf("La signature BMP de l'image :%.2s\n",b->sign);
         printf("Taille du Fichier : %d \n ",b->total_size);
         printf("Offset de l'image : %d \n",b->offset);
         printf("Taille en tete de l'image : %d\n",b->taille);
         printf("Largeur (nombre de colonnes : %d \n",b->largeur);
         printf("Hauteur (nombre de lignes :%d \n",b->hauteur);
         printf("Nombre de plans : %d\n",b->nbr_plans);
         printf("Codage : %d\n",b->codage);
         printf("Compression : %d\n",b->compression);
         printf("Taille totale de l'image : %d\n",b->taille_tot);
         printf("Resolution Horizontale :%d\n",b->resolution_h);
         printf("Resolution Verticale : %d\n",b->resolution_v);
         printf("Nombre de couleurs :%d\n",b->nbre_coul);
     
        h=b->hauteur;
        l=b->largeur;
        printf("Lignes : %d Colonnes : %d\n",h,l);
        fclose(fp);
     
        fp=fopen(nom,"rb");
        fread(et,sizeof(char),54,fp);
        // Matrice 
        nbc=l/2;nbl=nbl/2;
        printf("La matrice a ete divisee en deux : \nNombre lignes :%d Nombre colonnes:%d\n",h,nbc);
     
         for(j=0;j<20;j++) { 
         for (i=0;i<nbc;i++)
          {  R[j][i]=0;}}
     
        for(j=0;j<20;j++) { 
         for (i=0;i<nbc;i++)
          {
          R[j][i]=*(b->pixel)++;
          printf("%d ",R[j][i]);
     
                               }printf("\n fin de la ligne %d\n",j);}
     
     
     
     
     
     
     
     
         fclose(fp);
         printf("%d",x1);
     
        /* fp=fopen("rouge.ima","wb");
             for (i=0;i<h;i++)
          {
               for(j=0;j<l;j++)
           A[j]=R[i][j];
           fwrite(A,sizeof(unsigned char),l,fp);
           printf("%d ",A[j]);
          }
            fclose(fp);*/
     
     
     
     
     
     
     
     
     
        ////// Affichage de la matrice /////////////////////:
    //////: Avec sdl ////////           
    // for(i = 0 ; i < monImage.w * monImage.h ; i+=3)
    //{
      //  imageRGB[i]; // Red
       // imageRGB[i+1]; // Green
        //imageRGB[i+2]; // Blue
    //} 
     
    #ifdef DEBUG 
    printf("fin du programme"); 
    scanf("%*c"); 
    #endif    
     
     system("PAUSE");
     
     
    }
     
     
        ////////////////////////////////////////////// FONCTIONS //////////////////////////////////////////////////////////////
      bitmap* lecture(char* nom)
    {
        uc temp[4];    // chaine de carac temporaire qui sera utilisé pour récupérer les différentes infos     
        bitmap *bmp;        // La variable que renvoie bitmap()
        FILE *fichier;        
        bmp=(bitmap*)malloc(sizeof(bitmap)); // on alloue dynamiquement le pointeur sur bitmap
        fichier = fopen(nom,"r");     // on ouvre le fichier en lecture seule
        fread (bmp->sign,2,1,fichier);    // on récupère la signature
     
        fread (&temp,4,1,fichier);    //  la taille de l'image    
        bmp->taille_tot = conv(temp,4);   // que l'on converti en décimal 
     
        //fread (&temp,4,1,fichier); 	// la zone réservée
        //bmp->champ_res=conv(temp,4);
     
        fread (&temp,4,1,fichier);    // l'offset    
        bmp->offset = conv(temp,4);    // que l'on converti aussi 
     
        fread (&temp,4,1,fichier);    // taille de la zone info    
        bmp->taille= conv (temp,4);
     
        fread (&temp,4,1,fichier);    // la largeur de l'image    
        bmp->largeur = conv(temp,4);
     
        fread (&temp,4,1,fichier);    // la hauteur de l'image    
        bmp->hauteur = conv(temp,4);
     
        fread (&temp,2,1,fichier);    // le nombre de plans (=1)   
        bmp->nbr_plans = conv (temp,2);  
     
        fread (&temp,2,1,fichier);    // le mode d'affichage    
        bmp->codage = conv (temp,2);  
     
        fread (&temp,4,1,fichier);    // le format de compression    
        bmp->compression = conv (temp,4);  
     
        fread (&temp,4,1,fichier);    // la taille de l'image    
        bmp->total_size= conv (temp,4);
     
        fread (&temp,4,1,fichier);    // les résolutions horizontale
        bmp->resolution_h = conv (temp,4);    // et verticale
     
        fread (&temp,4,1,fichier);        
        bmp->resolution_v = conv (temp,4);
     
        fread (&temp,4,1,fichier);        
        bmp->nbre_coul = conv (temp,4);    // nbre de couleurs utilisées
     
        fclose (fichier);        // on ferme le fichier
     
        bmp->pixel=(unsigned char*)malloc(sizeof(bmp->taille_tot));
        fread(bmp->pixel,1,bmp->taille,fichier);
        return bmp;        // on retourne le pointeur sur la structure bitmap
    }
     
     
     
    int conv(unsigned char hex[4],unsigned int nb)
    {
        int res=0,i;
        for (i=nb-1;i>=0;i--)res=res*256+hex[i];
        return res;
    }
    MERCI !

    Ow .

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut
    Bonjour et bienvenu,

    S'il vous plait, gardez vos cheveux .

    Par contre, vous n'indiquez pas l'erreur que vous avez ( et assez peu ce que vous faites ). J'ai remarqué que vous essayez de lire un fichier .bmp.
    Le code compile t'il? Quel est l'erreur précisément, que voudriez vous qu'il fasse?

    ( Ah, et, il est génial ce code , peut être que je devrais le mettre dans tout mes programmes )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #define DEBUG        // Pour eviter les Bugs
    ( Pardon )

    Par contre, je remarque que vous essayez de lire une image en utilisant des tableaux de taille fixes. Le problème, c'est que si un jour, vous voulez lire un autre fichier image ( plus grand ) vos tableaux ne seront pas assez grand.
    Pour éviter ce problèmes, il faut utiliser les tableaux dynamiques qui sont allouer avec 'malloc' et désallouer avec 'free'.

    Il y a au moins une fuite de mémoire ( à cause de bitmap et de la fonction de lecture() ).

    Il y a aussi un comportement étrange, vous ouvrez deux fois le fichier ( deux fopen ). Je vous conseille de ne l'ouvrir qu'une fois, et de ( si besoin est ) passer le pointeur sur FILE lorsque vous devez faire quelque chose sur le fichier.
    De plus, cela vous permettra de lire le fichier sans avoir de problème du genre déplacer la position de la lecture à la matrice de l'image. ( D'ailleurs qui peut se faire avec fseek() à la place de fread ).
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Avril 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Merci d'avoir pris la peine de jeter un coup d'oeuil ! et de répondre !

    Pour ce qui est du "ce que je veux faire" , c'est récpérer la matrice d'une image .

    Le code se compile , et fonctionne correctement , mais les valeurs de la matrice qui s'affichent ne correspondent pas du tout à celles que j'ai testé avec Matlab .

    Et ça me bloque , puisque je ne peux pas avancer dans mon travail .

    Donc le problème est : récupérer la matrice de l'image qui est donnée pas l'utilisateur (l'en tête a été récupéré correctement) .

    VOili vOilou! ps : il ne me reste pas beaucoup de cheveux !

  4. #4
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    N'y a t-il pas une anomalie ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        bmp->pixel=(unsigned char*)malloc(sizeof(bmp->taille_tot));
        fread(bmp->pixel,1,bmp->taille,fichier);
    A vue de nez, je m'attendrais plutôt à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        bmp->pixel=malloc(bmp->taille_tot);
        fread(bmp->pixel,1,bmp->taille_tot,fichier);
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  5. #5
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut
    Si cela semble une bonne anomalie. ( Et dire que l'on nous as dit que le code marche, a croire que certains sont chanceux avec la memoire du PC ).

    Sinon, pour le probleme de l'image mal lu, j'ai pense que cela pouvait aussi venir du fait que les images au format BMP sont inverse sur la hauteur. ( http://fr.wikipedia.org/wiki/Windows...s_de_l.27image )
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 16
    Points : 19
    Points
    19
    Par défaut
    Bonjour,

    Aller on se retrousse les manches, il y a du pain sur la planche. Je vais pas m'arracher les cheveux, de mon côté y'en reste plus beaucoup malgré mon jeune (enfin c'est relatif :p) âge. Par contre tentons de préserver les tiens .

    Si j'ai bien compris, le but de ce programme est de récupérer la matrice de pixels de l'image bitmap que l'utilisateur lui donne en entrée.

    A la vue du programme il y a plein de corrections à lui apporter et nous allons y aller étape par étape .

    Tout d'abord, allons jeter un coup d'oeil à la description du format bmp. Je vois d'après le programme que tu (j'ai du mal à vouvoyer sur un forum, mais si ca dérange je change en vous) connais déjà plus ou moins ce format.

    Nous nous concentrerons sur les en-têtes (fichier et image) pour le moment, car malgré ce que tu dis, il y a quelques erreurs dans ton programme concernant la récupération de ces en-têtes. Et même si ce n'est pas ton but premier, toutes les données (ou presque) contenues dans ces en-têtes te seront indispensables par la suite pour récupérer la matrice de pixels dont tu as tant besoin. Par conséquent, autant faire que celles-ci soient jutes .

    Enfin avant d'entrer dans le vif du sujet et pour s'assurer que tout est bien compris, un peu de terminologie :
    - La matrice des pixels d'une image est appelée Raster.
    - Un raster peu être rempli de différentes façons comme par exemple : pixel par pixel, couleur par couleur, etc... Le fichier bitmap est rempli pixel par pixel (enfin c'est un peu plus compliqué mais ça sera pour la seconde partie du programme), la liste des valeurs est ordonné de la façon suivante :
    B(p1) V(p1) R(p1) B(p2) V(p2) R(p2) ... B(pn) V(pn) R(pn) avec
    R(pi) : Valeur de la composante Rouge pour le pixel i
    V(pi) : Valeur de la composante Verte pour le pixel i
    B(pi) : Valeur de la composante Bleue pour le pixel i
    n : nombre total de pixels de l'image.
    Le premier pixel est celui en bas à gauche de l'image.
    L'ordre de stockage des pixels est : ligne à ligne en remontant vers le haut de l'image, tout en ayant un nombre d'octets par ligne qui est un multiple de 4 (ca va nous compliquer la vie ça).
    Pour chaque pixel on voit bien que l'ordre est BVR (bien qu'on parle souvent de RVB, il faut faire attention avec le format bitmap, l'ordre est inversé).

    Ensuite parlons un peu de la récupération des données d'un fichier en C. En parcourant ton code, les autres posteurs et moi-même avons remarqué que tu ouvrais plusieurs fois ton fichier pour "apparemment" récupérer des valeurs dans celui-ci à chaque fois que tu en as besoin. Sache qu'il n'y a besoin d'ouvrir et de ne récupérer tes données qu'une seule et unique fois . Une fois que tu les as mises dans la structure bitmap, ces données y restent une bonne fois pour toute. Ce n'est plus la peine de rouvrir ton fichier par la suite .

    Ensuite, commençons par le début du programme, c'est à dire la déclaration de ta structure bitmap :
    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
    typedef struct {
            char sign[2];  // Signature BMP 
            ui total_size; // taille totale du fichier (sur 4 Octets)
         //???   int champ_res;
            int offset;
    // Declaration de la structure de l'en tête de l'image
     
          ui  taille; //taille en tête image
          ui  largeur; //largeur (width)
          ui  hauteur; //hauteur (height)
          us  nbr_plans; // toujours egal à 1
          int codage;  // sur 1,4,8,16,24, ou 32 bits
          us  compression;  // = O si pas de compression , et 1 2 ou 3 selon types
          int  taille_tot; //taille totale de l'image en octets
          ui  resolution_h;  //la resolution horizontale (nbre pixels)
          ui  resolution_v;  // la resolution verticale
          ui  nbre_coul;  // nombre de couleurs 
          unsigned char* pixel;   
            }bitmap;
    Trois petites choses à dire :
    La première concerne le nommage de tes champs, surtout des champs de taille, je dois t'avouer que je me suis un peu emmêlé les pinceaux (mais bon, c'est pas grave, je peins très mal ) au début.
    Je te propose, si tu es d'accord bien entendu (cela reste ton programme), de renommer ceux-ci pour ne pas se perdre. Comme tu as très bien commenter ton code ça ira tout seul, voici mes propositions :
    - Renommer le champ "total_size" (// taille totale du fichier) en "taille_fichier".
    - Renommer le champ "taille" (//taille en tête image) en "taille_entete".
    - Renommer le champ "taille_tot" (//taille totale de l'image) en "taille_image".

    La seconde concerne le champs de la zone réservée. Même s'il est écrit que cette zone est réservée, nous allons la récupérer, mais sans nous occuper de sa valeur. Nous allons donc l'ajouter à la structure entre "taille_fichier" et "offset". Je te propose de la nommer tout simplement "reserve". Le format bmp indique qu'elle est codée sur 4 octets, elle sera donc de type "ui".

    Enfin le dernier point concerne le typage de tes champs . Je te conseille de rester cohérente dans le choix de ce typage, nous voyons des "ui" et des "us" au milieu de "int", utilise donc toujours des "unsigned" si tu as commencé avec des "unsigned" (hormis le champs "sign" pour lequel il a été judicieux de le déclarer en temps que char[2] ). Dernière petite chose concernant le typage, si l'on se réfère à la description du format bmp, "nbr_plans" et "codage" occupent 2 octets (type "us") et compression en utilise 4 (type "ui").

    Je te laisse apporter ces corrections et me poster ta structure pour la suite .

    Nous voici donc avec une structure de départ correctement déclarée, nous allons donc pouvoir attaquer les choses sérieuses .

    Première correction, et non des moindres , nous allons enlever tout ce qui concerne les fichiers dans tout le code excepté dans la fonction "lecture()" qui reste telle quelle (du moins pour le moment). Comme je te l'ai écris plus haut, un seul parcours du fichier nous est utile et nous ferons ce parcours dans la fonction dédiée à cela qui est la fonction "lecture()". Tu peux donc enlever tous les "fopen()", les "fclose()", les "fread()" ainsi que les déclaration de "FILE" qui se font en dehors de la fonction "lecture()". Ne touche cependant pas à toute la partie de saisie et de construction du nom de ton fichier "nom".

    Ensuite, vu que dans cette correction nous ne gérerons pas tout de suite le raster, tu pourras commenter tout ce qui concerne l'affichage et la gestion de celui-ci dans la fonction "main()". Nous y reviendrons plus tard .

    Et maintenant occupons nous de la fonction "lecture()".
    - La première chose à faire est de rajouter le contrôle sur l'ouverture du fichier comme tu l'avais fais lorsque tu ouvrais encore le fichier dans ton main.

    Pour rappel, voici le code que tu avais et que je te laisse adapter à ta fonction lecture :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        fp=fopen(nom,"r"); 
         //si l'image n'existe pas on affiche un message d'erreur
          if (fp==NULL){ 
           printf("Ouverture impossible de %s\n  ( - Erreur : Image introuvable )  \n",nom); 
           scanf("%*c"); 
           exit(0);
          }
    - La deuxième correction à apporter concerne la récupération du raster. Dans ta fonction "lecture()", cette récupération du raster se produit après ton "fclose()" donc : DANGER . Tu essaies de lire dans un fichier que tu viens de fermer, aller hop, on déplace ce vilain "malloc()" et ce vilain "fread()" avant le "fclose()". Et on commente tout ça car nous ne nous occupons pas encore du raster . Mais comme l'a fait remarqué Diogène, la taille utilisée pour le malloc et la taille utilisée pour la récupération de pixels sont différentes et cela causera des problèmes par la suite. Au passage je te conseille aussi de faire un "free()" sur le raster à la fin de ton main, car tu as alloué de la mémoire sans la libérer. Un bon réflexe à prendre à chaque fois que l'on fait un "malloc()" est de se poser la question : "Où vais-je libérer la mémoire que je viens d'allouer ?" et d'effectuer cette libération mémoire au bon endroit. Dans ton cas, comme tu vas utiliser ton raster tout au long de ton programme, le "free()" se fera à la fin de celui-ci, c'est à dire à la fin du "main()". La aussi écris le, puis commente le comme tu as commenté le "malloc()" dans ta fonction "lecture()"

    - Enfin dernière correction et qui va te rendre triste , nous allons devoir supprimer ta fonction de conversion.
    J'espère que le deuil ne sera pas trop dur .
    Je m'explique plus clairement (en fait c'est pas évident d'être clair quand même ).
    Lorsque l'on récupère des octets, ces octets sont stockés dans des variables (prenons le cas d'un "unsigned char" codé sur un octet soit 8 bits). Ce "char" est stocké en binaire, soit par exemple pour la valeur "7" : "00000111". Cette valeur reste la même quelle que soit la façon dont on l'exprime. Donc même si l'on s'exprime en hexadécimal, en binaire ou en quelle que base que ce soit, la valeur de la variable reste la même . Une conversion serait utile uniquement dans le cas où la valeur en hexadécimal aurait été stockée en tant que chaîne de caractère dans un fichier texte (je ne sais pas si je suis clair , si quelqu'un est plus doué que moi en explication, je lui laisse volontiers la patate chaude). Dans le cas d'un fichier bitmap il s'agit d'un fichier de données, aucune conversion n'est donc nécessaire . Tu peux donc enlever tous tes appels à "conv()" et les supprimer. De fait tu n'auras plus besoin non plus de ta variable "temp".
    Aller un petit exemple pour la route :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        fread (&temp,4,1,fichier);        
        bmp->nbre_coul = conv (temp,4);    // nbre de couleurs utilisées
    deviendra

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        fread (&(bmp->nbre_coul),4,1,fichier);
    Une dernière correction et ce gros pavé sera fini, pour certains champs de ton en-tête, le nombre d'octets passés dans "fread()" n'est pas bon . Je te laisse regarder le format bitmap et effectuer les corrections nécessaires.
    Ah oui et j'oubliais, il faudra aussi rajouter la lecture de la zone réservée car le fait que tu ne la lises pas, tu crées un décalage lors du parcours de ton fichier, il faut donc la lire pour que lors de ton parcours, tu restes en phase avec le reste des données du fichier que tu veux lire (ça aussi je ne sais pas si c'est très clair ).

    Voili voilou, tout est dit (enfin j'espère ) pour le moment pour la lecture de l'en-tête du fichier. Je vais te laisser apporter les corrections nécessaires et poster à nouveau ton programme pour que nous contrôlions tout ça .

    Pour la suite de ton programme je serais un peu moins directif dans ton code, cela reste ton programme et tu dois l'implémenter par toi même (avec ce post, nous avons juste créé une base solide pour commencer le travail que tu veux réaliser). Je n'hésiterais pas (et les autres participants du forum non plus) cependant à pointer tes erreurs (si on les trouve :p), t'aider à les corriger ainsi qu'à te donner les informations dont tu as besoin pour avancer.

    De mon côté, je vais te poser des question qui seront importante pour la suite. Sais-tu si le format des bitmaps d'entrée sera toujours le même (ou si tu l'imposeras) ? Si oui, quel sera le format utilisé ? (24 bits ??? c'est le plus courant)

    La réponse à cette question déterminera si le programme sera compliqué ou non .

    Et si tu le souhaites, tu peux commencer à récupérer ton raster avec toutes ces corrections et voir ce que cela donne, nous te donnerons des indications avec le début de ton travail . Je te conseille cependant déjà d'apporter les corrections proposées et d'expliquer ta méthode de récupération pour la suite sans la mettre en oeuvre directement .

    Bon courage pour la suite .

  7. #7
    Membre averti
    Avatar de exe2bin
    Profil pro
    Passionné de programmation
    Inscrit en
    Mars 2009
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Passionné de programmation

    Informations forums :
    Inscription : Mars 2009
    Messages : 537
    Points : 387
    Points
    387
    Billets dans le blog
    3
    Par défaut
    ça vaut au minimum 2 clics sur le bouton "résolu" !!!!

  8. #8
    Nouveau Candidat au Club
    Inscrit en
    Avril 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Merci Mille FOIS fenrir !!! je suis ... bouche bée !

    Je cours vite modifier mon programme !

    Merci d'avoir pris la peine de lire , de comprendre , de résoudre , de conseiller ...

    J'apporterai les modifications necessaires ,et je vous ferai parvenir tout ça !

    (je ne trouve pas quoi dire ! c'est trop gentil ! )

    Merciiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii

  9. #9
    Nouveau Candidat au Club
    Inscrit en
    Avril 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Me revoila ! avec tous mes ch'veux !

    J'ai appliqué avec soin toutes les suggestions de fenrir !

    Mon code m'a fait des confessions ...(oui oui ! mon code parle ! ) , il m'a affiché tout l'en tête (correct) ... et m'a même dit qu'il se sentait plus leger !

    Mon code est gourmand !(non mon code n'est pas George )

    Voila , comment dois-je faire pour afficher mon Raster alors ???

    Merci ! et pardon d'être trop gourmande !

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 16
    Points : 19
    Points
    19
    Par défaut
    Re-bonsoir.

    Alors avançons mais comme il faut, pas de solution donnée toute faite, cela reste ton programme et donc tu devras trouver par toi même , mais on va te guider.

    Premièrement, peux-tu, s'il te plaît, juste poster ton code allégé pour voir à quoi il ressemble et faire les dernières vérifications d'usage ?

    Deuxièmement, encore une question . Ton Bitmap est-il forcément un 24 bits (format par défaut en général, mais bon on sait jamais) ? Si tu ne le sais pas, que t'annonce l'en-tête pour la partie "codage" ? Nous garderons cette valeur en référence pour simplifier le programme (si c'est bien du 24 bits).

    Troisièmement, je vois que tu veux récupérer la luminance de l'image,connais-tu la formule pour avoir cette valeur à partir de la valeur des composantes rouges, vertes et bleues ? Si tu ne la connais pas google devrais te la fournir , sinon va falloir que je me creuse les méninges pour me souvenir de ces cours vieux de 5 ans (je sais même plus où sont mes cours de master ) ou que je googlelise à mon tour .

    Quatrièmement (on risque d'aller loin comme ça ), je vois dans ton programme initial que tu avais créé trois tableaux "R[][]", "V[][]" et "B[][]", me confirmes-tu qu'il s'agit des tableaux qui contiendront les valeurs des pixels ? Si oui, je peux déjà te conseiller pour commencer ton programme, de créer une structure pixel qui contiendra ces trois champs et de faire un tableau de pixels , cela te permettra de ne manipuler qu'un seul tableau qui sera un tableau de "pixel" et donc un raster .

    Cinquièmement, comme je ne ferais pas le programme à ta place mais te guiderais et te corrigerais, au regard du format BMP (revoir la doc et ma première réponse avec les Bpi, Vpi et Rpi), comment récupèrerais-tu ton raster ? Si ton bitmap est 24 bit, chaque "char" que tu lis correspond à un Xpi, ce qui explique en quoi le format 24 bits est simple à lire (sinon ça peut s'arrêter sur des demi-"char" et là c'est un peu plus technique ). Tu peux m'écrire ta réponse en français, en algorithme ou alors me sortir un premier bout de code . Comme tout programme, le meilleur amis du programmeur reste le papier et le crayon pour commencer, de manière a visualiser et mettre en forme son raisonnement, ensuite produire un algo et enfin coder son algo .

    Voilà à toi les studios !!! Mets nous en scène tout ça et réponds au questions du quizz , elles ont leur importance. Bon courage !!!

  11. #11
    Nouveau Candidat au Club
    Inscrit en
    Avril 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Bonjour Bonjour !

    Tout d'abord voici mon code avec les modifications apportées grance à ton aide :
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>  // Pour la fonction strcat
     
    #define DEBUG        // Pour eviter les Bugs
     
    typedef unsigned char uc;   //pour faciliter la saisie
    typedef unsigned int ui; 
    typedef unsigned short us;
    // Declaration de la structure de l'en tête du fichier
    typedef struct {
            char sign[2];  // Signature BMP
            int offset; 
            ui taille_fichier; // taille totale du fichier (sur 4 Octets)
            ui reserve;  // codée sur 4 octets
     
    // Declaration de la structure de l'en tête de l'image
     
          ui  taille_entete; //taille en tête image
          ui  largeur; //largeur (width)
          ui  hauteur; //hauteur (height)
          ui  compression;  // = O si pas de compression , et 1 2 ou 3 selon types
          ui  resolution_h;  //la resolution horizontale (nbre pixels)
          ui  resolution_v;  // la resolution verticale
          ui  nbre_coul;  // nombre de couleurs 
          us  nbr_plans; // toujours egal à 1
          us codage;  // sur 1,4,8,16,24, ou 32 bits
          uc * pixel; 
          int  taille_image; //taille totale de l'image en octet 
     
         }bitmap;
    ////////////////////////////////////////////////////////
            //prototypes des fcts
    bitmap* lecture(char*) ;
    int conv (uc hex[4],ui) ;
    int main(int argc, char *argv[])
    {   
        //declaration des variables utiles dans notre programme
        int h,l,i=0,j=0,k,nbl,nbc; 
        char nom[100];  
        unsigned char A[320],R[240][320],x,V[240][320],B[240][320],x1,x2; 
        bitmap *b;   // recupération des infos de l'image
     
     
        // Recup du nom de l'image
        printf("Entrez le nom de l'image \n"); 
        gets(nom);
     
        strcat(nom,".bmp");  
          b=lecture(nom); 
        printf("Nom de l'image avec l'extension : %s\n",nom); 
        // ouverture du fichier
     
     
        //sinon on récupèr les infos        
         printf("La signature BMP de l'image :%.2s\n",b->sign);
         printf("Taille du Fichier : %d\n ",b->taille_fichier);
         printf("Taille de la zone reservee :%d\n",b->reserve);
         printf("Offset de l'image : %d \n",b->offset);
         printf("Taille en tete de l'image : %d\n",b->taille_entete);
         printf("Largeur (nombre de colonnes) : %d \n",b->largeur);
         printf("Hauteur (nombre de lignes) :%d \n",b->hauteur);
         printf("Resolution Horizontale :%d\n",b->resolution_h);
         printf("Resolution Verticale : %d\n",b->resolution_v);
         printf("Nombre de couleurs :%d\n",b->nbre_coul);
         printf("Compression : %d\n",b->compression);
         printf("Nombre de plans : %d\n",b->nbr_plans);
         printf("Codage : %d\n",b->codage);
         printf("Taille totale de l'image : %d\n",b->taille_image);
     
    #ifdef DEBUG 
    printf("fin du programme"); 
    scanf("%*c"); 
    #endif    
     
    system("PAUSE");
    }
     
     
    ////////////////////////////////////////////// FONCTIONS //////////////////////////////////////////////////////////////
      bitmap* lecture(char* nom)
    {      
        bitmap *bmp;        // La variable que renvoie bitmap()
        FILE *fichier;        
        bmp=(bitmap*)malloc(sizeof(bitmap)); // on alloue dynamiquement le pointeur sur bitmap
        fichier=fopen(nom,"r"); 
         //si l'image n'existe pas on affiche un message d'erreur
          if (fichier==NULL){ 
           printf("Ouverture impossible de %s\n  ( - Erreur : Image introuvable )  \n",nom); 
           scanf("%*c"); 
           exit(0);
          }
        // on ouvre le fichier en lecture seule
        fread (&(bmp->sign),2,1,fichier);    // on récupère la signature
        fread (&(bmp->taille_image),4,1,fichier);    //  la taille de l'image 
        fread (&(bmp->reserve),4,1,fichier);   	
        fread (&(bmp->offset),4,1,fichier);    // l'offset    	
        fread (&(bmp->taille_entete),4,1,fichier);    // taille de la zone info    	
        fread (&(bmp->largeur),4,1,fichier);    // la largeur de l'image    
        fread (&(bmp->hauteur),4,1,fichier);    // la hauteur de l'image    	
        fread (&(bmp->nbr_plans),2,1,fichier);    // le nombre de plans (=1)   
        fread (&(bmp->codage),2,1,fichier);    // le mode d'affichage    	
        fread (&(bmp->compression),4,1,fichier);    // le format de compression    
        fread (&(bmp->taille_fichier),4,1,fichier);    // la taille de l'image    
        fread (&(bmp->resolution_h),4,1,fichier);    // les résolutions horizontale
        fread (&(bmp->resolution_v),4,1,fichier);        
        fread (&(bmp->nbre_coul),4,1,fichier);        
        bmp->pixel=(unsigned char*)malloc(sizeof(bmp->taille_image));
        fread(bmp->pixel,1,bmp->taille_image,fichier);        
        fclose (fichier);        // on ferme le fichier
     
        return bmp;        // on retourne le pointeur sur la structure bitmap
    }
    Ensuite pour répondre à ta question concernant le codage de mon Bitmap , il est effectivemet sur 24bits .

    Pour la luminance je connais le code associé ! j'en connais même DEUX ! , donc pas de soucis à ce niveau la !

    Pour les tablaux R , V et B , effectivement , au départ je les avais déclarés dans le but d'y stocker les valeurs des composantes Rouges , Vertes , et Bleues contenues dans chaque pixel .
    Le but était de créer deux boucles , et de parcourir chaque pixel pour y extraire ensuite les valeurs des trois couleurs .
    Mais avant tes précieux conseils ,je n'étais pas au courant que l'ordre de stockage des pixels dans le format BMP était inversé ...
    (mais bon , ceci n'est pas un problème ! puisque je le sais maintenant ! :p )

    j'avoue que déclarer une structure pixel , ne m'est pas du tout passée par l'esprit ! encore une fois Merci ! ^^

    Et pour le "cinquièmement !" je sèche un peu , mais je vais travailler dessus et poster le code en question ! je croise les doigts !

    Voila ! à mes crayons ! lol

    Merci encore !

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 16
    Points : 19
    Points
    19
    Par défaut
    Bonjour,

    Voila je profite que tu travailles sur ton raster pour te poster quelques petites corrections et suggestions rapides et utiles.

    Tout d'abord dans ta structure bitmap, comme je te l'ai déjà dit (il insiste le bougre), soit cohérente dans le choix de tes types (sauf pour le champ "sign").
    De ce fait,
    et
    deviendront
    et
    Sinon tu risques d'avoir des surprises pour les grandes valeur .

    Ensuite à la fin de ton main, juste avant le "#ifdef DEBUG" il manque le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (b->pixel != NULL)
    {
       free(b->pixel);
    }
    Voila pour les corrections. Pour finir je te fais une petite suggestion, de manière à t'assurer que le bitmap passé en entrée soit un bitmap 24 bits, pourquoi ne pas faire un test sur le type de codage de ton bitmap qui vérifierait qu'il est bien 24 bits et fait le traitement ensuite, et qui sinon indique que le type de bitmap passé en entrée n'est pas bon. C'est rapide à faire et ça t'évitera les surprises d'un bitmap qui serait mal interprété par la suite et que tu ne saches pas pourquoi (je suis du genre tête en l'air donc j'essaie de penser aux gardes fou dès le début du programme).

    En espérant que tes crayons marchent bien, que je puisse voir le résultat de tes recherches pour récupérer le raster .

  13. #13
    Nouveau Candidat au Club
    Inscrit en
    Avril 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 6
    Points : 1
    Points
    1
    Par défaut

    Bon bon bon !

    J'y ai passé toute la journée ! je commence à ressmbler à Mr Propre !!!

    je ne sais pas comment faire pour récupérer ce (désolé pour le terme) foutu raster !!!

    j'ai même écrit en attendant un programme avec la SDL (qui marche parfaitement ! ) ... mais sur celui la ! NADA !!!

    l'idée qui m'est venue en tête et que je n'arrive pas à appliquer est la suivante :
    -Récupérer l'adresse du pixel
    -décomposer ce pixel en ses trois composantes
    -afficher les composantes
    -puis apporter les modifications pour obtenir l'image luminance
    -ensuite effectuer la difference entre une image et une autre afin de détecter un changement .

    !!! facile à dire !
    j'ai réussi à faire les quatre 1ers points avec la SDL .
    Mais comment assembler la suite ?

    et encore une question : si j'ai une suite d'images qui ont en commun le début du nom c'est à dire : "image0000" ,"image0001","image0002" ...etc est-il possible grace à la fonction "strcat" de parcourir toutes ces images ??? !!!

    voila ! j'espère que je n'en demande pas trop !

  14. #14
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut
    Je vais commencer par la dernière partie ( en même temps j'ai pas compris la première partie )

    Pour les noms de fichier je conseille plus l'utilisation du sscanf ( en faisant très attention à la mémoire ).
    Il faut juste mettre comme format la chaine de caractère et puis un int ( voir les documentations ). La chaine de caractère est la partie fixe du nom du fichier.

    Je ne comprends pas cette notion de raster dans un fichier image mais bon
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  15. #15
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Bonjour à tous =) (et désolé de remonter le topic, mais bon, je pense que pour une semaine, ça va encore)

    Alors tout comme Aowen, j'ai besoin de récupérer moi même le raster d'une image BMP, ce que j'ai réussi à faire, du moins je pense, d'ailleurs voici mon code :

    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
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    #include <stdio.h>
    #include <stdlib.h>
     
    typedef unsigned char uc;
    typedef unsigned int ui;
    typedef unsigned short us;
     
    typedef struct
    {
    	uc B;
    	uc V;
    	uc R;
    } BMPdata;
     
    typedef struct BMPfile
    {
    	//L'entête du fichier
    	char signature[2];   //La signature du fichier
    	ui taille_fichier;   //La taille totale du fichier (en octets)
    	ui champ_reserve;    //Un champ réservé
    	ui offset;    //L'offset de l'image
     
    	//L'entête de l'image
    	ui taille_entete;   //La taille de l'ente de l'image
    	ui largeur;
    	ui hauteur;
    	us nombre_plans; //Nombre de plans, toujours égal à 1
    	us profondeur; //(1, 4, 8, 16, 24 ou 32)
    	ui methode_compression; //0 quand non compressé
    	ui taille_image;
    	ui resolution_horizontale;
    	ui resolution_verticale;
    	ui nombre_couleurs_palette;
    	ui nombre_couleurs_importantes_palette;
     
    	uc palette_b;
    	uc palette_v;
    	uc palette_r;
    	uc palette_reserve;
     
    	BMPdata** raster;
    } BMPfile;
     
    void BMPload(char BMPpath[], BMPfile *fichier_image);
    void displayBMPheader(BMPfile *fichier_image);
    void getBMPpx(BMPfile *BMP, int x, int y, BMPdata* couleur);
    void BMPclose (BMPfile *BMP);
     
    int main()
    {
    	int i;
    	BMPfile image;
    	BMPdata couleur;
    	char BMPpath[100];
     
    	printf("Entrez la localisation de votre fichier BMP : ");
    	fgets(BMPpath, 100, stdin);
    	for (i = 0 ; i < 100 ; i++)
    	{
    		if (BMPpath[i] == '\n') BMPpath[i] = '\0';
    	} 
     
    	BMPload(BMPpath, &image);
    	displayBMPheader(&image);
     
    	getBMPpx(&image, 26, 9, &couleur);
     
    	printf("Pixel x = 26 y = 9 :\n");
    	printf("--------------------\n");
    	printf("R : %i\n", couleur.R);
    	printf("V : %i\n", couleur.V);
    	printf("B : %i\n\n", couleur.B);
     
    	BMPclose(&image);
     
    	return 0;
    }
     
    void BMPload(char BMPpath[], BMPfile *BMP)
    {
    	FILE *fichier = NULL;
    	int i, x, y;
     
    	fichier = fopen(BMPpath, "rb");
    	if (fichier == NULL)
    	{
    		printf("\nErreur : Impossible de localiser le fichier %s.\n", BMPpath);
    		exit(0);
    	}
     
    	fread(&(BMP->signature), 2, 1, fichier); //On récupère la signature
    	fread(&(BMP->taille_fichier), 4, 1, fichier); //Puis sa taille (en octets)
    	fread(&(BMP->champ_reserve), 4, 1, fichier); //Puis la valeur du champ réservé
    	fread(&(BMP->offset), 4, 1, fichier); //Puis l'offset
     
    	fread(&(BMP->taille_entete), 4, 1, fichier); //La taille de l'entête de l'image
    	fread(&(BMP->largeur), 4, 1, fichier); //La largeur de l'image
    	fread(&(BMP->hauteur), 4, 1, fichier); //Sa hauteur
    	fread(&(BMP->nombre_plans), 2, 1, fichier); //Le nombre de plans
    	fread(&(BMP->profondeur), 2, 1, fichier); //La profondeur
    	fread(&(BMP->methode_compression), 4, 1, fichier); //La compression (0 pour aucune)
    	fread(&(BMP->taille_image), 4, 1, fichier); //La taille de l'image (si si ;O)
    	fread(&(BMP->resolution_horizontale), 4, 1, fichier); //La resolution horizontale
    	fread(&(BMP->resolution_verticale), 4, 1, fichier); //Verticale cette fois
    	fread(&(BMP->nombre_couleurs_palette), 4, 1, fichier);
    	fread(&(BMP->nombre_couleurs_importantes_palette), 4, 1, fichier);
     
    	if (BMP->profondeur != 24)		//Si le BMP n'est pas 24bits, on récupère la palette
    	{
    		fread(&(BMP->palette_b), 1, 1, fichier);
    		fread(&(BMP->palette_v), 1, 1, fichier);
    		fread(&(BMP->palette_r), 1, 1, fichier);
    		fread(&(BMP->palette_reserve), 1, 1, fichier);
    	}
     
    	BMP->raster = (BMPdata**) malloc(sizeof(BMPdata*) * BMP->hauteur);	//On alloue
    	for (i = 0 ; i < BMP->hauteur ; i++)
    	{									//notre
    		BMP->raster[i] = (BMPdata*) malloc (BMP->largeur * sizeof(BMPdata));
    	}									//Matrice
     
    	for (y = 0 ; y < BMP->hauteur ; y++)
    	{
    		for (x = 0 ; x < BMP->largeur ; x++)
    		{
    			fread(&(BMP->raster[y][x].B), 1, 1, fichier);
    			fread(&(BMP->raster[y][x].V), 1, 1, fichier);
    			fread(&(BMP->raster[y][x].R), 1, 1, fichier);
    		}
    	}
     
    	fclose(fichier);
    }
     
    void displayBMPheader(BMPfile *BMP)
    {
    	printf("\n");
    	printf("Entête du fichier :\n");
    	printf("-------------------\n");
    	printf("Signature : %s\n", BMP->signature);
    	printf("Taille totale du fichier : %io\n", BMP->taille_fichier);
    	printf("Valeur du champ réservé : %i\n", BMP->champ_reserve);
    	printf("Offset : %i\n\n", BMP->offset);
     
    	printf("Entête de l'image :\n");
    	printf("-------------------\n");
    	printf("Taille de l'entête : %i\n", BMP->taille_entete);
    	printf("Largeur de l'image : %ipx\n", BMP->largeur);
    	printf("Hauteur de l'image : %ipx\n", BMP->hauteur);
    	printf("Le nombre de plans de l'image : %i\n", BMP->nombre_plans);
    	printf("Profondeur de l'image : %i\n", BMP->profondeur);
    	printf("Méthode de compression : %i\n", BMP->methode_compression);
    	printf("Taille de l'image : %i\n", BMP->taille_image);
    	printf("Resolution horizontale : %i\n", BMP->resolution_horizontale);
    	printf("Resolution verticale : %i\n", BMP->resolution_verticale);
    	printf("Nombre de couleurs de la palette : %i\n", BMP->nombre_couleurs_palette);
    	printf("Nombre de couleurs importantes de la palette : %i\n\n", BMP->nombre_couleurs_importantes_palette);
     
    	if (BMP->profondeur != 24)
    	{
    		printf("Palette de l'image :\n");
    		printf("--------------------\n");
    		printf("Bleu : %i\n", BMP->palette_b);
    		printf("Vert : %i\n", BMP->palette_v);
    		printf("Rouge : %i\n", BMP->palette_r);
    		printf("Champ réservé : %i\n\n", BMP->palette_reserve);
    	}
    }
     
    void getBMPpx(BMPfile *BMP, int x, int y, BMPdata* couleur)
    {
    	couleur->B = BMP->raster[BMP->hauteur - (BMP->hauteur - y) - 1][x].B;
    	couleur->V = BMP->raster[BMP->hauteur - (BMP->hauteur - y) - 1][x].V;
    	couleur->R = BMP->raster[BMP->hauteur - (BMP->hauteur - y) - 1][x].R;
    }
     
    void BMPclose (BMPfile *BMP)
    {
    	free (BMP->raster);
    }
    (Si vous avez des réflexions sur ma façon de coder, je les écouterais volontier et bien sûr sur n'importe quelle erreur dans mon code)

    Alors, personnellement, ce code me suffit vu que je n'utiliserai que des BMP de 24bits avec des longueurs multiples de 16 (et de 4 donc), mais je me pose quelques questions :

    -Pour les 0 nuls, je suppose que je devrais virer ma structure BMPdata pour faire une matrice d'unsigned char pour pouvoir insérer les 0 'inutiles'. Est-ce vrai ?

    -J'ai alloué ma matrice dynamiquement, et c'est la première fois que je le fais, et je ne sais pas si je la libère correctement. En gros, je ne sais pas si je fais bien de faire un free(BMP->raster) et pas de d'abord faire un free pour toutes les lignes de ma matrice.

    -Hum, j'ai trouvé très peu d'infos à propos de la compression des BMPs et j'ai donc plusieurs questions. Tout les BMP peuvent-ils être compressés de toutes les façons ? Qu'est ce que la compression bitfield ? 'fin, si possible, j'aimerais bien qu'on m'éclaire sur un peu tout à ce sujet.

    -Et je n'ai strictement rien compris à l'utilisation de la palette et du moyen de lire les couleurs sur les BMPs ayant une profondeur inférieure à 24bits.

    -Et dernière question : à propos des BMP 32 bits, à quoi correspond l'octet en plus par rapport à ceux de 24 bits, à l'alpha ?

    Bon, je sais que j'en demande beaucoup, mais ce serait sympa si vous pouviez répondre à toutes mes questions.

  16. #16
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Pour informations sur le format BMP, voir wotsit.org notamment le document "Windows BMP Format (MS Word)"

    -J'ai alloué ma matrice dynamiquement, et c'est la première fois que je le fais, et je ne sais pas si je la libère correctement. En gros, je ne sais pas si je fais bien de faire un free(BMP->raster) et pas de d'abord faire un free pour toutes les lignes de ma matrice.
    Tu dois avoir autant de free() que de malloc(). Donc il faut au préalable libérer la mémoire allouée pour chaque ligne avant le free(BMP->raster)
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  17. #17
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut
    Citation Envoyé par Trinity-Wind Voir le message
    -Hum, j'ai trouvé très peu d'infos à propos de la compression des BMPs et j'ai donc plusieurs questions. Tout les BMP peuvent-ils être compressés de toutes les façons ? Qu'est ce que la compression bitfield ? 'fin, si possible, j'aimerais bien qu'on m'éclaire sur un peu tout à ce sujet
    Une seule compréssion pour les BMP. C'est du RLE, et j'ai donné le lien au dessus. Rien à rajouter.

    [quote=Trinity-Wind;5165239]
    -Et je n'ai strictement rien compris à l'utilisation de la palette et du moyen de lire les couleurs sur les BMPs ayant une profondeur inférieure à 24bits.
    [quote]
    Les palette, c'est un tableau de couleurs. Une fois que ce tableau est définie, le fichier en lui même ne représente plus les couleurs en RGB ( 24bits ) mais en un numero qui est le numéro de la case de la palette ( qui correspond donc à une couleur ).

    Citation Envoyé par Trinity-Wind Voir le message
    -Et dernière question : à propos des BMP 32 bits, à quoi correspond l'octet en plus par rapport à ceux de 24 bits, à l'alpha ?
    Oui c'est de l'alpha. Par contre, ce n'est jamais utilisé ( déjà que le fichier est bien lourd sans ). Un farfouilleur ( hacker ) pourrait utiliser ce champs pour stocker des informations additionnelles )

    Citation Envoyé par Trinity-Wind Voir le message
    Bon, je sais que j'en demande beaucoup, mais ce serait sympa si vous pouviez répondre à toutes mes questions.
    Vous n'en demandez pas de trop :p ( je plaisante ) le forum est là pour ça. Désolé de ne pas répondre à tout et de ne pas avoir regardé le code.
    Il y a de la doc un peu partout sur internet pour le BMP, mais il faut savoir que juste lire la spécification du format est suffisant
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  18. #18
    Nouveau membre du Club
    Inscrit en
    Mars 2010
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 33
    Points : 30
    Points
    30
    Par défaut
    Salut LittleWhite,
    moi comme je suis un débutant qui veut savoir tout les choses rapidement, et que pour le moment je vois que c'est très tôt de plonger dans les algorithmes de compression,j'ai bien compris la compression des bitmap 8 bit et 4 bit à l'aide de ce lien:
    http://atlc.sourceforge.net/bmp.html#_toc381201088
    il parait que le RLE utilise l'occurrence des entiers pour la compression...
    au moins...il n'utilise pas des formules lourdes...

  19. #19
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut
    Mince, ce n'était pas dans ce post que j'avais mis le lien sur la wikipedia.
    http://fr.wikipedia.org/wiki/Run-length_encoding

    Voilà c'est fait maintenant.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

Discussions similaires

  1. Convertir une matrice en une image
    Par jijikkk dans le forum OpenCV
    Réponses: 0
    Dernier message: 24/01/2010, 14h28
  2. afficher la matrice d'une image et calcule de ces histogrammes
    Par Rose-de-sable dans le forum C++Builder
    Réponses: 11
    Dernier message: 01/01/2010, 14h33
  3. transformation matrice en une image
    Par dhekrasousou dans le forum Débuter
    Réponses: 1
    Dernier message: 23/02/2009, 23h31
  4. afficher la matrice d'une image dans une figure
    Par kawther dans le forum Interfaces Graphiques
    Réponses: 15
    Dernier message: 04/12/2008, 15h20
  5. Afficher la matrice d'une image avec GUIDE
    Par kethmoon dans le forum MATLAB
    Réponses: 6
    Dernier message: 18/01/2008, 18h38

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