Introduction
L'extension de fichier .BMP (abréviation de Bitmap) est format d'image développé par les entreprises Microsoft et IBM pour les systèmes d'exploitation Windows ou d'OS/2. Les format BMP de Windows 2.x et OS/2 1.x sont identiques, par contre les versions suivantes de BMP ont des structures de données totalement différent entre les versions Bitmap d'OS/2 et du Bitmap de Windows. Dans les deux cas, le format Bitmap est un format à usage général pour l'entreposage de bitmaps indépendants du périphérique (appelés DIB pour faire court). Il est le plus souvent utilisé pour entreposer des images générées pour un écran et pour la numérisation d'image. Sa conception de base en fait un bon format à usage général pouvant être utilisé pour l'entreposage d'images en couleur ou en noir et blanc si la taille du fichier n'est pas un facteur. Ses principales vertus sont sa simplicité et son large soutien sur le marché des micro-ordinateurs PC.
Structure d'entête du fichier du format Bitmap de Windows
La structure de l'entête est définit dans le fichier d'entête de langage de programmation C appelé «windows.h» du SDK de Windows. La structure d'entête du fichier est situé au début de chacun des fichiers Bitmap de Windows et contient les informations suivantes :
Déplacement | Taille | Description |
---|---|---|
0 | 2 octets | Ce champ permet d'indiquer la signature «BM» |
2 | 2 octets | Ce champ permet d'indiquer la taille de la structure d'information. |
4 | 4 octets | Ce champ est réservé. |
8 | 4 octets | Ce champ permet d'indiquer le déplacement en bits |
12 | 4 octets | Ce champ permet d'indiquer la taille de l'image de Bitmap |
16 | 4 octets | Ce champ permet d'indiquer la largeur du Bitmap. |
20 | 4 octets | Ce champ permet d'indiquer la hauteur du Bitmap. |
24 | 1 mot | Ce champ permet d'indiquer le nombre de plages. |
26 | 1 mot | Ce champ permet d'indiquer le nombre de bits par pixel. |
28 | 4 octets | Ce champ permet d'indiquer le type de compression. |
32 | 4 octets | Ce champ permet d'indiquer la taille de l'image. |
36 | 4 octets | Ce champ permet d'indiquer l'échelle de pixel par mètre à l'horizontale. |
40 | 4 octets | Ce champ permet d'indiquer l'échelle de pixel par mètre à la verticale. |
44 | 4 octets | Ce champ permet d'indiquer le nombre de couleurs indexées dans la table des couleurs. |
48 | 4 octets | Ce champ permet d'indiquer le nombre de couleurs indexées requis pour afficher le Bitmap. |
Structure d'un fichier du format Bitmap d'OS/2
Les fichiers Bitmap d'OS/2 se produisent dans deux révisions principales (v1.x et v2.x) et dans six variantes différentes : Bitmap, Bitmap Array, Icône, Icône couleur, Pointeur et Pointeur couleur. Le fichier BMP typique contient quatre sections de données : l'entête de fichier (FileHeader), l'entête Bitmap (BitmapHeader), la palette de couleurs (ColorPalette) et les données Bitmap (BitmapData).
Structure d'entête du fichier du format Bitmap d'OS/2 (FileHeader)
La structure de données de l'entête est documenté dans le IBM Developer's Toolkit for OS/2 Warp et le Presentation Manager Software Development Kit proposé par l'entreprise IBM. La structure d'entête du format Bitmap d'OS/2 commencent par une structure d'entête de fichier situé au début du fichier et ayant une longueur de 14 octets. La structure d'entête de fichier à donc le format suivant :
Déplacement | Taille | Description | ||
---|---|---|---|---|
0 | 2 octets | Ce champ permet d'indiquer la valeur des signatures reconnus : | ||
Valeur | Valeur numérique | Description | ||
"BA" | 4142h | Cette valeur permet d'indiquer un Bitmap Array. | ||
"BM" | 4D42h | Cette valeur permet d'indiquer un Bitmap. | ||
"CI" | 4943h | Cette valeur permet d'indiquer un icône couleur. | ||
"CP" | 5043h | Cette valeur permet d'indiquer un pointeur de souris couleur. | ||
"IC" | 4349h | Cette valeur permet d'indiquer un icône. | ||
"PT" | 5450h | Cette valeur permet d'indiquer un pointeur. | ||
2 | 4 octets | Ce champ permet d'indiquer la taille du fichier en octets. | ||
6 | 2 octets | Ce champ permet d'indiquer la coordonnée X du point centrale. | ||
8 | 2 octets | Ce champ permet d'indiquer la coordonnée Y du point centrale. | ||
10 | 4 octets | Ce champ permet d'indiquer la position de départ des données d'image en octets, soit entre le début du fichier et les données de pixel correspondant à l'entête. |
Si votre application utilise uniquement des fichiers BMP de signature «BM», assurez-vous de toujours vérifier ce champ avant d'essayer d'utiliser l'une des données lues dans le fichier. Le champ de taille contient la taille combinée de l'entête de fichier (FileHeader) plus l'entête Bitmap (BitmapHeader) en octets. Cette valeur est généralement nulle dans de nombreux fichiers Bitmap. Les point centrales sont relatives au coin inférieur gauche du Bitmap. S'il n'y a pas de coordonnée centrale, ces valeurs seront nulles. Ces valeurs ne sont pas utilisées dans les fichiers Bitmap et des tableaux matriciels.
Structure de l'entête Bitmap d'IBM OS/2 1.x (BitmapHeader)
Après la structure d'entête du fichier du format Bitmap d'OS/2 (FileHeader) dans les fichiers BMP v1.x se trouve un deuxième entête appelé entête Bitmap (BitmapHeader). Cet entête contient des informations spécifiques aux données Bitmap. Cet entête fait 12 octets et a le format suivant :
Déplacement | Taille | Description |
---|---|---|
0 | 4 octets | Ce champ permet d'indiquer la taille de l'entête Bitmap (BitmapHeader) en octets. |
4 | 2 octets | Ce champ permet d'indiquer la largeur de l'image en pixels. |
6 | 2 octets | Ce champ permet d'indiquer la hauteur de l'image en pixels. |
8 | 2 octets | Ce champ permet d'indiquer le nombre de plans de couleur. |
10 | 2 octets | Ce champ permet d'indiquer le nombre de bits par pixel. |
La taille contient la taille de l'entête en octets. Pour les fichiers BMP OS/2 1.x, cette valeur est toujours 12. La largeur et la hauteur sont respectivement la largeur et la hauteur de l'image en pixels. La largeur n'inclut aucun remplissage de limite de ligne de balayage. Le nombre de plans de couleur contient une représentation des données Bitmap. Les fichiers Bitmap d'OS/2 ne contiennent qu'un seul plan de couleur, cette valeur est donc toujours 1. La taille apparente d'un plan en bits est calculée par la formule mathématique suivante :
Largeur x Hauteur x Bits par pixel = Taille d'un plan en bits |
La taille réelle d'un plan comprend le remplissage de la ligne de balayage. Le nombre de bits par pixels contient une valeur comprise entre 1 et 24; les valeurs 1, 4, 8 et 24 sont les seules valeurs considérées comme autorisé par l'API OS/2 1.x.
Structure de la palette de couleur d'OS/2 v1.x (ColorPalette)
Après l'entête Bitmap se trouvent les données de la palette de couleurs. Une palette de couleurs est toujours présente dans un fichier BMP si les données Bitmap contiennent des données 1, 4 ou 8 bits. Les données bitmap à 24 bits n'utilisent jamais de palette de couleurs (et n'en ont jamais besoin). Chaque élément de la palette a une longueur de trois octets et a la structure suivante :Déplacement | Taille | Description |
---|---|---|
0 | 1 octet | Ce champ permet d'indiquer la composante de bleu. |
1 | 1 octet | Ce champ permet d'indiquer la composante de vert. |
2 | 1 octet | Ce champ permet d'indiquer la composante de rouge. |
La composante de bleu, de vert et de rouge contiennent les valeurs des composantes de couleur pour un pixel, chacune dans la plage de 0 à 255. La taille de la palette de couleurs est calculée à partir de la valeur de bits par pixel. La palette de couleurs a 2, 16, 256 ou 0 entrées pour un bits par pixel de 1, 4, 8 et 24, respectivement. Le nombre d'entrées de palette de couleurs est calculé selon la formule mathématique suivante :
1 << Bits par pixel = Nombre d'entrées |
Pour détecter la présence d'une palette de couleurs dans un fichier Bitmap (plutôt que de simplement supposer qu'une palette de couleurs existe), vous pouvez calculer le nombre d'octets entre l'entête Bitmap et les données Bitmap et diviser ce nombre par la taille d'un seul élément de palette. En supposant que votre code est compilé en utilisant l'alignement des éléments de structure à 1 octet, le calcul en langage de programmation C aura l'aspect suivant :
NumberOfEntries = (BitmapOffset - sizeof(OS2BMPFILEHEADER) - sizeof(OS21XBITMAPHEADER)) / sizeof(OS21XPALETTEELEMENT);
Si NumberOfEntries est égal à zéro, il n'y a pas de données de palette, sinon vous avez le nombre d'éléments dans la palette de couleurs.
Structure de l'entête Bitmap d'IBM OS/2 2.x (BitmapHeader)
Les fichiers Bitmap version 2.x commencent par le même entête de 14 octets que les fichiers Bitmap v1.x avec des champs plus grand. L'entête du fichier est également suivi d'un entête Bitmap, étant une version étendue de l'entête bitmap v1.x. Il est généralement de 64 octets et contient jusqu'à 14 champs supplémentaires :
Déplacement | Taille | Description | |
---|---|---|---|
0 | 4 octets | Ce champ permet d'indiquer la taille de l'entête Bitmap (BitmapHeader) en octets. | |
4 | 4 octets | Ce champ permet d'indiquer la largeur de l'image en pixels. | |
8 | 4 octets | Ce champ permet d'indiquer la hauteur de l'image en pixels. | |
12 | 2 octets | Ce champ permet d'indiquer le nombre de plans de couleur. | |
14 | 2 octets | Ce champ permet d'indiquer le nombre de bits par pixel. | |
16 | 4 octets | Ce champ permet d'indiquer le schéma de compression selon les valeurs suivantes : | |
Valeur | Description | ||
0 | Cette valeur permet d'indiquer que les données ne sont pas compressées. | ||
1 | Cette valeur permet d'indiquer que l'algorithme RLE de 8 bits est utilisé. | ||
2 | Cette valeur permet d'indiquer que l'algorithme RLE de 4 bits est utilisé. | ||
3 | Cette valeur permet d'indiquer que l'algorithme Huffman 1D est utilisé. | ||
4 | Cette valeur permet d'indiquer que l'algorithme RLE de 24 bits est utilisé. | ||
20 | 4 octets | Ce champ permet d'indiquer la taille des données Bitmap en octets. | |
24 | 4 octets | Ce champ permet d'indiquer la résolution X du périphérique d'affichage. | |
28 | 4 octets | Ce champ permet d'indiquer la résolution Y du périphérique d'affichage. | |
32 | 4 octets | Ce champ permet d'indiquer le nombre de couleurs que la table d'indice utilise. | |
36 | 4 octets | Ce champ permet d'indiquer le nombre de couleurs d'indice importante. | |
40 | 2 octets | Ce champ permet d'indiquer le type d'unité utilisé pour la mesure de résolution. | |
42 | 2 octets | Ce champ permet d'indiquer l'alignement de 4 octets. | |
44 | 2 octets | Ce champ permet d'indiquer l'algorithme d'enregistrement. | |
46 | 2 octets | Ce champ permet d'indiquer l'algorithme de demi-teintes à utilisé. | |
48 | 4 octets | Ce champ permet d'indiquer la taille 1 de l'algorithme de demi-teintes. | |
52 | 4 octets | Ce champ permet d'indiquer la taille 2 de l'algorithme de demi-teintes. | |
56 | 4 octets | Ce champ permet d'indiquer le modèle de couleur utilisé pour le Bitmap. | |
60 | 4 octets | Ce champ permet d'indiquer une valeur utilisé pour les applications. |
La taille contient la taille de l'entête en octets. Cet entête peut varier en taille, le programmeur doit donc faire attention à ne lire que le nombre d'octets indiqué par cette valeur. Les champs non inclus dans la valeur de taille ne sont pas entreposés dans le fichier BMP et leurs valeurs sont supposées être nulles. Par exemple, si la taille est 16, alors seuls les cinq premiers champs (16 octets) de l'entête sont présents. La palette de couleurs commencera à partir du 17ième octet. Si la taille est de 40, seuls les onze premiers champs sont présents. Si cette valeur est 64, alors l'entête entier est présent dans le fichier. Une valeur supérieure à 64 indique une version ultérieure du format Bitmap d'OS/2. La largeur et la hauteur sont respectivement la largeur et la hauteur de l'image en pixels. La largeur n'inclut aucun remplissage de limite de ligne de balayage. Le nombre de plans contient le nombre de plans de couleur utilisés pour représenter les données Bitmap. Les fichiers Bitmap d'OS/2 ne contiennent qu'un seul plan de couleur, cette valeur est donc toujours 1. La taille apparente d'un plan en bits est calculée par la formule mathématique suivante :
Largeur x Hauteur x Bits par pixel = Taille d'un plan en bits |
La taille réelle d'un plan comprend le remplissage de la ligne de balayage. Les bits par pixel contient le nombre de bits par pixel dans chaque plan. Cette valeur est comprise entre 1 et 24; les valeurs 1, 4, 8 et 24 sont les seules valeurs considérées comme autorisés par l'API OS/2 2.x. La compression indique le type de méthode de codage utilisé pour compresser les données bitmap. La valeur 0 indique que les données ne sont pas compressées; 1 indique que l'algorithme RLE de 8 bits a été utilisé; 2 indique que l'algorithme RLE 4 bits a été utilisé; 3 indique que l'algorithme Huffman 1D a été utilisé; et 4 indique que l'algorithme RLE 24 bits a été utilisé. La taille des données d'image est la longueur des données de pixels en octets, telle qu'elle est entreposée dans le fichier. Cette valeur peut être nulle pour les Bitmaps non compressés, auquel cas la taille du Bitmap est calculée à partir de la formule suivante :
Largeur x Hauteur x Bits par Pixel = Taille du Bitmap |
Cette valeur peut ne jamais être nulle pour les Bitmaps non compressés. Les résolution X et résolution Y sont les résolutions horizontales et verticales du Bitmap. Ces valeurs sont utilisées pour aider le programmeur Bitmap à choisir une résolution appropriée lors de l'impression ou de l'affichage d'un fichier Bitmap. Les unités utilisées pour les valeurs de ces champs sont définies dans le champ de type d'unités. Le nombre de couleurs que la table d'indice est le nombre de couleurs présentes dans la palette. Si cette valeur est nulle et que la valeur de bits par pixel est inférieure à 16, le nombre d'entrées est égal à la taille maximale possible pour la carte de couleurs. Les fichiers Bitmap avec une valeur de bits par pixel de 16 ou plus n'auront pas de palette de couleurs. Cette valeur est calculée en utilisant la valeur du champ de bits par pixel :
1 << Bits par pixel = couleur utilisé |
La couleur d'indice importante est le nombre de couleurs significatives dans la palette, déterminé par leur fréquence d'apparition dans les données Bitmap; plus l'occurrence d'une couleur est fréquente, plus elle est importante. Ce champ est utilisé pour fournir un affichage aussi précis que possible lorsque vous utilisez du matériel graphique prenant en charge moins de couleurs que celles définies dans l'image. Par exemple, une image 8 bits avec 142 couleurs peut n'avoir qu'une douzaine de couleurs constituant l'essentiel de l'image. Si ces couleurs pouvaient être identifiées, un adaptateur d'affichage avec une capacité de 16 couleurs seulement pourrait afficher l'image avec plus de précision en utilisant les 16 couleurs les plus fréquentes de l'image. Les couleurs les plus importantes sont toujours entreposées en premier dans la palette; la couleur d'indice importante est 0 si toutes les couleurs de la palette doivent être considérées comme importantes. Le type d'unités contient les valeurs des champs de résolution X et de résolution Y. La seule valeur valide est 0, indiquant les pixels par mètre. Le champ d'alignement de 4 octets est toujours défini sur une valeur de zéro. L'algorithme d'enregistrement spécifie comment les lignes de balayage Bitmap sont entreposées. La seule valeur valide pour ce champ est 0, indiquant que le Bitmap est entreposé de gauche à droite et de bas en haut, l'origine étant dans le coin inférieur gauche de l'écran. L'algorithme de demi-teintes contient les données Bitmap. Une valeur de 0 indique qu'aucun algorithme de demi-teintes n'a été utilisé; 1 indique la demi-teinte de diffusion d'erreur; 2 indique l'algorithme de traitement pour l'acquisition de documents non codés (PANDA); et 3 indique un demi-cercle super-cercle. La taille 1 et la taille 2 sont des champs sont réservés uniquement par l'algorithme de demi-teintes. Si la demi-teinte de diffusion d'erreur est utilisée, la taille 1 correspond à l'amortissement d'erreur sous forme de pourcentage compris entre 0 et 100. Une valeur de 100% indique l'absence d'amortissement et une valeur de 0% indique qu'aucune erreur n'est diffusée. La taille 2 n'est pas utilisée par les demi-teintes de diffusion d'erreur. Si PANDA ou demi-teintes super-cercle est spécifié, la taille 1 est la dimension X et la taille 2 est la dimension Y du motif utilisé en pixels. Le modèle de couleur contient la définition des données Bitmap. La seule valeur valide est 0, indiquant le schéma de codage RVB (Rouge-Vert-Bleu). La valeur d'application est un champ réservé à l'utilisation de l'application et peut contenir une valeur spécifique à l'application.
Structure de la palette de couleur d'OS/2 v2.x (ColorPalette)
La palette de couleurs pouvant suivre l'entête Bitmap est fondamentalement la même que la palette v1.x, mais ajoute un octet supplémentaire de remplissage pour augmenter sa taille à 4 octets. Cette situation permet aux entrées de palette d'être lues comme des valeurs de 4 octets, ce qui rend ces valeurs plus efficaces à lire en mémoire et plus faciles à voir dans un vidage hexadécimal ou un débogueur.
Déplacement | Taille | Description |
---|---|---|
0 | 1 octet | Ce champ permet d'indiquer la composante de bleu. |
1 | 1 octet | Ce champ permet d'indiquer la composante de vert. |
2 | 1 octet | Ce champ permet d'indiquer la composante de rouge. |
3 | 1 octet | Ce champ permet d'indiquer vaut toujours 0. |
Le bleu, le vert et le rouge contiennent les valeurs des composantes de couleur pour un pixel, chacune dans la plage de 0 à 255. La valeur réservé remplit la structure pour se terminer sur une limite d'octets pairs et est toujours 0. Lors de l'identification des fichiers Bitmap, vous devez vous assurer que les deux premiers octets du fichier sont 4Dh 42h et lire uniquement le nombre d'octets de l'entête du Bitmap comme indiqué par le champ de taille. Cette valeur sera 12 pour les fichiers Bitmap d'OS/2 1.x et inférieure ou égale à 64 pour les fichiers Bitmap d'OS/2 2.x. L'entête du fichier est identique pour les deux versions; la seule différence dans l'entête Bitmap est que les champs de largeur et de hauteur sont des mots (2 octets) dans les fichiers v1.x et des doubles mots (4 octets) dans les fichiers v2.x.
Remarques
- La structure des fichiers au format BMP est étroitement liée à l'API d'OS/2 et à l'API de Windows. À cet égard, le format .BMP n'a jamais été conçu pour être un format portable ou utilisé pour l'échange de données Bitmap entre différents systèmes d'exploitation. Comme chacune de ces API de système d'exploitation a changé, le format .BMP a changé avec elles.
- Bien que le format soit un concurrent directe des systèmes d'exploitation Linux, il existe de nombreuses bibliothèques de fonctions offrant la possibilité de lire ou d'écrire des fichiers de ce format. Par exemple, il existe la bibliothèque SDL/SDL.h avec les fonctions SDL_LoadBMP et SDL_SaveBMP.
- Toutes les versions de BMP proviennent de machines basées sur des microprocesseurs de la famille Intel et partagent donc un héritage commun Petit-boutiste (Little-endian). Le format BMP actuel est par ailleurs indépendant du matériel et peut accueillir des images avec des couleurs allant jusqu'à 24 bits.
- Il existe actuellement deux versions de BMP sous OS/2 (1.x et 2.x) et six variantes; deux avec l'extension de fichier .ICO, deux avec .PTR et deux avec .BMP.
- La méthode de compression utilisée est un type d'encodage de longueur d'exécution (RLE), bien que la plupart des fichiers BMP à ce jour aient été entreposé en format non compressés. Bien que le schéma BMP RLE soit sans perte et rapidement décompressé, il n'est pas considéré comme une méthode de compression supérieure.
Exemple
Voici un exemple montrant la structure de ce format suivant en Turbo Pascal 7 :
Voir également
Index des extensions de fichier - Format d'icône pour Windows (.ICO)
Langage de programmation - C pour Windows - Structure de données de Windows - «BITMAPINFOHEADER»
Index des extensions de fichier - Format de fichier compressé pour Windows (.CAB)
Langage de programmation - Traitement d'image - Accueil