Traiter une bitmap [Résolu]

Signaler
Messages postés
9
Date d'inscription
mercredi 5 janvier 2005
Statut
Membre
Dernière intervention
9 mai 2005
-
Messages postés
6
Date d'inscription
dimanche 25 avril 2004
Statut
Membre
Dernière intervention
9 mai 2005
-
Salut je suis au board du desspoir je cherche deseperement a recupere les pixels d'un fichier bitmap mais en vain jai fait la boucle suivante mais ca ne donne pas du tout le resulat escompté :
for(i=0;i<20;i++)


{





for(j=0;j<20;j++)


{


a.Set(fgetc(image),i,j);


cout<<a.Get(i,j)<<" ";


}


}

ets ce qqun saurait comment recupere l'information contenue ds ces pixels sachant que je travaille sur une bmp nivo gris 20x20 donc a priori ca devrait eter simple .

J'ai essayé de voir les librairies de msdn mais je susi perdu la dedans je viens tout juste de debuter en c++ et la ca fait vraiment 1 semaine que je suis bloké dessus.

merci d'avance

13 réponses

Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
cout<<(unsigned int)pixel[i]<<endl;



affichera des valeurs entre 0 et 255
Messages postés
2865
Date d'inscription
samedi 2 novembre 2002
Statut
Membre
Dernière intervention
11 mai 2009
10
tu lis ton images comme ca? au cas ou tu ne le saurais pas une image bitmap comme toutes les images est composé en gros de deux parties:
=> une en-tête
=> un partie "pixel"

donc si tu lis ton images comme ca, tu lis toutes l'en-tête est une partie des pixels !
sinon regarde sur le site il me semble qu'il y avait une source qui expliquer bien de la structure d'un fichier bitmap...
Bob...

"La chance accorde ses faveur aux esprits avertis..."
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Malheuresement la plupart ds codes sur ce sujet utilisent les API Win32, ca n'a pas l'air d'être le cas de hardos.
Messages postés
2865
Date d'inscription
samedi 2 novembre 2002
Statut
Membre
Dernière intervention
11 mai 2009
10
regarde cette source, elle pourrat peut etre t'interressé:
http://www.cppfrance.com/code.aspx?ID=23273
Bob...

"La chance accorde ses faveur aux esprits avertis..."
Messages postés
9
Date d'inscription
mercredi 5 janvier 2005
Statut
Membre
Dernière intervention
9 mai 2005

En effet je ne desire pas afficher la bitmap je veux juste lui appliquer un filtre gaussien par consequent je n'utlise pas les api win32 dont d'ailleurs je n'ai aucune notion

Merci pour vos reponses je vais regaerder de près le lien que tu m'a filé LordBob
Messages postés
9
Date d'inscription
mercredi 5 janvier 2005
Statut
Membre
Dernière intervention
9 mai 2005

bon apres moultes recherches jai pondu le code suivant :


void
Entete()


