Le mystère du BGR ...

 

Les couleurs d'un BMP sont encodés BGR, mais pourquoi ?

 

En fait, tout ceci est lié à la méthode de stockage des données dans les micro-processeur intel.

 

1 byte = 8 bits (c'est un octet quoi !): la valeur pourra alors varier entre 0 et 255 (non signé !)

1 word = 2 bytes (c'est un mot...): la valeur sur 16 bits va varier entre 0 et 65535 (toujours non signé !)

1 mot long est sur 32 bits et est composé de 2 mots...

et ainsi de suite, mais cela n'est pas important ici...

Revenons à au word: composé de 2 octets, ces 2 octets portent chacun un nom:

Il y a l'octet de poids fort et l'octet de poids faible.

L'octet de poids fort est celui qui s'incrémente de 1 lorsque l'octet de poids faible à fait un tour complet (de 0 à 255). Ce qui veut dire que pour avoir 256, l'octet de poids faible repassera à 0 et l'octet de poids fort passera à 1...et ainsi de suite.

Pour calculer un nombre 16 bits, il suffit donc de faire octet poids fort * 256 + octet poids faible...

Et on fait de même avec un mot long:

mot de poids fort * 256 + mot de poids faible...

 

Seulement voilà, chez intel, le codage d'un nombre sur 16 bits se code: poids faible/poids fort.

et donc même chose pour un mot long: mot de poids faible/mot de poids fort

donc si on regarde bien, un mot long s'écriera:

octet poids faible (du mot de poids faible)/octet poids fort (du mot de poids faible)/octet poids faible (du mot de poids fort)/octet poids fort (du mot de poids fort)

C'est bon, vous avez suivi ??? Non, alors relisez plus calmement...

Or les composantes RVB sont chacunes sur 1 octet à l'écran. Avec en plus l'alpha nous lisons (hors machine) les composantes de couleurs de gauche à droite: alpha-R-V-B...Pour dessiner un point nous écrivons donc cette information de cette manière dans notre machine.

Les composantes écrites dans l'ordre alpha-R-V-B représenterons pour nous aussi un mot long (4 octets obliges) avec:

alpha qui serait l'octet poids fort (du mot de poids fort)

R qui serait octet poids faible (du mot de poids fort)

V qui serait octet poids fort (du mot de poids faible )

B qui serait octet poids faible (du mot de poids faible )

 

Mais pour une machine à base d'intel, il faut respecter en interne l'ordre du poids fort et du poids faible. En reprenant le codage intel :

octet poids faible (du mot de poids faible)/octet poids fort (du mot de poids faible)/octet poids faible (du mot de poids fort)/octet poids fort (du mot de poids fort).

L'information AlphaRVB sera recodée et nous obtenons bien BVRalpha...

alpha n'étant pas stocké dans un BMP

BVRx

Lors de la sauvegarde de l'image, Microsoft n'a fait que relire la mémoire de la machine, et donc l'ordre de codage d'Intel est ainsi concervé dans le fichier. D'où ce codage bizrarre en lisant le contenu du fichier...

cqfd !