Probleme de lecture de BMP

Signaler
Messages postés
2
Date d'inscription
mardi 14 juin 2005
Statut
Membre
Dernière intervention
20 juin 2005
-
Messages postés
7
Date d'inscription
lundi 6 décembre 2004
Statut
Membre
Dernière intervention
23 décembre 2005
-
Bonjour à tous, j'ai un probleme :

je souhaite lire des fichier BMP, je n'ai aucun probleme pour lire les entetes, mais dès que je veux lire les données de l'image, je n'ai plus rien. Voici mon code. Pouvez vous m'aider???

/******************************************/
/****** Définition (h) ********/
#include

#include <fstream>

using
namespace std;


class BitMap
{

public:
BitMap(){};
~BitMap(){};

void LoadPic (
char* fileName);

void SavePic (
char* fileName);


protected:

class cHeaderFile
{

public :

char Type1;

char Type2;

unsigned
long FicSize;

unsigned
long Reserved;

unsigned
long DataOffset;
};
cHeaderFile HeaderFile;



/* Classe de l'entete de l'image */
class cHeaderPic
{

public:

unsigned
long HeaderPicSize;

long PicWidth;

long PicHeight;

unsigned
short Plan;

unsigned
short Depth;

unsigned
long Compression;

unsigned
long PicSize;

unsigned
long ResolHori;

unsigned
long ResolVerti;

unsigned
long NbColors;

unsigned
long NbColorsMain;
};
cHeaderPic HeaderPic;

char* Data;
};
/**********************************************/
/* Implementation (cpp) */


#include "Lecture.h"


void
BitMap::LoadPic (
char* fileName)
{
ifstream File (fileName, ios::in | ios::binary);

if (!File.is_open())
{
}

else
{

/* Lecture de l'entete du fichier : 14 octets */
File.read((
char *)&HeaderFile.Type1,
sizeof(
char) );
// Type du fichier : 1 octet
File.read((
char *)&HeaderFile.Type2,
sizeof(
char) );
// Type du fichier : 1 octet
File.read((
char *)&HeaderFile.FicSize,
sizeof(HeaderFile.FicSize) );
// Taille du fichier : 4 octets
File.read((
char *)&HeaderFile.Reserved,
sizeof(HeaderFile.Reserved) );
// Champ réservé : 4 octets
File.read((
char *)&HeaderFile.DataOffset,
sizeof(HeaderFile.DataOffset) );
//Décalage offset de l'image : 4 octets



/* Lecture de l'entete de l'image : 40 octets */
File.read((
char *)&HeaderPic.HeaderPicSize,
sizeof(HeaderPic.HeaderPicSize));
File.read((
char *)&HeaderPic.PicWidth,
sizeof(HeaderPic.PicWidth));
File.read((
char *)&HeaderPic.PicHeight,
sizeof(HeaderPic.PicHeight ));
File.read((
char *)&HeaderPic.Plan,
sizeof(HeaderPic.Plan ));
File.read((
char *)&HeaderPic.Depth,
sizeof(HeaderPic.Depth ));
File.read((
char *)&HeaderPic.Compression,
sizeof(HeaderPic.Compression ));
File.read((
char *)&HeaderPic.PicSize,
sizeof(HeaderPic.PicSize ));
File.read((
char *)&HeaderPic.ResolHori,
sizeof(HeaderPic.ResolHori ));
File.read((
char *)&HeaderPic.ResolVerti,
sizeof(HeaderPic.ResolVerti ));
File.read((
char *)&HeaderPic.NbColors,
sizeof(HeaderPic.NbColors ));
File.read((
char *)&HeaderPic.NbColorsMain,
sizeof(HeaderPic.NbColorsMain ));



/* Lecture de l'image */
Data = (char*)malloc( HeaderPic.PicSize );
File.read((
char *)&Data,
sizeof(Data));
}
File.close();
};



/************************/

4 réponses

Messages postés
26
Date d'inscription
lundi 4 octobre 2004
Statut
Membre
Dernière intervention
20 juin 2005

Salut,

Désolé, j'ai pas trop le temps de tester et je ne connais pas bien les
bitmaps, mais je sais que j ai une fois traduit en delphi le code
suivant http://www.cppfrance.com/code.aspx?id=21395

( c'est de la stéganographie donc il y a traitement du corps de l'image
) et je ne me rappelle pas qu'il ait été compliqué du tout, tout a
fonctionné impec alors j'espère qu'en calquant dessus vous vous en
sortirez !



@+

Cornell.
Messages postés
7
Date d'inscription
lundi 6 décembre 2004
Statut
Membre
Dernière intervention
23 décembre 2005

Salut,

Data = (char*)malloc( HeaderPic.PicSize );
File.read((
char *)&Data,
sizeof(Data));

sizeof(Data) = 4
tu lis 4 octets seulement et non pas toutes les datas de ton image
Le sizeof que tu fais est sur le pointeur de Data, il faut mettre
HeaderPic.PicSize * sizeof(char) ou tout simplement HeaderPic.PicSize
Messages postés
1329
Date d'inscription
vendredi 15 août 2003
Statut
Membre
Dernière intervention
16 juin 2010
2
"HeaderPic.PicSize * sizeof(char) ou tout simplement HeaderPic.PicSize"

-> t'es sur que c'est équivalent?


_______________________


Omnia vincit labor improbus
Messages postés
7
Date d'inscription
lundi 6 décembre 2004
Statut
Membre
Dernière intervention
23 décembre 2005

typedef struct tagBITMAPINFOHEADER{ // bmih 
    DWORD  biSize; 
    LONG   biWidth; 
    LONG   biHeight; 
    WORD   biPlanes; 
    WORD   biBitCount 
    DWORD  biCompression; 
    DWORD  biSizeImage; 
    LONG   biXPelsPerMeter; 
    LONG   biYPelsPerMeter; 
    DWORD  biClrUsed; 
    DWORD  biClrImportant; 
} BITMAPINFOHEADER; 
 
<DT>biSizeImage <DD>Specifies the size, in bytes, of the image. This may be set to zero for BI_RGB bitmaps.

sizeof(char)=1 sous vc++  alors HeaderPic.PicSize * sizeof(char) != HeaderPic.PicSize ?
On m'aurait menti? ^^

</DD>