Avec ce blog, je souhaite faire partager quelques une des astuces sur la photo numérique que j'ai collecté par-ci par là depuis quelques années. J'espère vivement que vous y trouverez votre bonheur ! En attendant quelles arrivent, sachez déjà que certaines des astuces que je m'apprète à vous dévoiler m'ont sauvé la vie ... enfin pas quand même... mais on se comprend, n'est-ce pas ?

jeudi 30 juin 2016

Le poids d'un bmp

Suite à la question de Unknown hier soir, il m'a semblé plus judicieux de faire un vrai post plutôt qu'une réponse dans les commentaires.

La question était, à propos de l'article Le vrai poids d'une image:

je veux calculer la taille d'une image en gris en octets d'une image 8*8 codée sur 4 bits ! comment je dois faire ?

Alors voilà ma réponse: 

1/ On est bien d'accord que vous souhaitez calculer le poids de l'image, c'est-à-dire la taille du fichier image en octets (et non la taille de l'image qui elle est en pixel)
2/ vous me parlez d'une image codée sur 4 bits: le format jpeg étant codé sur 8 bits (par couleur), j'en déduis que vous souhaitez calculer le poids d'une image au format bitmap 16 couleurs - BMP- (et non jpeg comme dans mon article), 4 bits équivalant à la profondeur de couleur
3/votre image fait 8 pixels sur 8 pixels (8*8)

Les images en 16 couleurs utilisent 4 bits par pixel (=> 8 bits - ou 1 octet- par pixel)


Dans ce cas le règle est la suivante (https://fr.wikipedia.org/wiki/Windows_bitmap):

"Pour calculer la taille approximative du fichier BMP final, on multiplie la profondeur couleurs (1, 4, 8, 16 ou 24 bits) par la hauteur et par la largeur en pixels : (Profondeur de couleurs en bits) × (Hauteur en pixels) × (Largeur en pixels) bits."

Ainsi, dans votre cas, la taille approximative du fichier final BMP est de 4x8x8=256 bits, soit 256/8=32 octets

Maintenant, pour l'exercice et par acquis de conscience, j'ai fait un test très simple: j'ai créé un bmp de 8x8 pixel, entièrement blanc et que j'ai enregistré en bmp 16 couleurs:





Et qu'est-ce qu'on remarque ? Que la taille du fichier fait 150 octets et non 32. Et là, j'avoue, ça m'a posé problème un moment.

Voilà donc les résultats de mes recherches:

1/ http://www.commentcamarche.net/contents/1200-bmp-format-bmp

Un fichier bmp contient plusieurs informations:  en plus de "l'image" elle-même le fichier possède:
- l'en-tête du fichier (en anglais file header)
- l'en-tête du bitmap (en anglais bitmap information header, appelé aussi information Header)
- et optionnellement la  palette de couleur utilisée



Évidemment, toutes ces informations ont un poids.
Exemple: L'entête du fichier est composé de quatre champs dont la signature (sur 2 octets), indiquant qu'il s'agit d'un fichier BMP.
L'entête du fichier, à elle seule fait 14 octets.
L'entête de l'image en fait 40.

Ces chiffres sont incompressibles. Nous avons donc déjà 54 octets à ajouter au 32 précédents. Ce qui nous fait 86.


Jusqu'à 150 il nous en manque donc 64.

2/  A partir de là, je ne fais que "transcrire" les infos de http://www.machaon.fr/isn/representation/Les%20fichiers%20images%20BMP.htm

=> à quoi ça ressemble réellement ces octets ?
Pour cela, j'ai ouvert mon image en hexadécimal; on peut le faire dans plusieurs logiciels: notepad++ avec l'extension appropriée, XnView, IrfanView. Pour que ce soit plus clair, j'ai choisi Notepad++; donc voilà:




Chaque "paire" de chiffre correspond à un octet. Si on compte gentiment, on a bien 150 paires et donc 150 octets.

Passons au décryptage: les 2 premiers octets (42 4d) correspondent à la signature "BM" en Asccii (c'est d'ailleurs écrit dans le Dump à côté)

L'octet suivant, 96, correspond au poids du fichier en hexadécimal => 150 en décimal


(http://sebastienguillon.com/test/javascript/convertisseur.html)

Les 2 octets valant 08 correspondent aux dimensions de l'image (en hexadécimal toujours, mais cela fait aussi 8 en décimal)

Le 01 qui suit est le nombre de plan (toujours à 1);

Le 04 correspond au nombre de bits par pixel c'est-à-dire à la profondeur de couleur.

Le 20 c'est la taille de l'image en octet en hexadécimal, soit 32 en décimal (tiens, tiens !)



Si je continue la transcription, la carte de l'image correspond au 32 derniers octets .

Les 64 restant correspondraient donc aux couleurs (un bmp 16 bits c'est en couleur):

 

Et effectivement, on retrouve les 16 couleurs du web (+ l'ajout de 2 octets par ligne pour être multiple de 4 ) => 16 x 4 = 64 => Le compte est bon !

00 00 00 00 => black + 00
00 00 80 00 => navy + 00
00 80 00 00 => green + 00
00 80 80 00 => teal + 00
80 00 00 00 => maroon + 00
80 00 80 00 => purple + 00
80 80 00 00 => olive + 00
80 80 80 00 => gray + 00
c0 c0 c0 00 => silver + 00
00 00 ff 00 => blue + 00
00 ff 00 00 => lime + 00
00 ff ff 00 => aqua /cyan + 00
ff 00 00 00 => red + 00
ff 00 ff 00 => fuchsia /magenta + 00
ff ff 00 00 => yellow + 00
ff ff ff 00 => white + 00



 

J'espère que tout cela aura pu répondre à la question.

Bonne nuit !

NS

3 commentaires: