Lecture d'un fichier Bmp (image en niveau de gris) et affichage des valeurs des

waffouna Messages postés 5 Date d'inscription samedi 11 avril 2009 Statut Membre Dernière intervention 27 avril 2009 - 19 avril 2009 à 21:21
nduriri Messages postés 4 Date d'inscription dimanche 17 octobre 2010 Statut Membre Dernière intervention 17 octobre 2010 - 17 oct. 2010 à 12:31
Salut
j'ai vraiment besoin de vos aides.
En fait, je suis un électronicienne et je travaille sur la reconnaissance de visage.
Et dans le cadre de mon Pfe,je dois implémenter un système d'identification en langage C.
Le premier obstacle est comment lire un fichier bmp (image en niveau de gris) et afficher les valeurs de ses pixels dans un vecteur.
J'ai écris ce code,et il a fonctionné,mais je doute si les valeurs affichées sont les valeurs voulues ou pas.
voici mon code:
// Bibliothèques utilisées...
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>

// Définition et déclaration de la structure bitmap
typedef struct               
{
    char sign[3];        // signature « BM »   
    int taille;        // taille de l'image       
    int res;            // zone réservée   
    int offset;        // adresse du dbt de l'image   
    int info;            // taille de la zone info   
    int largeur;        // largeur de l'image
    int longueur ;        // hauteur de l'image   
    short nbplan;        // nbre de plans
    short bppixel;        // mode en bits / pixel   
    int comp;            // format de compression   
    int tim;            // taille de l'image en octets   
    int Hres;            // résolution Horizontale
    int Vres;            // résolution Verticale   
    int nbco;            // nbre de couleurs utilisées   
    int impco;        // nbre de couleurs importantes
    unsigned char *palette;    // optionnelle
    unsigned char* pixel;    // ou sera stocké les pixels
} bitmap;

// Prototype des fonctions

bitmap* lecture(char*) ;
int vect[10304];
int conv (unsigned char hex[4],int) ;
unsigned char a;
void main (void)
{
    int i,k;
    char nom[100]; //pour stocker le nom et le chemin de l'image
    bitmap* bmp;   //pour récupérer les infos de l'image
 

    printf("Entrer le nom et le chemin de l'image sans l'extension BMP :\n");
    gets(nom); // on récupère le nom et le chemin de l'image
    strcat(nom,".bmp"); // on ajoute l'extension .bmp à ce fichier
    bmp=lecture(nom); //on utilise la fonction lecture pour récupérer les infos
    //printf ("\nSignature :\t\t\t %.2s\n",bmp->sign); //et on les affiche en parcourant les différents champs de la structure bmp
    //printf ("Taille du fichier :\t\t %d\n",bmp->taille);
    //printf ("Offset de debut de l'image :\t %d\n",bmp->offset);
    //printf ("Taille du bitmap info :\t\t %d\n",bmp->info);
    //printf ("Largeur :\t\t\t %d\n",bmp->largeur);
    //printf ("Longueur :\t\t\t %d\n",bmp->longueur);
    //printf ("Nombre de plans :\t\t %d\n",bmp->nbplan);
    //printf ("Bits par pixels :\t\t %d\n",bmp->bppixel);
    //printf ("Compression :\t\t\t %d\n",bmp->comp);
    //printf ("Taille de l'image :\t\t %d\n",bmp->tim);
    //printf ("Resolution verticale :\t\t %d\n",bmp->Vres);
    //printf ("Resolution horizontale :\t %d\n",bmp->Hres);
    //printf ("Nombre de couleurs :\t\t %d\n",bmp->nbco);
    //printf ("Couleurs importantes :\t\t %d\n\n",bmp->impco);
    for(i=0;i<10304;i++)
    {
        a=*(bmp->pixel)++;
        vect[i]=a;
    }

};

