Traiter une bitmap

Résolu
hardos1986 Messages postés 9 Date d'inscription mercredi 5 janvier 2005 Statut Membre Dernière intervention 9 mai 2005 - 5 mai 2005 à 05:29
cs_______ Messages postés 6 Date d'inscription dimanche 25 avril 2004 Statut Membre Dernière intervention 9 mai 2005 - 9 mai 2005 à 23:24
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

vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
6 mai 2005 à 11:11
cout<<(unsigned int)pixel[i]<<endl;



affichera des valeurs entre 0 et 255
3
cs_LordBob Messages postés 2865 Date d'inscription samedi 2 novembre 2002 Statut Membre Dernière intervention 11 mai 2009 9
5 mai 2005 à 09:35
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..."
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
5 mai 2005 à 11:26
Malheuresement la plupart ds codes sur ce sujet utilisent les API Win32, ca n'a pas l'air d'être le cas de hardos.
0
cs_LordBob Messages postés 2865 Date d'inscription samedi 2 novembre 2002 Statut Membre Dernière intervention 11 mai 2009 9
5 mai 2005 à 12:50
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..."
0

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

Posez votre question
hardos1986 Messages postés 9 Date d'inscription mercredi 5 janvier 2005 Statut Membre Dernière intervention 9 mai 2005
5 mai 2005 à 14:46
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
0
hardos1986 Messages postés 9 Date d'inscription mercredi 5 janvier 2005 Statut Membre Dernière intervention 9 mai 2005
5 mai 2005 à 21:06
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
0
cs_LordBob Messages postés 2865 Date d'inscription samedi 2 novembre 2002 Statut Membre Dernière intervention 11 mai 2009 9
6 mai 2005 à 01:09
c'est normal car en fait tu affiches la valeurs ASCII du pixel lu !
Bob...

"La chance accorde ses faveur aux esprits avertis..."
0
hardos1986 Messages postés 9 Date d'inscription mercredi 5 janvier 2005 Statut Membre Dernière intervention 9 mai 2005
7 mai 2005 à 02:54
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 ?
0
hardos1986 Messages postés 9 Date d'inscription mercredi 5 janvier 2005 Statut Membre Dernière intervention 9 mai 2005
7 mai 2005 à 03:13
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 ?
0
cs_______ Messages postés 6 Date d'inscription dimanche 25 avril 2004 Statut Membre Dernière intervention 9 mai 2005
8 mai 2005 à 16:41
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]);
0
cs_______ Messages postés 6 Date d'inscription dimanche 25 avril 2004 Statut Membre Dernière intervention 9 mai 2005
8 mai 2005 à 16:44
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]);
0
hardos1986 Messages postés 9 Date d'inscription mercredi 5 janvier 2005 Statut Membre Dernière intervention 9 mai 2005
9 mai 2005 à 21:21
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 ??
0
cs_______ Messages postés 6 Date d'inscription dimanche 25 avril 2004 Statut Membre Dernière intervention 9 mai 2005
9 mai 2005 à 23:24
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.
0
Rejoignez-nous