Accès membres : identifiez-vous !     Dernière remise à jour du site : le Mar. 11 Novembre 2014 à 14:51:19

wxFrantz's Concept

Format BMP

Le format BMP est un format d'image développé par Windows et IBM. Il s'agit d'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 (noir et blanc, 16 couleurs ou 256 couleurs).
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.

Un fichier bitmap est un fichier binaire, composé de trois voir quatre parties :

Vous trouverez ci-dessous un exemple, ainsi qu'un script permettant l'extraction des propriétés d'un fichier BitMap. Enfin, je laisse à votre disposition un comparatif effectué entre différents types de BitMap.

L'entête du fichier (File header)

L'entête du fichier indique les caractéristiques principales du fichier : son type (BitMap), sa taille, et l'emplacement du début de l'image.

L'entête du fichier est composé de 4 champs :

  • - La signature du fichier (sur 2 octets, position 00h) : BM (424D en hexadécimal) indique que l'on se trouve en présence d'un fichier BitMap ;
  • - La taille du fichier en octets (sur 4 octets, position 02h) ;
  • - Un champ réservé (4 octets, position 06h) ;
  • - L'offset du début de l'image (sur 4 octets, position 0Ah). L'offset, en français décalage, correspond à l'adresse où sont stockées les premières informations relatives à l'image.

L'entête de l'image (Information header)

L'entête de l'image donne les caractéristiques de l'image comme sa taille, sa résolution, le nombre de couleurs ...

L'entête de l'image est composé de 11 champs :

  • - La taille de l'entête de l'image en octets (sur 4 octets, position 0Eh) : 40 (28 en hexadécimal) indique que l'on se trouve en présence d'un fichier Windows ;
  • - La largeur de l'image en pixels (sur 4 octets, position 12h) ;
  • - La hauteur de l'image en pixels (sur 4 octets, position 16h) ;
  • - Le nombre de plans dans l'image (sur 2 octets, position 1Ah), toujours égal à 1 ;
  • - Le nombre de bits par pixel (sur 2 octets, position 1Ch). Cette valeur peut être égale à 1  (monochrome), 4 (16 couleurs), 8 (256 couleurs), 16 (65 536 couleurs) ou 24 (16 millions de couleurs : couleurs vraies (RVB)) ;
  • - Le type de compression (sur 4 octets, position 1Eh). Cette valeur peut être égale à 0 (pas de compression), 1 (compression RLE à 8 bits par pixel), 2 (compression RLE à 4 bits par pixel) ;
  • - La taille de l'image en octets (sur 4 octets, position 22h), incluant le remplissage ;
  • - La résolution horizontale en pixels par mètre (sur 4 octets, position 26h) (Non fiable) ;
  • - La résolution verticale en pixels par mètre (sur 4 octets, position 2Ah) (Non fiable) ;
  • - Le nombre de couleurs de la palette (sur 4 octets, position 2Eh) ;
  • - Le nombre de couleurs importantes de la palette (sur 4 octets, position 32h). Cette valeur peut être égale à 0 lorsque toutes les couleurs sont importantes.

La palette de couleurs

La palette, ou table des couleurs, n'existe que pour les images de 1, 4 ou 8 bits/pixel.
Elle contient la liste des couleurs dans l'espace RVB. Chaque couleur de la palette est définie sur 4 octets :

  • - Composante Bleu ;
  • - Composante Verte ;
  • - Composante Rouge ;
  • - Un champ réservé.

Variable en fonction du nombre de bits/pixel de l'image, la taille de la palette est calculée de la façon suivante :

  • - Image 1 bit/pixel :   21 x 4 octets = 8 octets ;
  • - Image 4 bits/pixel : 24 x 4 = 64 octets ;
  • - Image 8 bits/pixel : 28 x 4 = 1024 octets.

Les données de l'image

L'image est codée de bas en haut et de gauche à droite.
Chaque ligne doit comporter un nombre d'octets multiple de 4 octets, si ce n'est pas le cas, la ligne doit être complétée par des 0 pour y parvenir ; cette règle s'applique si l'image n'est pas compressée.

Si l'image est codée en 24 bits, chaque pixel est codé sur 3 octets (RVB inversé), soit 1 octet pour le bleu, 1 pour le vert et 1 pour le rouge.
Si l'image est codée avec moins de 24 bits, chaque pixel est codé sous la forme d'un index dans la palette.
Les images en monochrome sont codées sur 1 bit par pixel, ainsi un octet représente 8 pixels.
Les images en 16 couleurs sont codées sur 4 bits par pixels, ainsi un octet représente 4 pixels.
Les images en 256 couleurs sont codées sur 8 bits par pixels, ainsi un octet représente 1 pixel.
Dans le cas d'images codées sur 1 ou 4 bits, les bits de poids forts concernent les pixels les plus à gauche.

Compression

Le format BitMap utilise l'algorythme de compression RLE (Run Lenght Encoding). Le principe est de regrouper une suite de points de même couleur : au lieu de coder A4 A4 A4 A4 A4 A4, il sera codé : 06 A4. Le premier octet indique le nombre de pixels consécutifs de même couleur (deuxième octet).