bitmap* lecture(char* nom)
{
    unsigned char temp[4];    // chaine de carac temporaire qui sera utilisé pour récupérer les différentes infos    
    bitmap *bmp;        // variable renvoyée par la fonction
    FILE * fichier;        // un pointeur sur FILE
    bmp=(bitmap*)malloc(sizeof(bitmap)); // on alloue dynamiquement le pointeur sur bitmap
    fichier = fopen (nom,"r");     // on ouvre le fichier en lecture seule
    fread (bmp->sign,2,1,fichier);    // on récupère la signature
    fread (&temp,4,1,fichier);    // puis la taille de l'image   
    bmp->taille = conv (temp,4);   // que l'on converti en décimal
    fread (&temp,4,1,fichier);    // la zone réservée   
    fread (&temp,4,1,fichier);    // l'offset   
    bmp->offset = conv (temp,4);    // que l'on converti aussi
    fread (&temp,4,1,fichier);    // taille de la zone info   
    bmp->info = conv (temp,4);
    fread (&temp,4,1,fichier);    // la largeur de l'image   
    bmp->largeur = conv(temp,4);
    fread (&temp,4,1,fichier);    // la hauteur de l'image   
    bmp->longueur = conv(temp,4);
    fread (&temp,2,1,fichier);    // le nombre d'info   
    bmp->nbplan = conv (temp,2);  
    fread (&temp,2,1,fichier);    // le mode d'affichage   
    bmp->bppixel = conv (temp,2); 
    fread (&temp,4,1,fichier);    // le format de compression   
    bmp->comp = conv (temp,4);    
    fread (&temp,4,1,fichier);    // la taille de l'image   
    bmp->tim = conv (temp,4);
    fread (&temp,4,1,fichier);    // les résolutions horizontale
    bmp->Hres = conv (temp,4);    // et verticale
    fread (&temp,4,1,fichier);       
    bmp->Vres = conv (temp,4);
    fread (&temp,4,1,fichier);       
    bmp->nbco = conv (temp,4);    // nbre de couleurs utilisées
    fread (&temp,4,1,fichier);       
    bmp->impco = conv (temp,4);    // nbre de couleurs importantes
    fclose (fichier);        // on ferme le fichier
    bmp->pixel=(unsigned char*)malloc(sizeof(bmp->taille));
    fread(bmp->pixel,1,bmp->taille,fichier);
    return bmp;        // on retourne le pointeur sur la structure bitmap
}

int conv (unsigned char hex[4],int nb)
{
    int res=0,i;
    for (i=nb-1;i>=0;i--)res=res*256+hex[i];
    return res;
}
Ce que me gène est l'instruction:
    for(i=0;i<10304;i++)

    {

        a=*(bmp->pixel)++;

        vect[i]=a;

    }
Je sais pas si c vraiment correcte ou pas
et si non comment je puisse la corriger.
merci

