Source : ct|02.06.08
< Tutoriels Informatique, Multimédia, Chinois
Une image bitmap indépendante du matériel (Device Independant Bitmap ou DIB) peut être créée avec Paint, puis sauvegardée sous forme d’un fichier au format bmp. Elle peut aussi être créée, pixel par pixel, avec un éditeur hexadécimal. Pour étudier le format bmp, en résolution 24 bits par pixel, nous allons utiliser un exemple.
Créez puis sauvegardez, à l’aide de Paint, avec le nom "essai5.bmp" par exemple, un bitmap de 5 pixels x 5 pixels de couleur rouge (avec une résolution graphique de 24 bits par pixel).
Ouvrez ce fichier "essai5.bmp" avec un éditeur hexadécimal. Vous verrez l'ensemble des octets, qui peuvent être séparés en 3 parties successives :
- Une partie en-tête de fichier (indiquée en rouge);
- Une partie en-tête d’information sur l’image (indiquée en bleu);
- Une partie de description de chaque pixel (indiquée en vert).
Ce fichier comprend un total de 134 octets (16 lignes de 8 octets + 1 ligne de 6 octets. 16x8+6=134 octets). Les composantes de couleur RVB de chaque pixel sont marquées selon l'ordre B, V puis R (00 00 FF).
La première partie, l’en tête de fichier, comprend 14 octets. Elle contient de l’information sur le type et sur la taille du fichier :
42 4D 86 00 00 00 00 00 00 00 36 00 00 00
typedef struct tagBITMAPFILEHEADER
{
42 4D: type de fichier (BM)
86 00 00 00 : taille du fichier
00 00 : 2 octets réservés (zéro)
00 00 : 2 octets réservés (zéro)
36 00 00 00 : décalage des bits de pixels
} BITMAPFILEHEADER;
- La taille du fichier fait ici 134 octets(&H86=16*8+6=134).
- Le décalage des bits de pixels par rapport au début du fichier est ici égal à 54(&H36 en hexadécimal = 54 en décimal ; Comme vous pouvez le vérifier, il y a bien 54 octets avant le premier octet 00 relatif aux pixels.
La seconde partie, l’en tête d’information sur l’image, fait 40 octets. Elle contient des informations sur les dimensions et le format de couleur de l’image.
28 00 00 00 05 00 00 00
05 00 00 00 01 00 18 00
00 00 00 00 50 00 00 00
C4 0E 00 00 C4 0E 00 00
00 00 00 00 00 00 00 00
typedef struct tagBITMAPINFOHEADER
{
28 00 00 00 : taille de la structure
05 00 00 00 : largeur de l’image en pixels
05 00 00 00 : hauteur de l’image en pixels
01 00 : nombre de plans pour le rendu
18 00 : nombre de bits par pixels
00 00 00 00 : type de compression
50 00 00 00 : nombre d’octets dans l’image
C4 OE 00 00 : résolution horizontale
C4 OE 00 00 :résolution verticale
00 00 00 00 : nombre de couleurs utilisées
00 00 00 00 : nombre de couleurs importantes
} BITMAPINFOHEADER;
La taille de la structure BITMAPINFOHEADER est de 40 octets (&H28=40); La largeur de l’image, dans notre exemple, et sa hauteur sont de 5 pixels; Le nombre de plans pour le rendu doit être égal à 1; Le nombre de bits par pixels, dans notre exemple, est égal à 24 (&H18=24); Le type de compression est égal à 0, car le fichier n’est pas compressé; Le nombre d’octets dans l’image, dans notre exemple, est égal à 80 (&H50=80). En effet, il y a 5 lignes contenant chacune 5 pixels et un octet 00 de fin de ligne. Il y a 3 octets par pixels, soient ((5*3)+1)*5=80; Les résolutions horizontale et verticale, en pixels par mètre pour le rendu, sont égales à C4 0E en valeur hexadécimal; Pour le nombre de couleurs utilisées, la valeur zéro indique que le bitmap peut utiliser un nombre maximum de couleurs; Le nombre de couleurs importantes indique le nombre de couleurs indexées requises pour pouvoir afficher le bitmap. Si cette valeur est à zéro, toutes les couleurs sont requises.
La troisième partie est consituée de la description des couleurs des pixels constituant l'image. Dans cette partie, les pixels sont décrits dans l'ordre inverse de leur affichage à l'écran. Les pixels associés à la dernière ligne apparaissent en premier et les pixels associés à la première ligne apparaissent en dernier dans le fichier. La taille de cette partie est variable car elle dépend de la taille de l'image.
0000FF 0000FF 0000FF 0000FF 0000FF 00
1ère ligne fichier <-> 5ème ligne écran
0000FF 0000FF 0000FF 0000FF 0000FF 00
2ème ligne fichier <-> 4ème ligne écran
0000FF 0000FF 0000FF 0000FF 0000FF 00
3ème ligne fichier <->3ème ligne écran
0000FF 0000FF 0000FF 0000FF 0000FF 00
4ème ligne fichier <-> 2ème ligne écran
0000FF 0000FF 0000FF 0000FF 0000FF 00
5ème ligne fichier <-> 1ère ligne écran
Chaque ligne décrit les pixels en allant de la gauche vers la droite de l'image. La longueur de chaque ligne doit être un multiple de 4 octets, c'est pourquoi des octets 00 sont ajoutés, à la fin de chaque ligne de pixels, dans le fichier.
Soient :
X : le nombre d'octets par ligne, dans le fichier;
N : le nombre de pixels par lignes sur l'écran;
C : le nombre d'octets complémentaires 00 dans le fichier, tel que X soit un multiple de 4;
Nous avons X = N x 3 + C = 16 x i, avec i nombre entier naturel.
Nous avons ici X = 5 x 3 + 1 = 16. Il n'y a donc qu'un seul octet complémentaire, car 16 est un multiple de 4.
Dans notre exemple (image toute rouge) les composantes RVB de chaque pixel sont les suivantes :
- Composante bleu (B=00) : 0*16 + 0 = 0;
- Composante vert (V=00) : 0*16 + 0 = 0;
- Composante rouge (R=FF) : 15*16 + 15 = 255.
Ouvrez le fichier avec un éditeur hexadécimal. Modifier les couleurs de pixels de rouge à vert, en remplaçant les octets 00 00 FF par 00 FF 00. Laissez l'octet 00 supplémentaire à la fin de chaque ligne.
Enregistrez le nouveau fichier ainsi créé avec le nom "essai1.bmp" par exemple. Puis ouvrez le avec Paint. Tous les pixels de l'image sont maintenant verts. C'est bien le résultat attendu.
© http://turrier.fr (2007) |