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 :

Gestion de la Structure d'un BMP


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 13
    Par défaut Gestion de la Structure d'un BMP
    Bonsoir,

    Je suis en train de developper un petit programme qui lit la structure d'un fichier BiTMap de 24 BITS.
    J'ai reussis , je pense recuperer correctement l'entête de celui-ci mais c'est dans la gestion du corps de l'image que j'ai un soucis :
    en effet je cherche a detecter des que je rencontre un pixel noir : quand je le trouve j'imprime ses coordonnées en pixels.

    Cependant durant mes tests j'avais des erreurs etrange , j'ai donc decider de lister toutes les valeurs de chaque pixels : et la stupefaction , mon programme lis plus de pixels que ne contient l'image.
    Ce qui me fait penser que je ne suis pas bien alligné sur le corps de l'image , cependant j'ai tout testé est impossible de trouver quelquechose de coherant ...

    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
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
     
    typedef struct entete entete;
    struct entete
    {
           char format [3];
           int taille;
           int reserve;
           int BMP_Off;
           int BMP_Width;
           int BMP_Height;
    };
     
     
    typedef struct sCoul sCoul;
    struct sCoul
    {
            unsigned char R;
            unsigned char V;
            unsigned char B;
    };
     
     
    entete RecupEntete(FILE *fpin)
    {
            entete E1;
            fread(&E1.format,2,1,fpin);
            fread(&E1.taille,4,1,fpin);
            fread(&E1.reserve,4,1,fpin);
            fread(&E1.BMP_Off,4,1,fpin);
            fread(&E1.reserve,4,1,fpin);
            fread(&E1.BMP_Width,4,1,fpin);
            fread(&E1.BMP_Height,4,1,fpin);
            return E1;  
    }
     
    entete RecupEntete(FILE *fpin);
     
     
     
    int print_info()
    {
      int i=0;
      int j=0;
      int k=0;
      int x=0;
      int y=0;
      FILE* f;
      entete E;
      /*tabeau de couleurs ( R,V,B )*/
      sCoul *couleurs=NULL;
     
      f = fopen("test.bmp","rb");
      if (f==NULL)
        {
          printf("Erreur de chargement de l'image");
          return(0);
        }
      else
        {
          E=RecupEntete(f);
          printf("Taille du fichier: %d\n",E.taille);
          printf("Hauteur du fichier: %d\n",E.BMP_Height);
          printf("Largeur du fichier: %d\n",E.BMP_Width);
          printf("format: %d\n",E.reserve);
          fseek(f, E.BMP_Off, SEEK_SET); /* positionnement du curseur
    					sur le debut du corps*/
     
     
          /* allocation dynamique du tableau contenant les couleurs*/
          couleurs=malloc (E.BMP_Height*E.BMP_Width*sizeof(sCoul));
          while (!feof(f))
    	  {
                /* on remplis le tableau avec les valeurs de couleur des pixels*/
                fread(&couleurs[i], sizeof(sCoul),1,f);
     
                /*si le pixel est noir je le print*/
    	    if (couleurs[i].B+couleurs[i].V+couleurs[i].R==0)
    	      {
    		x=(i % E.BMP_Width);
    		y=(i % E.BMP_Height);
    		printf("PIXEL NOIR ! Coordonnée en (x:%d,y:%d)\n",x,y);
    		j++;
    	      }
               i++;
              } 
          j=0;
          while (j<i)
    	{
    	 printf("R:%d V:%d B:%d\n",couleurs[j].B,couleurs[j].V,couleurs[j].R);
    	 j++;
    	}
        }
      return(1);
      fclose(f);
    }
     
     
    int main()
    {
      print_info();
      return(0);
    }
    Et le resultat de mon trace quand je test avec un fichier image de 1 pixels de haut, 5 pixels de hauteurs et un unique pixel noir en 3eme position:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Taille du fichier: 76
    Hauteur du fichier: 1
    Largeur du fichier: 5
    format: 40
    PIXEL NOIR ! Coordonnée en (x:3,y:0)
    R:255 V:255 B:255
    R:255 V:255 B:0
    R:0 V:0 B:255
    R:0 V:0 B:0
    R:255 V:255 B:255
    R:255 V:255 B:0
    R:0 V:0 B:255
    R:0 V:2 B:0
    Je devrai avoir que 5 pixels et la mon programme en list 8 ...





    Si quelqu'un pourrai m'aider SVp ça serai genial.

    Codialement.

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Quelle taille est supposée avoir un int ?
    Et pourquoi trois chars pour le format ?

    Normalement, la structure d'un bitmap est ainsi, avec un alignement à deux octets :
    BITMAPFILEHEADER + BITMAPINFOHEADER + un certain nombre de RGBQUAD (zéro en 24 bits)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 613
    Par défaut
    vérifie deja que E1.taille = E1.BMP_Off + hauteur*largeur*3 (en octets). Puis que ca correspond à la taille de ton fichier

Discussions similaires

  1. Structure complexe - gestion fct contexte
    Par lilyparis dans le forum Développement de jobs
    Réponses: 5
    Dernier message: 23/05/2008, 16h52
  2. [WINDEV11] Gestion de tableau de structure
    Par shensi dans le forum WinDev
    Réponses: 3
    Dernier message: 18/06/2007, 16h45
  3. structure des BMP,JPEG,GIF ...
    Par hutchuck dans le forum Imagerie
    Réponses: 2
    Dernier message: 22/10/2005, 20h03
  4. Réponses: 4
    Dernier message: 04/10/2005, 14h37
  5. [TP]Gestion des images bmp avec BMP.TPU
    Par Gabi dans le forum Turbo Pascal
    Réponses: 9
    Dernier message: 14/05/2004, 23h20

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