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

Messages postés
5
Date d'inscription
samedi 11 avril 2009
Statut
Membre
Dernière intervention
27 avril 2009
- - Dernière réponse : 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
Afficher la suite 

5 réponses

Meilleure réponse
Messages postés
1054
Date d'inscription
samedi 2 octobre 2004
Statut
Membre
Dernière intervention
9 juillet 2013
6
2
Merci
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 :  

Dire « Merci » 2

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 137 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Pistol_Pete
Messages postés
14708
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
16 janvier 2020
90
0
Merci
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...
Commenter la réponse de BunoCS
Messages postés
5
Date d'inscription
samedi 11 avril 2009
Statut
Membre
Dernière intervention
27 avril 2009
0
Merci
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
Commenter la réponse de waffouna
Messages postés
19
Date d'inscription
mardi 11 mars 2003
Statut
Membre
Dernière intervention
21 mai 2010
0
Merci
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.
Commenter la réponse de flamt
Messages postés
4
Date d'inscription
dimanche 17 octobre 2010
Statut
Membre
Dernière intervention
17 octobre 2010
0
Merci
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!
Commenter la réponse de nduriri