A.P.C.
Les fichiers BMP
Comme vous le savez, pour afficher une image en mode graphique, vous devez écrire dans la mémoire vidéo, pour chaque byte de l’image, le numéro de la couleur de la palette. En ce qui concerne les fichiers BitMaP, c’est la copie conforme de la mémoire vidéo (juste après le header du fichier). Ces fichiers sont donc les plus pratique pour afficher une image graphique à l’écran. Mais avant cela, nous allons découvrire ce qui se cache dans le header des fichiers BMP, qui permettra d’afficher correctement l’image.
En fait, dans le header du fichier, se cache plusieurs header que je vais vous détailler ci-dessous.
Header du fichier :
Nom |
Taille |
Description |
FileType |
1 Word |
« BM » : signature du fichier |
Filesize |
1 Double Word |
Taille du fichier |
Reserved |
1 Double Word |
Toujours à 0 : réservé |
BitMapOffset |
1 Double Word |
Offset de l’image à partir du début du fichier |
Header du BitMaP :
Nom |
Taille |
Description |
HeaderSize |
1 Double Word |
Taille de l’en-tête en octets |
Width |
1 Double Word |
Largeur en pixel de l’image |
Height |
1 Double Word |
Hauteur en pixel de l’image |
Planes |
1 Word |
Nombre de plans utilisés (normalement à 1) |
BitsPerPixel |
1 Word |
Nombre de bits par pixel |
Compression |
1 Double Word |
Méthode de compression (cf. plus loin) |
SizeOfBitMap |
1 Double Word |
Taille de l’image en octets |
HorzResolution |
1 Double Word |
Résolution horizontale en pixels |
VertResolution |
1 Double Word |
Résolution verticale en pixel |
ColorsUsed |
1 Double Word |
Nombre de couleur dans la palette Si 0 : palette entière utilisée |
ColorsImportant |
1 Double Word |
Nombre de couleurs importantes |
(Si Height prend une valeur négative (ce qui est très rare), c’est que l’image n’est pas retournée cf. plus loin)
Masque pour les modes de plus de 8-Bits par
pixels :
Nom |
Taille |
RedMask |
1 Double Word |
GreenMask |
1 Double Word |
BlueMask |
1 Double Word |
AlphaMask |
1 Double Word |
ColorSpaceType |
1 Double Word |
RedX |
1 Double Word |
RedY |
1 Double Word |
RedZ |
1 Double Word |
GreenX |
1 Double Word |
GreenY |
1 Double Word |
GreenZ |
1 Double Word |
BlueX |
1 Double Word |
BlueY |
1 Double Word |
BlueZ |
1 Double Word |
GammaRed |
1 Double Word |
GammaGreen |
1 Double Word |
GammaBlue |
1 Double Word |
XxxMask informe de la répartition en rouge, vert, bleu et alpha sur les bits pour chacun des pixels. Par exemple, une image dont les bits sont répartis en RVB555 aurait les champs suivants en binaire :
AlplhaMask = 1111 1000 0000 0000 0000 0000 0000 0000
RedMask =
0000 0111 1100 0000 0000 0000 0000 0000
GreenMask = 0000 0000 0011 1110 0000 0000 0000 0000
BlueMask = 0000 0000 0000 0001 1111 0000 0000 0000
Les derniers champs sont utilisés essentiellement par Windows, qui permettent l’application de masques divers dont je ne connais pas es effets. Ils ne sont pas utilisés par les images d’au plus 8-Bits par pixel. Ces champs n’empêcheront pas l’affichage de notre image.
La palette :
Après tous ces en-têtes, vous devriez trouver la palette de couleur qui permettra de voir notre image dans les bonnes couleurs. Pour les images avec plus de 8-Bits par couleur, vous n’avez pas besoin de cette palette (cf. plus loin). Chaque couleur de la palette est codée sur 4 octets : bleu, vert, rouge et alpha. Il faudra faire attention au sens du codage : c’est BVR et non RVB comme attend le contrôleur DAC de la carte vidéo !!! De plus, ces couleurs sont codées sur 8-Bits et non 6. Pour les versions des fichiers BMP inférieur au 3.0, cette palette est codée sur 3octet : alpha n’existe pas. Vous pourrez le savoir en vous référant à la taille du header du BitMap si sera alors plus petite.
Le BitMap :
Après tout cela, vous trouverez enfin votre image. Il faut faire attention car l’image en renversé : la dernière ligne de pixel de votre image se trouvera au début, la deuxième ligne en partant de la fin, a la suite, etc. Et donc la première ligne de votre image se trouvera à la fin du fichier. La largeur de l’image en octets est toujours un multiple de 4 ; si ce n’est pas ça, la fin de chaque ligne est complétée par des 0. Les pixels sont stoqués bits à bits : par exemple en 16 couleurs, un octet contient 2 pixels.
Donc pour visualiser votre image, vous devez aller chercher la dernière ligne du fichier qui est, en fait, la première ligne de l’image, puis l’envoyer tel quel au début de la mémoire vidéo. Ensuite, vous allez chercher l’avant dernière, vous l’envoyer dans la mémoire vidéo à la suite de la première, puis etc. jusqu'à la dernière ligne de votre image.
Les images avec plus de 8-Bits par couleur :
Pour ces images, la mémoire vidéo attend non pas un numéro de couleur se référant à la palette de couleur de la carte vidéo, mais directement le taux de bleu, vert, rouge. Cependant, suivant le nombre de bits par couleur, ce nombre se présente sous différente forme. Par exemple, en 24-Bits, les couleurs sont codées directement sur 3 octets : bleu, vert, rouge.
Mais de toute manière, vous n’avez besoin de savoir cela pour connaître la longueur d’une ligne, car vous n’avez juste qu’a copier directement la ligne dans la mémoire, tout est déjà fait.
La compression du BitMap :
Dès fois, votre image peut être compressée (ce qui est rare), ce qui permet de gagner de la place. Pour le savoir, il suffit de se référer au header à l’endroit intitulé « Compression ».
Ce champ peut avoir les valeurs suivantes :
0 : pas de compression
1 : 8-Bits run lenght encoding
2 : 4-Bits run length encoding
3 : bitfield encoding
Run
length encoding :
Cela consiste tout simplement à coder les répétitions d’un même pixel : un premier octet indique le nombre de caractère à copier, et le second, le caractère à copier. Si un même n’est répété au moins trois fois, alors la suite d’octets n’est pas codée : ceci est indiqué par un 00 suivi de la longueur de la suite. Si cette longueur est impaire, un autre 00 est ajouté à la fin.
Exemple :
10 10 10 10 10 est codé 05 10
0A 0A 0A 0A 0A 0A 0A 0A 0A 0A est codé 0A 0A
23 65 55 34 22 est codé 00 05 23 65 55 34 22 00
10 10 89 23 est codé 00 04 10 10 89 23
Il existe 3 autre code :
- 00 00 : indique la fin d’une ligne
- 00 01 : indique la fin du BitMap
- 00 02 XX YY : déplacement du pointeur actuel dans l’image de XX colonnes et YY lignes dans le sens de la progression actuelle. Ce code n’est quasiment pas utilisé, sauf par Windows pour le codage des icônes.
04 45 : quatres pixels de valeur 45 décodage : 45 45 45 45
00 02 04 05 : Déplace le curseur (4, 5) aucun décodage
00 01 : Fin du BitMap aucun décodage
00 03 34 23 FF : Trois pixels décodage : 34 23 FF
00 00 : Fin de ligne aucun décodage
03 F9 : Trois pixels de valeur F9 décodage : F9 F9 F9
Le Run Lenght Encoding 4-Bits est très proche de celui-ci, à la différence près que chaque pixel dupliqué est représenté par 4-Bits :
Exemple :
04 16 : 4 pixels alternant 1 et 6 décodage 1 6 1 6 1 6 1 6
08 44 : 8 pixels alternant 4 et 4 décodage 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
00 00 : Fin de ligne aucun décodage
00 06 12 A4 46 : Suite de 6 pixels décodage 1 2 A 4 4 6
00 01 : Fin du BitMap aucun décodage
00 02 04 05 : Déplace le curseur aucun décodage
Bitfield encoding :
Ce codage est uniquement utilisé pour les images en 16 et 32-Bits. Il consiste à stoquer sur 4 octets, les valeurs de bleu, vert, rouge et (32-Bits uniquement) alpha, selon la configuration indiquée dans Mask.
Voilà donc pour la compréhension des fichiers BMP. Maintenant, pour faire un peu de pratique en utilisant ce tutoriel, je vous propose deux programmes : un qui vous affichera le contenu des deux premiers header des fichiers BMP, puis un programme qui lit un fichier BMP. N’oubliez pas que pour toutes questions, il vous suffit de nous adresser un Mail
Programmes d’exemple :
- Lecture des deux premiers header des fichiers BMP
- Affichage d’un fichier BMP 640*480 256 couleurs
- Affichage d’un fichier BMP 640*480 24-Bits (65536 couleurs)
Aurélien
Dernière modification de cette page : 10/09/2000