Probleme de lecture de BMP

handmousemaster Messages postés 2 Date d'inscription mardi 14 juin 2005 Statut Membre Dernière intervention 20 juin 2005 - 20 juin 2005 à 11:35
cs_CurieuxDeSavoir Messages postés 7 Date d'inscription lundi 6 décembre 2004 Statut Membre Dernière intervention 23 décembre 2005 - 22 juin 2005 à 09:06
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

Cornell711 Messages postés 26 Date d'inscription lundi 4 octobre 2004 Statut Membre Dernière intervention 20 juin 2005
20 juin 2005 à 13:44
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.
0
cs_CurieuxDeSavoir Messages postés 7 Date d'inscription lundi 6 décembre 2004 Statut Membre Dernière intervention 23 décembre 2005
21 juin 2005 à 13:59
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
0
Arnaud16022 Messages postés 1329 Date d'inscription vendredi 15 août 2003 Statut Membre Dernière intervention 16 juin 2010 2
21 juin 2005 à 20:22
"HeaderPic.PicSize * sizeof(char) ou tout simplement HeaderPic.PicSize"

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


_______________________


Omnia vincit labor improbus
0
cs_CurieuxDeSavoir Messages postés 7 Date d'inscription lundi 6 décembre 2004 Statut Membre Dernière intervention 23 décembre 2005
22 juin 2005 à 09:06
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>
0
Rejoignez-nous