Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1518 connectés 

  FORUM HardWare.fr
  Programmation
  C

  [C] Lire une structure (fichier bitmap)

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C] Lire une structure (fichier bitmap)

n°552479
void_ppc
Posté le 28-10-2003 à 13:15:35  profilanswer
 

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
mood
Publicité
Posté le 28-10-2003 à 13:15:35  profilanswer
 

n°552482
LetoII
Le dormeur doit se réveiller
Posté le 28-10-2003 à 13:18:11  profilanswer
 

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
n°552483
*syl*
--&gt; []
Posté le 28-10-2003 à 13:18:12  profilanswer
 

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

n°552487
void_ppc
Posté le 28-10-2003 à 13:21:47  profilanswer
 

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 ?

n°552488
chrisbk
-
Posté le 28-10-2003 à 13:23:33  profilanswer
 

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)

n°552489
void_ppc
Posté le 28-10-2003 à 13:24:23  profilanswer
 

*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
n°552497
LetoII
Le dormeur doit se réveiller
Posté le 28-10-2003 à 13:36:21  profilanswer
 

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
n°552515
void_ppc
Posté le 28-10-2003 à 13:54:00  profilanswer
 

Parfait, merci du coup de main  
 :hello:

n°552664
Joel F
Real men use unique_ptr
Posté le 28-10-2003 à 15:21:50  profilanswer
 

sinon ya allegro avec load_bitmap :whistle:


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  [C] Lire une structure (fichier bitmap)

 

Sujets relatifs
[C++] Recherche d'une chaine dans un fichier[Dbase] Ouvrir un fichier .ndx
[C++]Insérer une ligne dans un fichiercommande dos pour supprimer fichier en utilisation
Obtenir le nombre total d'enregistrement d'un fichier mdbAccés fichier dans un répertoire grand-parent
[Java/C] peut on mapper une structure C a une classe java??Transmettre une valeur d'un fichier à un autre ?
[Linux] Tester la presence d'un fichier[JSP] importer des données contenues dans un fichier Excel
Plus de sujets relatifs à : [C] Lire une structure (fichier bitmap)


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR