headerIcone

Patinaud.org


Le système d'information dans toute sa définition

Documentaires
Technologies
Législation
Normes et bonnes pratiques
 
Architecture applicative
 
 
Composants réseau
 
 
Encodage binaire
 
 
Protocoles réseau
 
A propos de Patinaud.org

Écriture binaire des images BMP

Présentation

Le format BMP pour BitMaP est l'un des formats d'image les plus simples à utiliser et à développer. Cependant si ce format présente l'avantage d'être simple à employer, il a l'inconvénient de générer des fichiers particulièrement volumineux car le système de compression de l'image n'est pas optimisé. L'une des possibilités pour réduire la taille de l'image consiste à réduire le nombre de couleurs employées ce qui pour des images en couleur telle que des photos entraîne une perte de qualité et une dégradation de l'image. L'image est représentée dans le fichier sous forme de tableau ou chaque case du tableau représente un pixel de l'image. Dans le cas le plus simple chaque pixel est codé sur trois octets, un pour le rouge, un pour le vert et un pour le bleu mais cette condition peut être configurée dans l’entête du fichier. 

Représentation

Le format BMP est composé de quatre parties principales. Qui sont : - L’entête du fichier (file header) donnant les informations sur le type de fichier, - L’entête du bitmap (bitmap information header) donnant les informations sur la représentation de l’image à l’intérieur du fichier. - La palette de couleur optionnelle - Et pour finir le corps de l’image, qui correspond à la représentation de chaque pixel Ces quatre champs se trouvant dans l’ordre les uns à la suite des autres dans le fichier nous pouvons les représenter de la manière suivante :
Adresse du groupe Taille du groupe Nom de l'attribut Valeur Information supplémentaire
Entête du fichier
0x 00 à 0x01 2 octets Signature du fichier 0x 42 4D (par défaut) La valeur de la signature informe sur le type du fichier sur deux caractères. Ainsi BM correspond au format Bitmap Windows et ce code 0x 42 4D selon la table ASCII.
0x 02 à 0x05 4 octets Taille totale du fichier 0x 00 00 00 00 (par défaut) Pour rappel l’octet de poids faible se place en premier.
0x06 à 0x09 4 octets Champs réservé 0x 00 00 00 00
0x0a à 0x0d 4 octets Offset 0x 36 00 00 00 (par défaut) L’offset correspond à l’adresse du premier octet du corps de l’image.
Entête de l'image
0x0e à 0x11 4 octets La taille de l’entête de l’image 0x 28 00 00 00 (par défaut)
0x12 à 0x15 4 octets La largeur de l’image en pixel (width) De 00 à ff Pour rappel l’octet de poids faible se place en premier.
0x16 à 0x19 4 octets La hauteur de l’image en pixel (height) De 00 à ff Idem
0x1a à 0x1b 2 octets Le nombre de plans 0x 01 00 (par défaut)
0x1c à 0x1d 2 octets La profondeur de codage de la couleur, c’est le nombre de bit utilisé par pixel 0x 18 00 (par défaut) La valeur la plus utilisée étant 0x18 soit 24 bits par pixel ce qui correspond à un octet pour chacune des couleurs (R, G, B). Les valeurs les plus fréquentes étant 1, 4, 8, 16, 24 et 32.
0x1e à 0x21 4 octets Le mode de compression, 0 si non compressé 0x 00 00 00 00(par défaut) 0 : pour non codé 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ée par un triple masque représenté par la palette
0x22 à 0x25 4 octets La définition de l’image, c’est le nombre d’octets composant l’image 0x 00 00 00 00 (par défaut)
0x26 à 0x29 4 octets La résolution horizontale par mètre. 0x 00 00 00 00 (par défaut) La résolution correspond au nombre de pixels par mètres alors que la définition correspond au nombre total de pixel sur l’image.
0x2a à 0x2d 4 octets La résolution verticale par mètre. 0x 00 00 00 00 (par défaut)
0x2e à 0x31 4 octets Le nombre de couleurs de la palette. 0x 00 00 00 00 (par défaut)  
0x32 à 0x36 4 octets Le nombre de couleurs importantes de la tablette 0x 00 00 00 00 (par défaut)  
Palette de couleur
0x37 1 octet Bleu 0x 00 (par défaut)  
0x38 1 octet Vert 0x 00 (par défaut)  
0x39 1 octet Rouge 0x 00 (par défaut)  
0x3a 1 octet Réservé pour la transparence 0x 00 (par défaut)  
Corps de l'image
0x3b N octets Corps de l’image   C’est le cœur du fichier, l’ensemble des pixels.

Description des caractéristiques

Le nombre de bits nécessaires pour coder un pixel est défini à l'adresse 0x1C. Par défaut ce paramètre est valorisé à 0x18 ce qui signifie que 24 bits sont nécessaires pour coder un pixel. Du fait que 24 bits équivalent à trois octets et que trois couleurs (Rouge, Vert, Bleu) sont utilisés alors une couleur est codée par un octet. Chaque ligne de l'image doit être composée d'un multiple de 4 octets. Ainsi si l'image mesure 3 pixels de large, chaque ligne devra être codée sur 12 octets dont 9 octets utiles (chaque pixel est codé sur 3 octets (Rouge, Vert, Bleu)) plus trois de bourrage valorisés à 0. Les octets sont codés de l’octet ayant le poids le plus faible à l’octet ayant le poids le plus fort, cette méthode est appelée Low Significant Bit first (LSB first). Ainsi pour un bitmap ayant une hauteur de 600 pixels, sa taille s'écrira par 0x 58 02 00 00 à l'adresse 0x16 et non 0x 00 00 02. Cette remarque est également valide pour les couleurs. Ainsi l'on n'écrira pas Rouge Vert Bleu mais l'on écrira Bleu Vert Rouge soit (0xFF0000 pour le bleu et 0x0000FF pour le rouge). Les pixels sont codés de la gauche vers la droite et du bas vers le haut tel que représenté sur le schéma ci-dessous : schema encodage pixel

Mise en pratique

L'exemple ci-dessous démontre la mise en pratique du format BMP via la création de l'image de taille de 4 pixels de hauteur et de 3 pixels de largeur ci-dessous : image BMP exemple (cliquez sur l'image pour la télécharger) Si vous ouvrez l'image en binaire avec un outil tel que hexed.it vous pourrez constater que son contenu est le suivant :
42 4D 00 00 00 00 00 00 00 00 36 00 00 00 28 00 00 00 03 00 00 00 04 00 00 00 01 00 18 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 (Entête)
FF FF FF88 88 88FF FF FF00 00 00 (bourrage)
FF 00 0000 FF 0000 00 FF00 00 00 (bourrage)
AB 46 F002 AE 1512 50 AA 00 00 00 (bourrage)
22 33 1144 88 AAAA 17 65 00 00 00 (bourrage)
Dans l’entête on peut noter la présence des dimensions de l'image indiquées en rose ainsi que profondeur de couleur indiqué en bleu.