Analyse du codage d’un bitmap en hexadécimal


Le travail de ce chapitre consiste à analyser comment est codée une image.

Pour cela, nous utiliserons le logiciel Hexedit comme nous avons vu dans le chapitre précédent. La lecture de l'image se fera donc dans un système hexadécimal (base 16).




Analyse de l’en-tête d’un bitmap


Qu'est-ce qu'un en-tête ?

Un en-tête contient toutes les informations générales sur l’image, à savoir, par exemple :

  • La taille du fichier
  • Sa largeur en pixels
  • Sa hauteur en pixels
  • Sa profondeur de couleur...

Toute image bitmap contient un en-tête. Cet en-tête est placé en début de fichier et est indispensable à l'affichage de l'image.

Il est donc lu en premier et permet de savoir comment afficher l’image.

Chaque octet se trouve à un emplacement précis : c’est l’offset. En connaissant l’offset de chacun des octets de l’en-tête, on est capable d’en extraire ses informations.

L’en-tête des images bitmap est scindé en deux parties :

  • La première, plus courte et placée en premier, contient des informations très générales sur l’image. Elle est rarement utilisée.
  • La seconde est plus importante, elle vient juste après les informations d’en-tête générales.

Ces 2 tableaux présentent les informations des 2 en-têtes en fonction de l’offset :


L’en-tête : 1ère partie

Offset Longueur
(en octets)
Information
0 2 Doit contenir les lettres BM pour confirmer que l’image est un bitmap.
2 4 Taille du fichier, sans la partie d’en-tête
6 2 Réservé (inutilisé) : sa valeur doit être 0
8 2 Idem
10 4 Début des informations du second en-tête


B)L’en-tête : 2nde partie

Offset Longueur
(en octets)
Information
14 4 Taille de l’en-tête (peut prendre la valeur 40 ou 12)
18 4 Largeur de l’image en pixels
22 2 Hauteur de l’image en pixels
26 2 Nombre de plans, doit être à 1
28 4 Nombre de bits par pixel (profondeur de couleur) :
1, 4, 8 ou 24
30 4 Compression de l’image :
doit être à zéro, sinon l’image n’est plus directement lisible.
34 4 Taille de l’image, en octets
38 4 Largeur de l’image dans une autre unité
42 4 Hauteur de l’image dans une autre unité
46 4 Nombre de couleurs utilisées par l’image (dans le cas d’une compression) :
doit être à 0 si non compressée
50 4 Nombre de couleurs importantes (toujours pour une image compressée) :
0 si non compressées




Lecture du codage de l’image


Sur les images dont la profondeur de couleur est de 24 bits, le codage suit directement l’en-tête. C’est avec cette profondeur de couleur qu’il est le plus facile de lire le codage de l’image. Nous verrons que pour les autres profondeurs de couleur (1, 4 et 8 bits), il existe une autre information d’en-tête avant le codage de l’image.

En 24 bits, donc, il est très simple de lire le codage de l’image. Il fonctionne comme ceci :

3 octets représentent un pixel. En associant les 3, on obtient une couleur parmi les 224 = 16777216 disponibles.

  1. Le premier est la quantité de bleu
  2. Le second est la quantité de vert
  3. Le troisième est la quantité de rouge
Chacun de ces octets peut prendre 256 valeurs, soit FF valeurs en hexadécimal.
Pour chaque pixel, on a donc 3 octets représentant la valeur RVB en hexadécimal. Le logiciel de lecture hexadécimale nous donne par exemple cette information pour un pixel :


52 BF A0 
On doit décomposer ce nombre comme ceci : 52, BF et A0. Il est alors très facile de retrouver quelle est la couleur de ce pixel. Ici, on obtiendrait cette couleur.

Nous vous proposons d'essayer notre programme ci-dessous pour voir quel travail effectue l'ordinateur. Cliquez simplement sur la couleur de votre choix et sa valeur en hexadécimal s'affichera :

Dans le fichier, les données sont inscrites dans l'ordre BGR (Blue, Green, Red), alors que l'on parle pourtant d'une image RGB (Red, Green, Blue). Cela est dû au fait que l'ordinateur lit ces octets à l'envers.

Comme nous avons vu, ces informations suffisent pour connaître la couleur d’un pixel. La taille du fichier bitmap sans l’en-tête, peut donc se calculer comme-ceci :

Taille = (Hauteur * Largeur) * 3




Lecture d’une palette


Pour les images 1, 4 et 8 bits, entre l’en-tête et le codage de l’image, il y a une palette.

  1. En-tête 1
  2. En-tête 2
  3. Palette
  4. Codage de l’image
Elle n’a une utilité que lorsque le nombre de couleurs est limité. Par exemple, avec une image 4 bits, nous n’avons le choix qu’entre 16 couleurs.

Dans les images 24 bits, l'utilisation d'une palette devient obsolète : elle n'est pas nécessaire puisque c'est le maximum de couleurs qu'une image peut afficher.
La palette est donc absente des images 24 bits.

La définition de ces 16 couleurs se fait justement dans la palette. On donne leur correspondance RVB 24 bits, et on leur attribue un numéro. Il suffira dans le codage de l’image de rappeler le numéro de la couleur pour donner les indications RVB 24 bits obligatoires pour l’affichage de l’image.

La palette fonctionne comme ceci :

Offset Longueur
(en octets)
Information
14 + En-tête + 1 1 Intensité du bleu de la couleur n° 1/16
14 + En-tête + 2 1 Intensité du vert de la couleur n° 1/16
14 + En-tête + 3 1 Intensité du rouge de la couleur n° 1/16
14 + En-tête + 4 1 Inutilisé : doit être à 0.
14 + En-tête + 5 1 Intensité du bleu de la couleur n° 2/16
14 + En-tête + 6 1 Intensité du vert de la couleur n° 2/16
14 + En-tête + 7 1 Intensité du rouge de la couleur n° 2/16
14 + En-tête + 1 1 Inutilisé : doit être à 0.
... ... ...


Pour lire et modifier la palette des bitmaps, vous pouvez utiliser ce logiciel que nous avons créé :

Palette.exe (36 Ko)

Nous pouvons maintenant analyser le fonctionnement du codage de l'image selon la profondeur de couleur :

  • 24 bits : nous l’avons déjà vu : pour chaque pixel il y a 3 octets, chacun stockant une valeur Rouge, Verte ou Bleue. Il n'y a pas de palette dans ces fichiers.
  • 8 bits : chaque octet représente un seul pixel. Sa valeur est le numéro de la couleur de la palette. Avec ce seul numéro, il a donc les informations RVB nécessaires pour afficher le pixel l’image.
  • 4 bits : compliqué. Un octet représente 2 pixels de l’image. Les 4 premiers bits de poids fort représentent 1 pixel, les 4 bits suivant de poids faible représentent un autre pixel.
  • 1 bit : ici, chaque bit représente un pixel. Si le bit a pour valeur 0, c’est la couleur 0 qui doit être lue. Si le bit a pour valeur 1, c’est la couleur 1 qui est affichée.





Tests


Que signifient les lettres BM dans l'en-tête du fichier ?

Combien y a-t-il d'en-têtes différents ?

Quelle taille fait le codage d'une image 24 bits de 300 par 150 pixels ?

Qu'est-ce qu'un offset ?

Pourquoi n'y a-t-il pas de palette dans les images 24 bits ?




Page précédentePage suivante