Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : lecture header bitmap [ Divers / Divers ] (glipper)

dimanche 24 février 2008 à 03:05:28 | lecture header bitmap

glipper

Membre Club
Bonjour,
j'essai de lire le header d'un fichier bitmap, et d'en extraire les informations.
Mon programme doit-être portable sur différentes machines, donc j'ai déclaré quelques types à ma façon :
typedef unsigned int BOOL;    /* 1-Bit. */
typedef signed char S8;        /* 8-Bit Signed. */
typedef unsigned char U8;    /* 8-Bit Unsigned. */
typedef signed short S16;    /* 16-Bit Signed. */
typedef unsigned short U16;    /* 16-Bit Unsigned. */
typedef signed long S32;    /* 32-Bit Signed. */
typedef unsigned long U32;    /* 32-Bit Unsigned. */

Comme ça, si j'ai bien compris, la taille en octet d'un type ne dépendra plus de la machine.
Ensuite, j'ai déclaré une structure, dont le but est de contenir les informations :
/* Structure d'un en-tête de fichier bitmap */
typedef struct t_bmpHeader{
   
    U8 u8_signature[2];
    U32 u32_tailleFichierOct;
    U32 u32_reserved;
    U32 u32_offset;

    U32 u32_tailleBmpInfo;
    U32 u32_largeurImagePxl;
    U32 u32_hauteurImagePxl;
    U16 u16_nbrePlans,
    U16 u16_bitsParPixels;
    U32 u32_compressionImage;
    U32 u32_tailleImageOct;
    U32 u32_resolutionX;
    U32 u32_resolutionY;
    U32 u32_nombreCouleurs;
    U32 u32_nombreIndexCouleurs;

}t_bmpHeader;

Enfin, j'ai enregistré le header de mon image :
FILE* pf_bmp;
t_bmpHeader t_headerFile;

pf_bmp = fopen("bitmap.bmp", "rb");

fread(&t_headerFile, 1, sizeof(t_headerFile), pf_bmp);
Et enfin j'essai d'afficher les informations :

printf("signature: %c%c \n", t_str->u8_signature[0], t_headerFile.u8_signature[1]);
printf("taille du fichier en octet: %li \n", t_headerFile.u32_tailleFichierOct);
printf("offset: %li \n", t_headerFile.u32_offset);
...
Mais voilà, ça ne marche pas. Les valeurs obtenus sont fausses, à part pour la signature qui est correcte (BM).
Je me demandais si le problème ne pouvait pas venir de la façon dont sont enregistrées les valeurs (Little endien, big endien...).

En changeant les U32 par des tableaux de U8, ça fonctionne parfaitement. Exemple :
U32 u32_tailleFichierOct; est remplacé par U8 u8_tailleFichierOct[4];
on affiche en écrivant : printf("taille du fichier en octet: %li \n", *(t_headerFile.u8_tailleFichierOct));
J'aimerais bien comprendre quel est le problème, car il me semblerait plus logique d'utiliser directement U32 au lieu d'un tableau de U8.

Merci d'avance pour vos idées...
Glipper

dimanche 24 février 2008 à 11:09:10 | Re : lecture header bitmap

luhtor

Réponse acceptée !
Ca doit etre lié au padding du compilo. Il réordonne peut être les champs de ta structure pour optimiser la mémoire (je peux me tromper), mais si tu es sur que ta structure est bonne, c'est probablement cela. La solution, c'est soit de désactiver le pagging (je sais pas comment on fait), soit de lire les champs 1 par 1 et non d'un bloc comme tu essais de le faire.

Enfin pour l'histoire du padding, tu peux rapidement regarder si u32_tailleFichierOct est bien 2 octets apres le début de ta structure (et j'imagine que non):

