Le format BMP est un des formats les plus simples développé conjointement
par Microsoft et IBM, ce qui explique qu'il soit particulièrement répandu sur
les plates formes Windows et OS/2. Un fichier BMP est un fichier bitmap, c'est-à-dire
un fichier d'image graphique stockant les pixels sous forme de tableau de points
et gérant les couleurs soit en couleur vraie soit grâce à une palette
indexée. Le format BMP a été étudié de telle manière
a obtenir un bitmap indépendant du périphérique d'affichage (DIB, Device
independent bitmap).
La structure d'un fichier bitmap est la suivante :
L'entête du fichier fournit des informations sur le type de fichier (Bitmap), sa taille
et indique où commence les informations concernant l'image à proprement parler.
L'entête est composé de quatre champs :
- La signature (sur 2 octets), indiquant qu'il s'agit d'un fichier BMP à l'aide
des deux caractères.
- BM, 424D en hexadécimal, indique qu'il s'agit d'un Bitmap Windows.
- BA indique qu'il s'agit d'un Bitmap OS/2.
- CI indique qu'il s'agit d'une icone couleur OS/2.
- CP indique qu'il s'agit d'un pointeur de couleur OS/2.
- IC indique qu'il s'agit d'une icone OS/2.
- PT indique qu'il s'agit d'un pointeur OS/2.
- La taille totale du fichier en octets (codée sur 4 octets)
- Un champ réservé (sur 4 octets)
- L'offset de l'image (sur 4 octets), en français décalage,
c'est-à-dire l'adresse relative du début des informations concernant l'image
par rapport au début du fichier
L'entête de l'image fournit des informations sur l'image, notamment ses dimensions
et ses couleurs.
L'entête de l'image est composé de quatre champs :
- La taille de l'entête de l'image en octets (codée sur 4 octets). Les valeurs hexadécimales suivantes
sont possibles suivant le type de format BMP :
- 28 pour Windows 3.1x, 95, NT, ...
- 0C pour OS/2 1.x
- F0 pour OS/2 2.x
- La largeur de l'image (sur 4 octets), c'est-à-dire le nombre de pixels horizontalement (en anglais width)
- La hauteur de l'image (sur 4 octets), c'est-à-dire le nombre de pixels verticalement (en anglais height)
- Le nombre de plans (sur 2 octets). Cette valeur vaut toujours 0
- La profondeur de codage de la couleur(sur 2 octets), c'est-à-dire le nombre
de bits utilisés pour coder la couleur. Cette valeur peut-être égale
à 1, 4, 8, 16, 24 ou 32
- La méthode de compression (sur 4 octets). Cette valeur vaut 0 lorsque l'image n'est
pas compressée, ou bien 1, 2 ou 3 suivant le type de compression utilisé :
- 1 pour un codage RLE de 8 bits par pixel
- 2 pour un codage RLE de 4 bits par pixel
- 3 pour un codage bitfields, signifiant que la couleur est codé par un triple masque
représenté par la palette
- La taille totale de l'image en octets (sur 4 octets).
- La résolution horizontale (sur 4 octets), c'est-à-dire le nombre de pixels par mètre horizontalement
- La résolution verticale (sur 4 octets), c'est-à-dire le nombre de pixels par mètre verticalement
- Le nombre de couleurs de la palette (sur 4 octets)
- Le nombre de couleurs importantes de la palette (sur 4 octets). Ce champ peut être égal
à 0 lorsque chaque couleur a son importance.
La palette est optionnelle. Lorsqu'une palette est définie, elle contient
successivement 4 octets pour chacune de ses entrées représentant :
- La composante bleue (sur un octet)
- La composante verte (sur un octet)
- La composante rouge (sur un octet)
- Un champ réservé (sur un octet)
Le codage de l'image se fait en écrivant successivement les bits correspondant à
chaque pixel, ligne par ligne en commençant par le pixel en bas à gauche.
- Les images en 2 couleurs utilisent 1 bit par pixel, ce qui signifie qu'un octet permet de coder
8 pixels
- Les images en 16 couleurs utilisent 4 bits par pixel, ce qui signifie qu'un octet permet de coder
2 pixels
- Les images en 256 couleurs utilisent 8 bits par pixel, ce qui signifie qu'un octet code chaque pixel
- Les images en couleurs réelles utilisent 24 bits par pixel, ce qui signifie qu'il faut 3 octets
pour coder chaque pixel, en prenant soin de respecter l'ordre de l'alternance bleu, vert et rouge.
Chaque ligne de l'image doit comporte un nombre total d'octets qui soit
un multiple de 4; si ce n'est pas le cas, la ligne doit être complétée par des 0 de telle
manière à respecter ce critère.
|