|
~ Edito ~
12/03/2006 @ 13:39
Depuis la dernière mise à jour (qui remonte à... oulala plusieurs mois), un petit ménage de printemps s'impose. Ca tombe bien, c'est presque la période. Au menu, et progressivement sur les jours à venir, rafraîchissement de plusieurs fonctions et procédures, nouvelles APIs et nouveaux programmes.
~ Rechercher ~
~ Annuaire VB ~
~ Partenaires ~
|
~ Sommaire ~
Ce document décrit la façon dont est enregistré un fichier BitMap (*.BMP) au format Windows ou OS/2.
Le header indique les caractéristiques principales du fichier : son type (BitMap), sa taille et l'emplacement
de l'image dans le fichier.
Position (Héxadécimal) | Position (Octet) |
Type (sous VB) | Description |
| 00h | 1 | Integer |
Signature Les deux premiers octets nous donne la signature du fichier : BM. Elle indique que
l'on se trouve en présence d'un fichier bitmap (1er octet = B ; 2éme octet = M). la signature du
fichier doit toujours avoir la valeur 4D42h ("BM" ou 19778). |
| 02h | 3 | Long |
Taille du fichier en octets
Pour information, on utilise donc 4 octets pour coder la taille de l'image, on les notera respectivement dans
l'ordre d'arrivée dans le fichier : o1, o2, o3, o4. On obtient alors la taille de l'image en
effectuant le calcul suivant (en base décimal) : Taille = o1+o2*256^1+o3*256^2+o4+256^3 |
| 06h | 7 | Integer |
Réservé Valeur réservée à une évolution ultérieure du format. |
| 08h | 9 | Integer |
Réservé Valeur réservée à une évolution ultérieure du format. |
| 0Ah | 11 | Long |
Offset de l'image L'offset de début du raster par rapport du début du fichier.
En d'autres termes, il indique la position dans le fichier ou commence les données (emplacement de l'image
dans le fichier). L'offset est codé sur un octet. |
La zone BitMap Info définit les caractéristiques essentielles de l'image, c'est pourquoi on la
distingue du header, mais elle suit directement celui-ci.
| Postiton (Héxadécimal) | Position (Octet) |
Type (sous VB) | Description |
| 0Eh | 15 | Long |
Taille de la zone BitmapInfo Donne la taille de la zone BitMapInfo. |
| 12h | 19 | Long |
Largeur de l'image Donne la largeur de l'image en pixels. |
| 16h | 23 | Long |
Hauteur de l'image Donne la hauteur de l'image en pixels. |
| 1Ah | 27 | Integer |
Nombre de plans Le nombre de plans est fixé à 1. |
| 1Ch | 29 | Integer |
Bit par pixel Indique le nombre de bit par pixels. On a pour une image :
- monochrome : 1 bit - 16 couleurs : 4 bits - 256 couleurs : 8 bits - 16 millions couleurs : 24 bits
Les valeurs sont alors respectivement suivant le cas dans lequel on se trouve 1, 4, 8 ou 24 (cas énuméré ci-dessus). |
| 1Eh | 31 | Long |
Format de compression de l'image Indique le type de compression utilisé. Le fichier BMP
peuvent en effet contenir des données raster compressées selon une méthode de type RLE, mais
cette possiblité est rarement utilisée. Les valeurs sont alors :
0 : non compressée 1 : compressée à 8 bits par pixel (RLE8)
2 : compressée à 4 bits par pixel (RLE4)
|
| 22h | 35 | Long |
Taille de l'image en octets Indique la taille du raster quand il et compressé ou la
taille de l'image lorsqu'elle n'est pas compressée. |
| 26h | 39 | Long |
Pixels par mètre suivant l'horizontale Résolution horizontale en pixels par
mètre. Cette valeur est falcultatif et par défaut elle vaut 0 (La résolution en pixels par
mètre sert pour l'impression). |
| 2Ah | 43 | Long |
Pixels par mètre suivant la verticale Résolution verticale en pixels par
mètre. Cette valeur est falcultatif et par défaut elle vaut 0 (La résolution en pixels par
mètre sert pour l'impression). |
| 2Eh | 47 | Long |
Nombre de couleurs différentes Indique le nombre de couleur différentes ou le
nombre de couleurs utilisées dans l'image (facultatif, par défaut =0) Si l'image est en 16
millions couleurs (24 bits). Ce champ spécifie la taille de la palette de couleurs de
référence utilisée pour optimiser les palettes Windows. |
| 32h | 51 | Long |
Nombre de couleurs importantes Indique le nombre de couleurs importantes pour l'affichage
(facultatif, par défaut = 0 - toutes les couleurs sont importantes)
|
Commentaires :
ATTENTION :
La largeur X doit être paire. Si la résolution est par exemple de 179 avec un mode 8 bits, alors chaque
ligne aura une taille de 180 octets, avec un octet vide à chaque fin de ligne pour combler le vide. Cela peut
paraître handicapant, mais ça vous permet en fait d'accéder au fichier mot par mot, et non plus
octet par octet.
Formats de compression :
La compression est du type RLE, c'est-à-dire Run Length Encoding. Le principe consiste à
regrouper des suites de points de même couleur en un seul point en on définit combien de fois il doit
être répété (on écrit "05 FE" au lieu de "FE FE FE FE FE" :
ça prend quand même moins de place).
Format 8 bits (RLE-4):
L'image est compressée selon deux modes, qui peuvent se trouver tous les deux dans la même image,
c'est-à-dire que certaines portions sont compressées selon le mode encodé, et d'autres selon le
mode absolu (qui équivaut à une compression zéro). Mais étudions le mode de
compression :
Mode encodé :
Le format consiste à compresser les données en blocs de deux octets. Le premier octet définit
le nombre de pixels à afficher et le second leur couleur. Si le premier octet vaut 0, c'est un code
"escape" et il faut lire le second pour en traduire la signification :
2e octet = 0 : Fin de ligne
2e octet = 1 : Fin du bitmap
2e octet = 2 : Delta : les deux octets suivants désignent les positions horizontale et verticale du point
suivant, relativement au point courant (valeur non signée)
2e octet = 03h à 0FFh : passage en mode absolu (c.a.d non compressé)
Mode absolu :
C'est un simple retour au format non compressé. Le second octet (celui entre 03 et FF) indique le nombre de
pixels à afficher normalement, c'est-à-dire sans décompression.
En format 4 bits (RLE-4), c'est la même chose, sauf que la couleur est codée différemment : le
second octet est séparé en deux valeurs de 4 bits : la partie base est la couleur #1 et la partie
haute la couleur #2. On dessine ensuite au lieu d'une couleur deux couleurs tour à tour (en commencant par
la #1). Cela vaut pour les deux modes, encodé et absolu. Apparemment, cela est surtout utilisé pour
faire des images avec du tramage.
Quoi qu'il en soit, avec l'avènement des modes haute-résolution et des mémoires de
masse à grande capacité, cette compression est devenue totalement obsolète puisqu'elle ne
s'applique qu'au format 8 bits, et la plupart des logiciels de dessin, même s'ils gèrent cette
fonctionnalité en option, ne l'utilsent pas. Autre inconvénient : 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. Vous n'êtes donc pas du tout
obligé de gérer la compression RLE.
C'est un tableau contenant la liste des couleurs pour le mode 8 bits. Il suit immédiatement la zone Bitmap
Info, et n'est présent qu'en mode 8 bits. Une couleur est codée sur 4 octets :
R:G:B:Réservé. La taille de la palette est donc de 1024 octets.
Elle vient directement après la zone BitMap Info (ou la palette, s'il y en a une), mais il est
préférable d'y accéder via l'offset définit dans le header. Elle est stockée
normalement, suivant le format définit dans 1Ch et 1Eh (en 24 bits, c'est R:G:B:X) mais attention : l'image
est stockée à l'envers. Il faut la lire en BGR et le premier pixel dans le fichier correspond au
dernier de l'image ! |