[C] Lire une structure (fichier bitmap)

Lire une structure (fichier bitmap) [C] - C - Programmation

Marsh Posté le 28-10-2003 à 13:15:35    

Bonjour,
 
Je suis en train d'essayer de faire un prog pour lire un fichier bitmap, j'ai la bonne structure du fichier, mais il ne lit pas les bonnes valeurs de l'entête pour le moment.
 
J'ai entendu parler d'une histoire de padding et d'alignement, mais je n'ai pas tout compris.
 
Voilà le code :
 

Code :
  1. #include <stdio.h>
  2. typedef struct
  3. {
  4. char Magic[2];
  5. int FileSize;
  6. short Reserved0;
  7. short Reserved1 ;
  8. int Offset;
  9. } bitmap_file_header_struct;
  10. typedef struct
  11. {
  12. int Size;
  13. int Width;
  14. int Height;
  15. short Planes;
  16. short Count;
  17. int Compr;
  18. int SizeIm;
  19. int Xpels;
  20. int Xypels;
  21. int ClrUsed;
  22. int ClrImp;
  23. } bitmap_info_header_struct;
  24. void lire(void);
  25. bitmap_file_header_struct file_header;
  26. bitmap_info_header_struct info_header;
  27. int main(void)
  28. {
  29.     lire();
  30.     return 0;
  31. }
  32. void lire(void)
  33. {
  34. FILE *f;
  35. f = fopen("full.bmp", "r" );
  36. if (f == NULL)
  37. {
  38.  printf("erreur lecture" );
  39.  exit(1);
  40. }
  41. fread(&file_header, sizeof(file_header), 1, f);
  42. fread(&info_header, sizeof(info_header), 1, f);
  43. printf("Signature :%c%c\n", file_header.Magic[0], file_header.Magic[1]);
  44. printf("Taille fichier :%i - Offset :%i\n", file_header.FileSize, file_header.Offset);
  45. printf("Width :%i - Height :%i\n",info_header.Width, info_header.Height);
  46. fclose(f);
  47. }


 
Voilà, par exemple si je créer avec gimp un fichier bitmap de 256x256, le programme ne renvoi pas les bonnes valeurs.
 
Je prog sous x86 Linux gcc-3.3 -Wall -ansi -pedantic
 
 
Pour la structure du fichier, je l'ai cherchée ici :
 
http://www.fortunecity.com/skyscra [...] ffrmt.html
 
Merci


Message édité par void_ppc le 28-10-2003 à 13:17:55
Reply

Marsh Posté le 28-10-2003 à 13:15:35   

Reply

Marsh Posté le 28-10-2003 à 13:18:11    

C du bitmap windows? si c ça y a deux chose à savoir:
 
1/ Les lignes sont allignées sur 32 bits.
2/ Le bitmap est écrit à l'envers, ou plutôt tête en bas, c'est à dire que la première ligne lue dans le fichier est celle du bas de l'image.


---------------
Le Tyran
Reply

Marsh Posté le 28-10-2003 à 13:18:12    

#pragma pack(x)
 
x = 1 pour aligner sur 1 octet
Tu mets rien pour revenir à l'alignement par défaut

Reply

Marsh Posté le 28-10-2003 à 13:21:47    

LetoII a écrit :

C du bitmap windows? si c ça y a deux chose à savoir:
 
1/ Les lignes sont allignées sur 32 bits.
2/ Le bitmap est écrit à l'envers, ou plutôt tête en bas, c'est à dire que la première ligne lue dans le fichier est celle du bas de l'image.


 
heu oui, c'est le format d'image.
 
Le bitmap écrit à l'envers, c'est bien sûr pour les données ? ou alors le bitmap_info_header est écrit aussi à l'envers ?

Reply

Marsh Posté le 28-10-2003 à 13:23:33    

void_ppc a écrit :


 
heu oui, c'est le format d'image.
 
Le bitmap écrit à l'envers, c'est bien sûr pour les données ? ou alors le bitmap_info_header est écrit aussi à l'envers ?


les données
mas ca pour le moment tu t'en fous, si ton header est pourri a la base c pas bon
 
(par contre leto a souligné un point tres important, l'alignement, fait bien gaffe a ca + tard)

Reply

Marsh Posté le 28-10-2003 à 13:24:23    

*Syl* a écrit :

#pragma pack(x)
 
x = 1 pour aligner sur 1 octet
Tu mets rien pour revenir à l'alignement par défaut  


 :jap: c'était bien ca.
 
Et cet alignement, ca dépends des compilos et de l'architecture ? ou alors ce code marchera sous win/linux x86/ppc ? (l'alignement des octets change tout non ?)


Message édité par void_ppc le 28-10-2003 à 13:25:46
Reply

Marsh Posté le 28-10-2003 à 13:36:21    

void_ppc a écrit :


 :jap: c'était bien ca.
 
Et cet alignement, ca dépends des compilos et de l'architecture ? ou alors ce code marchera sous win/linux x86/ppc ? (l'alignement des octets change tout non ?)


 
Tant que le compilo reconnait la directive #pragma pack(x)
 c bon. D'un autre côté je trouve que c généralement une mauvaise idée de lire une structure directement depuis un ficheir binnaire. La lecture champ à champ permet de s'afranchir de ce genre de problème, parcontre c un poil moi efficace.


---------------
Le Tyran
Reply

Marsh Posté le 28-10-2003 à 13:54:00    

Parfait, merci du coup de main  
 :hello:

Reply

Marsh Posté le 28-10-2003 à 15:21:50    

sinon ya allegro avec load_bitmap :whistle:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed