Windows bitmap
# Windows bitmap

Windows bitmap (connu aussi sous l'abréviation de BitMaP en BMP ; en anglais, device-independent bitmap ou DIB), est un format d'image matricielle ouvert développé par Microsoft et IBM. C'est un des formats d'images les plus simples à développer et à utiliser pour programmer. Il est lisible par quasiment tous les visualiseurs et éditeurs d'images. Il a été introduit avec Windows 3.0 en 1990.

## Organisation du fichier

Le fichier se découpe en trois zones :

* l'en-tête du fichier (bitmap-file header et bitmap-information header);
* la palette de couleurs ;
* les données relatives à l'image.

### Format du fichier

Le fichier se découpe en deux parties, à savoir :

* les données relatives au fichier, l'entête :

| Offset# (n° de ligne) | Taille | Valeur |
| - | - | - |
| 0x0000 | 2 octets | le nombre magique correspondant à l'utilisation du fichier BMP BM - Windows 3.1x, 95, NT, etc. BA - OS/2 Bitmap Array CI - OS/2 Icône Couleur (Color Icon) CP - OS/2 Pointeur Couleur (Color Pointer) IC - OS/2 Icône (Icon) PT - OS/2 Pointeur (Pointer) |
| 0x0002 | 4 octets | la taille du fichier BMP en octets |
| 0x0006 | 2 octets | réservé pour l'identifiant de l'application qui a créé le fichier |
| 0x0008 | 2 octets | réservé pour l'identifiant de l'application qui a créé le fichier |
| 0x000A | 4 octets | l'offset (l'adresse de départ) du contenu du BMP |

* les données relatives à l'image.

On trouve notamment la taille du fichier en octets, l'emplacement de début des données, le nombre de bits par pixels dans l'image, le type de compression utilisé, le nombre de couleurs dans la palette, la largeur et la hauteur de l'image, etc.

### Palette

Les logiciels de lecture utilisent trois octets pour coder la couleur (système rouge vert bleu, RVB) :

* le BMP 24 bits permet d'allouer 1 octet bleu, 1 octet vert et 1 octet rouge par pixel. N'étant donc pas nécessaire, la palette n'est pas présente dans le fichier BMP 24 bits ;
* le BMP 8 bits ne permet que de représenter 256 couleurs. Il est donc nécessaire de définir un système de correspondance entre la valeur du pixel et les trois composantes qui apparaissent dans l'ordre Bleu, Vert, Rouge. Une table est ajoutée juste après l'en-tête (octet 54), et assigne à chaque valeur (de 0 à 255) les trois composantes RVB qui y correspondent.

La palette est donc une table de correspondance de type :

| Valeur à afficher | RVB |
| - | - |
| 0 | B=b0, V=v0, R=r0 + octet 00 |
| 255 | B=b255, V=v255, R=r255 + octet 00 |

Par exemple, pour une image en niveaux de gris (256 nuances), les trois valeurs R, V et B seront égales et varieront entre 0 et 255.

La structure du fichier BMP devient donc :

* en-tête
* palette à l'octet 54 (36 en hexadécimal) ;
* image à l'octet 1 078 (0436 en hexadécimal) ;

Il faut tenir compte de cela lors du calcul de l'en-tête. Il existe également un format BMP sur 1 et 4 bits.

## Nombre de couleurs

Le format BMP supporte plusieurs variantes, selon le nombre de couleurs possibles souhaitées. La profondeur de couleurs est le nombre de bits associés à chaque pixel pour en coder la couleur.

Ainsi, les images BMP peuvent être en 2 couleurs (1 bit), 16 couleurs (4 bits), 256 couleurs (8 bits), 65 536 couleurs (16 bits) ou 16,8 millions de couleurs (24 bits).

Les images 24 bits possèdent trois canaux de 8 bits pour les trois lumières primaires (rouge, vert, bleu) qui peuvent prendre chacune 256 valeurs différentes. Les images en 256 niveaux de gris sont possibles avec un seul canal de 8 bits.

## Taille du fichier

Le format BMP est quasiment inexistant sur le Web : il ne dégrade pas l'image et n'utilise généralement pas de compression, aussi est-il très lourd. Il existe néanmoins la compression RLE pour le format BMP.

Pour calculer la taille approximative du fichier BMP final, on multiplie la profondeur couleurs (1, 4, 8, 16 ou 24 bits) par la hauteur et par la largeur en pixels : (Profondeur de couleurs en bits) × (Hauteur en pixels) × (Largeur en pixels) bits.

Par exemple, une image en 800 × 600 (800 pixels de large par 600 pixels de haut) en 24 bits (16,8 millions de couleurs) aura une taille de (800 × 600 × 24) bits soit 1,44 Mo (1,37 Mio) ou encore la capacité d'une disquette 3″½ haute densité (une telle image ne pourra donc pas être enregistrée sur une disquette 1,44 Mo à cause notamment de la table d'allocation des fichiers qui prend une certaine place, tout comme l'en-tête de l'image).

## Disposition des données de l'image

Contrairement à la plupart des formats d'images, les pixels de l'image sont codés en partant de la ligne inférieure de l'image. Chaque ligne (codée de gauche à droite) doit toujours occuper un nombre d'octets multiple de 4, excepté si l'image est compressée. Si la ligne ne possède pas un nombre d'octets multiple de 4, on ajoute FF, 00FF, ou 0000FF à la fin de chaque ligne.

Si l'image est codée en 24 bits, chaque pixel est codé par un entier 24 bits (RVB), ordre little-endian, c'est-à-dire que les trois octets codent successivement les niveaux de bleu, vert et rouge.

Si l'image est codée avec moins de 16 bits, chaque pixel est codé sous la forme d'un index dans la table de couleurs (la palette), d'où l'appellation « image indexée ». Dans le cas des images codant les pixels sur 1 bit ou 4 bits, c'est-à-dire si plusieurs pixels sont codés dans un même octet, les bits de poids fort concernent le pixel le plus à gauche.

## Compression

Le format BMP permet l'utilisation de l'algorithme de compression RLE pour les images 8 bits (256 couleurs) et 4 bits (16 couleurs).

La compression RLE, introduite dans le format BMP à l'époque de Windows 3.x, n'a été cependant pleinement supportée qu'à partir de Windows 95. Elle est rarement utilisée car elle n'est réellement efficace que sur les images dans lesquelles une majorité de pixels adjacents ont la même couleur.

Le principe :

* Un octet compris entre 1 et 255 indique le nombre de pixels pour lesquels il faut utiliser l'information contenue dans l'octet suivant ;
* Un octet à 0 indique une action spéciale, il est suivi d'un second octet :
   * S'il vaut 0, la fin de ligne est atteinte, passer à la ligne suivante ;
   * S'il vaut 1, la fin de l'image est atteinte, fin de lecture ;
   * S'il vaut 2, sauter X colonnes et Y lignes avant de poursuivre (X et Y étant chacun codé sur 1 octet) ;
   * S'il vaut entre 3 et 255, il s'agit du nombre de pixels qui suivent, codés comme des données non compressées. Dans ce cas-là, il faut éventuellement sauter un octet inutilisé afin que le nombre d'octets soit pair.
