OVH Cloud OVH Cloud

Problème de lecture d'un fichier binaire BMP

5 réponses
Avatar
Etienne Baudin
Bonjour,

je suis en train de faire une méthode qui récupère le contenu d'un fichier
bmp 24 bits, et je rencontre un problème de lecture. En fait, la fonction
eof() passe à 1 avant la fin prévue du fichier. Exemple, pour une image de
256*256, lorsque je me décale de la taille du header (environ 54 octets) et
que je compte les pixels en faisant des itérations sur des groupes de 3
octets, la boucle de lecture se termine avec un nombre de pixels traités de
64022 (de mémoire) au lieu de 655536 (256², à +-1....).

Merci de jeter un oeil au code.
Etienne.

Voici mon code :

void image::getBMPImage(char * nomFichier)
{

ifstream iFile(nomFichier, ios::in | ios::binary);

//on se place dans le header ou la reso horizontale est inscrite
iFile.seekg(0x12);

... //on la récupère,

// idem pour la reso verticale
iFile.seekg(0x16);
...

tailleImage = resolutionH * resolutionV;
data = new pixel[tailleImage];

// on se place au début des données "utiles"
iFile.seekg(0x36);

noPixel = 0;

do
{
iFile >> data[noPixel].B;
iFile >> data[noPixel].G;
iFile >> data[noPixel].R;
noPixel++;
}
while (!iFile.eof());
cout << noPixel << '\n';

iFile.close();
}

5 réponses

Avatar
Etienne Baudin
do
{
iFile >> data[noPixel].B;
iFile >> data[noPixel].G;
iFile >> data[noPixel].R;
noPixel++;
}
while (!iFile.eof());


J'ai raffiné un peu le problème : à chaque tour de boucle, le curseur,
obtenu avec la méthode tellg(), s'incrémente parfois plus de 3 (4 ou 5, je
rapelle qu'on lit des données de type unsigned char). Le problème se résume
donc, pourquoi certains "caractères" du fichiers semblent être zappés par
l'opérateur '>>' ? (caractères spéciaux ?) L'utilisation du type unsigned
char pour des données binaires (composantes RGB) est-elle adaptée ?

Merci,
Etienne

Avatar
Etienne Baudin
do
{
iFile >> data[noPixel].B;
iFile >> data[noPixel].G;
iFile >> data[noPixel].R;
noPixel++;
}
while (!iFile.eof());


J'ai raffiné un peu le problème : à chaque tour de boucle, le curseur,
obtenu avec la méthode tellg(), s'incrémente parfois plus de 3 (4 ou 5, je
rapelle qu'on lit des données de type unsigned char). Le problème se résume
donc, pourquoi certains "caractères" du fichiers semblent être zappés par
l'opérateur '>>' ? (caractères spéciaux ?) L'utilisation du type unsigned
char pour des données binaires (composantes RGB) est-elle adaptée ?

Merci,
Etienne

Avatar
Fabien LE LEZ
On Thu, 4 Nov 2004 20:24:17 +0100, "Etienne Baudin"
:

iFile >> data[noPixel].B;


Franchement, je suis très dubitatif quant à l'usage de ">>" pour des
données binaires[*].



[*] En fait, je suis très dubitatif quant à l'usage de ">>" en
général, mais c'est un autre problème.


--
;-)

Avatar
David
do
{
iFile >> data[noPixel].B;
iFile >> data[noPixel].G;
iFile >> data[noPixel].R;
noPixel++;
}
while (!iFile.eof());
cout << noPixel << 'n';

iFile.close();
}


Les opérateurs >> sont fait pour les lectures formattées.
Pour les lectures non formattées, il faut utiliser read par exemple.

J'hésite à faire un exemple ... alors disons qu'il ne fait que lire
des données binaires sur sizeof int octets.

// -------------------------------------------
#include <iostream>
#include <fstream>
#include <iomanip>
using namespace std;

int main( int, char*argv[] )
{
ifstream file( argv[1], ios::in | ios::binary );

int valeur = 0;
while( file.read( (char*)&valeur, sizeof( valeur ) ) )
cout << hex << valeur << endl;
}

Avatar
Etienne Baudin
Les opérateurs >> sont fait pour les lectures formattées.
Pour les lectures non formattées, il faut utiliser read par exemple.

J'hésite à faire un exemple ... alors disons qu'il ne fait que lire
....


Parfais ! Merci pour ces réponses.