Formation I.S.N.

Le format Portable Bitmap

Le format Portable Bitmap est un format d'image non compressé, que l'on peut éditer comme un simple fichier texte. Ainsi, l'image représentée à gauche est transcrite par le fichier texte de droite.

  • On peut visualiser l'image avec les logiciels IrfanView, Inkscape, Gimp...
    IrfanView permet de voir les pixels en zoomant après avoir décoché l'onglet [Use Resample for zooming] dans le menu [View] -> [Display options].
  • On peut travailler sur l'image en utilisant un simple éditeur de texte comme Geany ou Notepad++. Le fichier texte au format ASCII comporte un en-tête de 2 ou 3 lignes.
  • Sur la 1ère ligne, on trouvera :
    • P1 pour les images noir et blanc au format .pbm.
    • P2 pour les images en niveaux de gris au format .pgm.
    • P3 pour les images en couleurs au format .ppm.
  • Sur la 2ème ligne, on trouvera la largeur et la hauteur de l'image (en pixels et en base 10), séparées par un espace.
  • Sur la 3ème ligne, pour les formats .pgm et .ppm, on trouvera la valeur maximale estimée pour les niveaux de gris ou l'intensité de chaque couleur au format RVB (Ce sera souvent 255 par défaut) En résumé, les en-têtes seront de la forme :
    Fichier N&B .pbm Fichier gris .pgm Fichier couleur .ppm

    P1
    50 50 # largeur hauteur
     

    P2
    50 50 # largeur hauteur
    255 # intensité max

    P3
    50 50 # largeur hauteur
    255 # intensité max

  • Des commentaires peuvent être introduits en les précédents du symbole «dièse» #.
  • Enfin, on écrit la liste des « couleurs » des pixels ligne par ligne, de gauche à droite et de haut en bas (Attention, aucune ligne ne doit dépasser 70 caractères et les retours à la ligne sont considérés comme des espaces).

Passer de l'image au texte et vice-versa

Les fichiers au format Portable Bitmap peuvent être un bon support pour travailler la notion de « poids » d'un fichier. On présente ci-dessous une activité donnée aux élèves qui va dans ce sens. Deux autres activités sont disponibles dans cette page de la formation .

Les calculs réalisés seront forcément approchés : ils ne prennent pas en compte (entre autres) le poids engendré par le format (le suffixe, l'extension) du fichier...
A cela, il ne faut pas oublier le fait qu'un kilo-octet n'est pas égal à 1000 octets, mais ça facilite le calcul mental :D .

Poids d'une image en Noir & Blanc

  1. Ouvrez un éditeur de texte.
  2. Copiez/collez le texte ci-dessous :
    P1
    25 17
    1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1
    1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
    1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1
    1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1
    1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1
    1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1
    1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1
    1 0 0 0 0 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1
    1 0 0 0 0 0 1 1 1 0 1 1 1 1 1 0 1 1 1 0 0 0 0 0 1
    1 0 0 0 0 1 1 0 0 0 0 1 1 1 0 0 0 0 1 1 0 0 0 0 1
    1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1
    1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1
    1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1
    1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
    1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1
    1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
  3. Enregistrez sous essai.pbm.
  4. Ouvrez ce fichier avec un logiciel permettant d'interprêter les images au format Portable Bitmap.
  5. Chaque pixel (même au format .pbm) est codé sur un octet. Anticipez le «poids» de cette image en octets.
  6. Vérifiez ce poids en affichant les propriétés du fichier essai.pbm.
  7. En cliquant sur ce lien, on télécharge le fichier essai2.pbm. Vérifiez que l'image affichée est la même que la précédente mais que son poids en octets est presque divisé par deux. Pourquoi ?
  • Afficher l'image
  • Poids de l'image n°1
  • Poids de l'image n°2

L'image n°1 comporte 25*17 = 425 pixels.
Chaque pixel étant codé sur un octet, on peut anticiper un poids d'environ 425 octets...

En fait, lorsqu'on affiche les propriétés du fichier, on obtient (selon les systèmes d'exploitation) un peu plus du double : 876 octets sous Windows par exemple. Cela provient de deux oublis :

  • Le poids de l'en-tête ;
  • Les espaces (et sauts à la ligne). Il y a (presque) autant d'espaces que de pixels encodés. Or un espace est codé sur un octet (c'est un caractère ASCII) et, lors de la créations d'un fichier texte sous Windows, un saut à la ligne est codé sur deux octets (un seul sous système Unix).

Cela explique le poids plus que doublé par rapport à l'estimation.

Calculons plus rigoureusement

Lorsqu'on édite le fichier essai.pbm à l'aide d'un éditeur hexadécimal, on obtient l'affichage suivant :

On peut constater que, sous Windows, le saut à la ligne est codé par les deux valeurs hexadécimales 0D 0A alors que l'espace est codé par la valeur 20. D'où les calculs suivants :

  • Nombre de pixels : 25*17 = 425
  • Nombre d'espace entre les pixels : 24*17 = 408
  • En-tête : 7 (y compris l'espace de la deuxième ligne)
  • Passages à la ligne : 18*2

Le fichier essai2.pbm ne comporte aucun espace dans son interprêtation ASCII ; on retrouve alors un poids de 468 octets sous Windows :

  • Nombre de pixels : 25*17 = 425
  • Nombre d'espace entre les pixels : 0
  • En-tête : 7 (y compris l'espace de la deuxième ligne)
  • Passages à la ligne : 18*2