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.