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

 

 

 

 

Retour au menu précédent

 

Dernière modification de cette page : 10/09/2000