Si le premier des deux octets est égal à 0, cela indique une séquence spéciale, il est alors suivit 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 ;
  • - S'il vaut 2, sauter les deux octets suivants (X et Y), avancer de X pixels vers la droite, et monter de Y pixels vers le haut ;
  • - S'il est supérieur ou égal à 3, il s'agit du nombre de pixels qui suivent, codés comme des données non compressées. Un octet à 0 est éventuellement rajouté à la fin de ces octets pour que le nombre d'octets de la ligne soit un multiple de 4.

Cette compression peut être utilisée pour les images 256 couleurs (8 bits/pixel) et 16 couleurs (4 bits/pixel).

Quoi qu'il en soit, les machines informatiques étant de plus en plus puissantes, cette compression n'est plus utilisée ; de plus, cette méthode n'est efficace que pour les images de synthèse (créées artificiellement), car elles contiennent beaucoup de pixels de même couleurs, alors que les images naturelles, comme les photos, n'en contiennent quasiment pas, ce qui peut amener alors à une augmentation de la taille du fichier.

Exemple

Afin de concrétiser la théorie, ouvrons un fichier BitMap de 3x3 pixels avec un éditeur hexadécimal. Vous pouvez télécharger le fichier d'exemple en cliquant sur l'image ci-dessous.

Cette image est composée de 9 pixels :

Rouge
FF 00 00
Vert
00 FF 00
Gris foncé
80 80 80
Jaune
FF FF 00
Noir
00 00 00
Gris
C0 C0 C0
Bleu
00 00 FF
Rose
FF 00 80
Marron
80 80 00

Après avoir ouvert le BitMap, nous pouvons repérer les champs suivants :

L'entête du fichier est composé de :

  • - La signature : 42 4d, il s'agit d'un fichier BitMap ;
  • - La taille du fichier : 5a 00 00 00, soit 0000005a en hexadécimal, soit 90 octets ;
  • - Le champ réservé, sur 4 octets ;
  • - L'offset de l'image : 36 00 00 00, soit 00000036 en hexadécimal, soit 54 en décimal. Les données relatives à l'image commence à l'adresse 36h ou 54d.

L'entête de l'image est composé de :

  • - La taille de l'entête : 28 00 00 00, soit 40 en décimal => 40 octets ;
  • - La largeur de l'image : 03 00 00 00, soit 3 pixels ;
  • - La hauteur de l'image : 03 00 00 00, soit 3 pixels ;
  • - Le nombre de plans dans l'image : 01 00, toujours égal à 1 ;
  • - Le nombre de bits par pixel : 18 00, soit 0018 en hexadécimal, soit 24 en décimal => 24 bits/pixel: couleurs vraies RVB ;
  • - Le type de compression : 00 00 00 00, pas de compression ;
  • - La taille de l'image : 24 00 00 00, soit 36 en décimal => 36 octets ;
  • - La résolution horizontale : 00 00 00 00, soit 0 pixel/mètre (Non fiable) ;
  • - La résolution verticale : 00 00 00 00, soit 0 pixel/mètre (Non fiable) ;
  • - Le nombre de couleurs de la palette : 00 00 00 00, pas de palette ;
  • - Le nombre de couleurs importantes de la palette : 00 00 00 00, toutes les couleurs sont importantes.

Nous avons vu précédemment qu'il s'agissait d'un fichier 24 bits/pixel, aussi, chaque pixel est codé sur 3 octets. L'image a 3 pixels de large, soit 3x3=9 octets d'information. Il faut qu'une ligne comporte un multiple de 4 octets, ainsi il devrait y avoir un remplissage de 12-9=3 octets.
C'est ce que nous observons : 3x3 octets d'information de couleur RVB inversé (en vert), suivit de 3 octets de remplissage (en marron). Et ce pour chaque ligne de l'image.

Extraction des propriétés d'un fichier BitMap

Ce script permet l'extraction des propriétés d'un fichier BitMap (2 Mo maxi).

Choisir et envoyer :

Comparatif d'entêtes de fichiers BitMap

Afin de comparer les différents types d'entêtes de fichiers BitMap, vous pouvez télécharger un zip contenant 8 BitMaps :

  • - Un fichier original - Couleurs vraies 24 bits ;
  • - Le même en niveaux de gris ;
  • - Le même en niveaux de gris - Codage RLE ;
  • - Le même avec une palette indexée de 256 couleurs ;
  • - Le même avec une palette indexée de 256 couleurs - Codage RLE ;
  • - Le même avec une palette indexée de 16 couleurs ;
  • - Le même avec une palette indexée de 16 couleurs - Codage RLE ;
  • - Le même en noir et blanc ;
  • - Ainsi qu'un tableau de synthèse comparant les différents entêtes de fichier et d'image.

Dernière modification de cette page le 11 novembre 2014 à 14:03
Sauf mention contraire, le contenu de cette page est sous licence Creative Commons Paternité et Conditions de partage à l'identique
Page générée en 238.935 millisecondes | Votre adresse IP : 3.22.208.84 | Me contacter

             
Impossible de se connecter : Access denied for user 'wxfrantz'@'172.20.245.55' (using password: YES)