{




BITMAPFILEHEADER bmfh;


BITMAPINFOHEADER bmih;


Image a;


int i,j;






FILE *image;


unsigned char* mem;


mem = (unsigned char*)malloc(2);


char nom[50]="test.bmp";












while((image=fopen(nom,"rb"))==NULL)


{


coutnom;


}






fread(mem, 2, 1, image) ;


fseek(image, SEEK_SET, 0) ;


fread(&bmfh, sizeof(bmfh), 1, image) ;




while(bmfh.bfType!=19778)


{


coutnom;


image=fopen(nom,"rb");


fread(mem, 2, 1, image) ;


fseek(image, SEEK_SET, 0) ;


fread(&bmfh, sizeof(bmfh), 1, image) ;




}


cout
Messages postés
2865
Date d'inscription
samedi 2 novembre 2002
Statut
Membre
Dernière intervention
11 mai 2009
10
c'est normal car en fait tu affiches la valeurs ASCII du pixel lu !
Bob...

"La chance accorde ses faveur aux esprits avertis..."
Messages postés
9
Date d'inscription
mercredi 5 janvier 2005
Statut
Membre
Dernière intervention
9 mai 2005

Merci ca affiche bien des valeurs entre 0 et 255 mais le probleme c que quand je crée une bitmap monochrome ac Paint, la taille de celle ci est de 142 octets alors que l'image fait 20*20 donc normalent l'image devrait faire minimum 400 octets non ?
C'est pour ca qu'en affichant les infos du header et j'ai vu qu'en fait l'image prenait 80 octets et le header 62 octets.
Je suis un peu perdu car comment traiter 400 pixels un par un si ces derniers sont contenus dans 80 octets ?
Est ce Paint qui effectue une compression de l'image automatiquement ?
Messages postés
9
Date d'inscription
mercredi 5 janvier 2005
Statut
Membre
Dernière intervention
9 mai 2005

Merci ca affiche bien des valeurs entre 0 et 255 mais le probleme c que quand je crée une bitmap monochrome ac Paint, la taille de celle ci est de 142 octets alors que l'image fait 20*20 donc normalent l'image devrait faire minimum 400 octets non ?
C'est pour ca qu'en affichant les infos du header et j'ai vu qu'en fait l'image prenait 80 octets et le header 62 octets.
Je suis un peu perdu car comment traiter 400 pixels un par un si ces derniers sont contenus dans 80 octets ?
Est ce Paint qui effectue une compression de l'image automatiquement ?
Messages postés
6
Date d'inscription
dimanche 25 avril 2004
Statut
Membre
Dernière intervention
9 mai 2005

Persinnelement jutilise cette methodee et ça marche trés bien:

int width; //largeur de l'image en pixel
int height; //hauteur de l'image en pixel
unsigned int biBitCount; //nombre de bit par pixel
unsigned int bfOffBits; //décalage en octets des informations de l'image par rapport au début.


char * data; // la donnée (Pixel)
FILE * f;
f= fopen( name, "r" );

fseek(f,10,0);
fread(bfOffBits,4,1,f);

fseek(f,18,0);
fread(width,4,1,f);

fseek(f,22,0);
fread(height,4,1,f);

fseek(f,28,0);
fread(biBitCount,2,1,f);

fseek(f,bfOffBits,0);

int j=width *height *biBitCount/8;

data= new char[j];

fread(data,j,1,f);
fclose( f );

aprés vous pouvez accéder à data
comme un tableau de char .

exemple:

for(int i=0 ;i<width *height *biBitCount/8 ; i++) printf("data[%d] = %c\n", i ,data[i]);
Messages postés
6
Date d'inscription
dimanche 25 avril 2004
Statut
Membre
Dernière intervention
9 mai 2005

Personnelement j'utilise cette méthode et ça marche trés bien:

int width; //largeur de l'image en pixel
int height; //hauteur de l'image en pixel
unsigned int biBitCount; //nombre de bit par pixel
unsigned int bfOffBits; //décalage en octets des informations de l'image par rapport au début.


char * data; // la donnée (Pixel)
FILE * f;
f= fopen( name, "r" );

fseek(f,10,0);
fread(bfOffBits,4,1,f);

fseek(f,18,0);
fread(width,4,1,f);

fseek(f,22,0);
fread(height,4,1,f);

fseek(f,28,0);
fread(biBitCount,2,1,f);

fseek(f,bfOffBits,0);

int j=width *height *biBitCount/8;

data= new char[j];

fread(data,j,1,f);
fclose( f );

aprés vous pouvez accéder à data
comme un tableau de char .

exemple:

for(int i=0 ;i<width *height *biBitCount/8 ; i++) printf("data[%d] = %c\n", i ,data[i]);
Messages postés
9
Date d'inscription
mercredi 5 janvier 2005
Statut
Membre
Dernière intervention
9 mai 2005

je ne comprends pas pkoi tu divises par 8 :

int j=width *height *biBitCount/8;

par contre persone ma encore dit pkoi jai une image de 142 octets alors que la resolution choisie est de 20*20 pixels soit 400 pixels soit 400 octets ??
Messages postés
6
Date d'inscription
dimanche 25 avril 2004
Statut
Membre
Dernière intervention
9 mai 2005

je divise par 8, tout simplement parsque biBitCount me donne
nombre de bit par pixel, or pour faire une allocation de memoire ou pour traiter la donnée comme un tableau de caractaire j'ai besoin du nombre d'octet, ce qui revient à diviser le nombre de bit par 8.

pour la taillle de l'image , quel codage de couleur vous utilisez (RVB, 16couleurs ou 256couleurs)
il se peut que vous utilisez 16 couleurs dans ce cas un pixel n'est pas codé sur un octet mais sur 4 bits (octet/2), => ce n'est plus 400 octets.