Lecture d'un fichier Bmp (image en niveau de gris) et affichage des valeurs des
waffouna
Messages postés5Date d'inscriptionsamedi 11 avril 2009StatutMembreDernière intervention27 avril 2009
-
19 avril 2009 à 21:21
nduriri
Messages postés4Date d'inscriptiondimanche 17 octobre 2010StatutMembreDernière intervention17 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
Pistol_Pete
Messages postés1054Date d'inscriptionsamedi 2 octobre 2004StatutMembreDernière intervention 9 juillet 20137 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 :
waffouna
Messages postés5Date d'inscriptionsamedi 11 avril 2009StatutMembreDernière intervention27 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
flamt
Messages postés19Date d'inscriptionmardi 11 mars 2003StatutMembreDernière intervention21 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);
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.
Vous n’avez pas trouvé la réponse que vous recherchez ?