Lecture de l'entête d'un fichier bmp [gcc]

0/5 (3 avis)

Snippet vu 14 301 fois - Téléchargée 30 fois

Contenu du snippet

Ce petit programme permet de lire l'entête d'un fichier bmp, mon but en faisant ce programme était de bien voir comment elle est structurée et quelles sont les données qui la compose.
On peut apprendre toute un série de choses sur un image avec ça. J'ai fait une fonction pour pouvoir le réutiliser dans d'autres programmes.

Source / Exemple :


/*

  • Code de Funcky (funcky@magellan.fpms.ac.be)
  • Dernière modification le 02/03/2004
  • /
#include <stdio.h> struct entete_struct { //structure (globale) ou seront stockées les infos de l'entete char signature[2]; int taille; int offset; int taille_entete; int largeur; int longueur; int plans; int bpp; int compression; int taille_image; int Hresolution; int Vresolution; int nbr_couleur; int nbr_couleur_importante; }entete; int hex2dec (unsigned char hex[4],int nombre) //Fonction permettant de convertir un nombre hexa { //en décimal (plus facile à lire) int resultat = 0; int i; for (i = nombre - 1; i >= 0; i--) { resultat = resultat * 256 + hex[i]; } return resultat; } void lire_fichier (char nom[255]) { unsigned char temp[4]; //Zone mémoire temporaire où on stoque ce qui est lu dans le fichier avant FILE * fichier; //de le traiter. fichier = fopen (nom,"r"); fread (&entete.signature,2,1,fichier); //signature codée sur 2 octets fread (&temp,4,1,fichier); entete.taille = hex2dec (temp,4); //taille totale du fichier, 4 octets fread (&temp,4,1,fichier); //reservé fread (&temp,4,1,fichier); //Offset de début de l'image, 4 octets entete.offset = hex2dec (temp,4); fread (&temp,4,1,fichier); //Taille de l'entete, 4 octets entete.taille_entete = hex2dec (temp,4); fread (&temp,4,1,fichier); //Largeur, 4 octets entete.largeur = hex2dec(temp,4); fread (&temp,4,1,fichier); //Longueur, 4 octets entete.longueur = hex2dec(temp,4); fread (&temp,2,1,fichier); //Nombre de plans ( 1 ), 2 octets entete.plans = hex2dec (temp,2); fread (&temp,2,1,fichier); //Nbre de bit par pixels, 2 octets entete.bpp = hex2dec (temp,2); fread (&temp,4,1,fichier); //Compression, 0 = rien, 4 octets entete.compression = hex2dec (temp,4); fread (&temp,4,1,fichier); //Taille de l'image, 4 octets entete.taille_image = hex2dec (temp,4); fread (&temp,4,1,fichier); //Resolution horizotale en pixels par mètre, 4octets entete.Hresolution = hex2dec (temp,4); fread (&temp,4,1,fichier); //Resolution verticale, en ixels par mètre, 4 octets entete.Vresolution = hex2dec (temp,4); fread (&temp,4,1,fichier); //Nombre de couleur utilisées, 0 = toutes, 4 octets entete.nbr_couleur = hex2dec (temp,4); fread (&temp,4,1,fichier); //Nombre de couleurs importantes, 0 = toues, 4 octets entete.nbr_couleur_importante = hex2dec (temp,4); //Si c'est un image 8 bit, cette entête est suivie de la palette. //Après la palette, ce sont les données de l'image fclose (fichier); } main () { lire_fichier ("test.bmp"); //remplacez ici par le fichier, ou par un scanf ;-) printf ("Signature : %s\n",entete.signature); printf ("Taille du fichier : %d\n",entete.taille); printf ("Offset de début de l'image : %d\n",entete.offset); printf ("Taille du Bitmap Info : %d\n",entete.taille_entete); printf ("Largeur : %d\n",entete.largeur); printf ("Longueur : %d\n",entete.longueur); printf ("Nombre de plans : %d\n",entete.plans); printf ("Bits par pixels : %d\n",entete.bpp); printf ("Schéma de compression : %d\n",entete.compression); printf ("Taille de l'image : %d\n",entete.taille_image); printf ("Résolution verticale : %d\n",entete.Vresolution); printf ("Résolution horizontale : %d\n",entete.Hresolution); printf ("Nombre de couleurs (0 = toutes) : %d\n",entete.nbr_couleur); printf ("Nombre de couleurs importantes (0 = toutes) : %d\n",entete.nbr_couleur_importante); }

Conclusion :


Ce code tout seul ne sert pas à grand chose, sauf pour montrer où se trouvent les informations du fichier. A utiliser dans un autre programme par exemple pour trier un répertoire d'images ...

A voir également

Ajouter un commentaire Commentaires
Shad973
Messages postés
2
Date d'inscription
mercredi 7 février 2007
Statut
Membre
Dernière intervention
4 décembre 2007

3 janv. 2008 à 18:03
Merci beaucoup pour ce code TRES facile a comprendre.
ce code ma fait avancer d'un grand pas pour mon projet "traitement d'image BMP" de fin de semestre. un grand Merci.
babas78
Messages postés
1
Date d'inscription
lundi 1 mars 2004
Statut
Membre
Dernière intervention
2 avril 2005

2 avril 2005 à 00:03
Merci beaucoup pour ton code source il m'a été d'une très grande utilité.
vlad_dracula
Messages postés
10
Date d'inscription
dimanche 29 février 2004
Statut
Membre
Dernière intervention
29 mai 2004

24 mai 2004 à 21:43
programme nickel, merci bcp

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.