typedef struct t_bmpHeader
{
    U8 u8_signature[2];
    U32 u32_tailleFichierOct;
    U32 u32_reserved;
...

t_bmpHeader lHeader;

if (&lHeader.u32_tailleFichierOct - &lHeader != 2)
   // alors tes champs de sont plus dans l'ordre que tu as défini.



dimanche 24 février 2008 à 11:25:03 | Re : lecture header bitmap

BruNews

Administrateur CodeS-SourceS
Réponse acceptée !
#pragma pack(1)

ciao...
BruNews, MVP VC++

dimanche 24 février 2008 à 12:59:03 | Re : lecture header bitmap

glipper

Membre Club
Merci,

Le problème semblait bien venir de là.
J'ai donc utilisé des U8 partout, et pas de U32 qui décallent les données.

J'ai hésité entre cette solution ou utiliser #pragma mais je me suis dit que désactiver le padding devait jouer sur les performances (je ne sais pas). Sachant que ce programme devrait modifier une image bmp, je voudrais qu'il soit rapide.

Voilà, juste une information pour ceux qui voudraient aussi faire un programme de ce type :
Ne pas oublier de convertir les tableaux de quatre U8 en U32 pour les afficher. Les données des bmp sont en Little Endien (les octets de poids forts sont stoqués à droite des octets de poids faibles)

Merci beaucoup pour votre aide :)
CA MARCHE !!! hihi


----------------------------------------------------------------------------------------
/* conversion d'un tableau de quatre U8 en un nombre U32 */
U32 a_U8toU32(U8* a_in) {   
    return *a_in + *(a_in+1)*256 + *(a_in+2)*256*256 + *(a_in+3)*256*256*256;
}


dimanche 24 février 2008 à 13:15:31 | Re : lecture header bitmap

BruNews

Administrateur CodeS-SourceS
Le non alignement par #pragma ne change en rien la vitesse tant que tu ne fais pas de lecture ou affectation sur un mauvais alignement, ce qui n'est pas le cas ici pour la lecture des octets d'un entete de fichier.

Multiplications et divisions de puissances de 2 se font avec des << ou >>.

ciao...
BruNews, MVP VC++



Cette discussion est classé dans : unsigned, bit, typedef, u32, u8


Répondre à ce message

Sujets en rapport avec ce message

stdint.h [ par anarchysniper ] La librairie stdint est censée fournir des type indépendants du système. Cependant, dans le header, pour les int, /* 7.18.1.1  Exact-width integer t Newbie Erreur en C sous JBuilder c++ 6 [ par MrNo ] salut je suis en trainde reprendre un programme existant en c sous cbuilder qui marchai t avant mais j'aides erreur a la compilationvoici mon code sur Sniffing - raw socket [ par krum ] J'ai essayé de coder un programme capable de me donner la description de l'en tete IP et TCP des packets que je reçois d'une certaine IP,mais lorsque binary II [ par helena123 ] Salut les loulous,je vous remercie deja pour les conseils sur la declaration de champs de bits mais maintenant j ai un probleme de manipulation plus d DLL sous C++ builder 6 [ par ivdz ] Bonjour,Voici une partie du .h de mon exécutable que je dois transformer en DLL (sous C++ builder 6) :#ifndef MODBUSTCPIP_H#define MODBUSTCPIP_Hclass pb de progr [ par airwann ] bonjour,j ai un pb ds mon code (je ne suis pas un expert) mais là je ne vois pas ou ça plante ..////////////////////////////////////////////////////// pb de retour( du tableau) de ma fonction [ par airwann ] bonjour,j ai un problème comment dois je modifier l'entête de ma fonction pour recupérer le tableau de structure 3 d alloué dynamiquementmerci d avanc Pb Traduction C vers Delphi ; typedef Union ? [ par uruma ] Salut,Je ne programme jamais en C, mais actuellement, j'essaye de traduire un sources C en DELPHI, malheuresement je tombe sur un os, je ne sais pas c RAW SOCKET - IP - ICMP - Ping [ par dark1933 ] Salut à tous,Voici le code d'un programme qui envoye un ping (ici à Google), mais ne reçoit aucune réponse.La socket utilisée est du type : socket(AF_ Conversion de unsigned char en float (17.6E) [ par lemenager ] Bonjour,Je dois lire un fichier binaire dans lequel il y a des float en format (17.6E). J'ai l'impression que je suis oblige de les lires en unsigned


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,343 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.