5 réponses

Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
20 avril 2009 à 09:31
Salut
Tu peux simplement ouvrir une image en utilisant la fonction win32  LoadImage.
Tu as plein d'exemple de son utilisation dans mes sources.
Cependant, si tu tiens vraiment à lire ton fichier toi même, regarde la très bonne source de buno:
http://www.cppfrance.com/codes/LOADER-BMP-TRAITEMENT_33150.aspx
A+
____________________________________________________________________________
Mon site internet :  
2
BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 103
20 avril 2009 à 09:49
Hello,
Pour des exemples d'ouverture de fichiers BMP, regarde dans mes sources ou bien celles de PistolPete

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
0
waffouna Messages postés 5 Date d'inscription samedi 11 avril 2009 Statut Membre Dernière intervention 27 avril 2009
26 avril 2009 à 08:57
Salut
vraiment,je me sens bloquée, j'ai besoin d'un code correcte pour lire un fichier bmp (image en niveau de gris).
Je veux bien stocker les intensités dans un vecteur .
J'ai essayé un code.Il m'affiche des valeurs (comprises de 0 à 255)..J'étais trop satisfaite et j'ai cru que ça soit le bon résultat.
Je me suis avancée dans la programmation..
Et j'ai remarqué que les résultats sont les mêmes pour n'importe quelle image..
J'ai rien compris et j'ai besoin de vos aides.
la programmation est uniquement en langage C (et pas C++).
Merci
0
flamt Messages postés 19 Date d'inscription mardi 11 mars 2003 Statut Membre Dernière intervention 21 mai 2010
25 juin 2009 à 09:10
si tu en as toujours besoins, j'ai un copain qui m'avais passé ce bout de code pour un projet:

    FILE * in=fopen("photo2.bmp","r");
    FILE * out=fopen("photo3.bmp","w");
    unsigned int N,lg,lrg,pix;
    int i,j;

    char s[3]="";
    // Les lettres BM
    fread(s,1,2,in); puts(s);fwrite(s,1,2,out);
    // La taille du fichier, 4 octets reserves, Offset de l'image
    fread(&N,4,1,in);printf("La taille du fichier est : %u\n",N);fwrite(&N,4,1,out);
    fread(&N,4,1,in);printf("Reserve : %u\n",N);;fwrite(&N,4,1,out);
    fread(&N,4,1,in);printf("Offset de l'image : %u\n",N);;fwrite(&N,4,1,out);
    // taille de l'entête, largeur de l'image, hauteur de l'image
    fread(&N,4,1,in);printf("taille de l'entete : %u\n",N);fwrite(&N,4,1,out);

    fread(&lrg,4,1,in);printf("largeur de l'image : %u\n",lrg);    fwrite(&lrg,4,1,out);
    fread(&lg,4,1,in);printf("hauteur de l'image : %u\n",lg);    fwrite(&lg,4,1,out);

    // Nombre de plans, Nombre de bits par pixel, Methode de compression, Taille de l'image
    fread(&N,2,1,in);printf("Nombre de plans utilises : %u\n",N);  fwrite(&N,2,1,out);

    fread(&pix,2,1,in);printf("Nombre de bits par pixel : %u\n",N);    fwrite(&pix,2,1,out);
    fread(&N,4,1,in);printf("Methode de compression : %u\n",N);    fwrite(&N,4,1,out);
    fread(&N,4,1,in);printf("Taille de l'image : %u\n",N);fwrite(&N,4,1,out);
    // Résolution horizontale, verticale, couleurs utilisées, nombre de couleurs
    fread(&N,4,1,in);printf("Resolution horizontale : %u\n",N);    fwrite(&N,4,1,out);
    fread(&N,4,1,in);printf("Resolution verticale : %u\n",N);    fwrite(&N,4,1,out);
    fread(&N,4,1,in);printf("Couleurs utilisées : %u palette\n",N);    fwrite(&N,4,1,out);
    fread(&N,4,1,in);printf("Nombre de Couleurs  : %u\n",N);fwrite(&N,4,1,out);

     unsigned int mat1[lg][lrg];
     unsigned int mat2[lg][lrg];

                // on charge l'image en memoire dans tabO

    for (i=lg;i>0;i--)
    {
        for (j=lrg;j>lrg;j--)
        {
               fread(&mat1[i][j],1,1,in);
               fwrite(&mat1[i][j],1,1,out);
        }
    }

    fclose(in);
    fclose(out);

Je n'ai  jamais réussis a le faire marcher : D (pratique l'aide) mais je crois que c'est juste une petite erreur a trouver. (d'ailleurs si un petit génie la trouve j'en serais ravis)
c'est pratique de pouvoir lire des bitmap avec un petit programme portable et juste écris en C.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
nduriri Messages postés 4 Date d'inscription dimanche 17 octobre 2010 Statut Membre Dernière intervention 17 octobre 2010
17 oct. 2010 à 12:31
Comment écrire et lire un fichier bmp en C++? voir les sources en C++ sur
www.gravitomagnetism.com en bas de page d'accueil.
c'est facile!
0
Rejoignez-nous