Hit-Parade .VB Research Center . Compteur
Accueil ~  Code ~  Programmes ~  Api ~  Forum ~  Cours ~  Livres ~  Quiz ~  Annuaire
~ 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 ~
 Rechercher un site :
  

~ Partenaires ~

STRUCTURE DES FICHIERS BITMAP
(Philippe Plançon : plancon@onetelnet.fr)


~ Sommaire ~

Ce document décrit la façon dont est enregistré un fichier BitMap (*.BMP) au format Windows ou OS/2.

Le header

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
00h1Integer 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).
02h3Long 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
06h7Integer Réservé
Valeur réservée à une évolution ultérieure du format.
08h9Integer Réservé
Valeur réservée à une évolution ultérieure du format.
0Ah11Long 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

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
0Eh15Long Taille de la zone BitmapInfo
Donne la taille de la zone BitMapInfo.
12h19Long Largeur de l'image
Donne la largeur de l'image en pixels.
16h23Long Hauteur de l'image
Donne la hauteur de l'image en pixels.
1Ah27Integer Nombre de plans
Le nombre de plans est fixé à 1.
1Ch29Integer 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).
1Eh31Long 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)
22h35Long 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.
26h39Long 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).
2Ah43Long 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).
2Eh47Long 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.
32h51Long 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.

La palette

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.

L'image

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 !

Visual Basic Research Center - (c) 2000/2002 -  Webmaster : docvb (chez) free (point) fr