Épreuve pratique NSI

Sujet n° 1 · Session 2026 · 1 heure

Compresser une image en niveaux de gris

Une image en niveaux de gris devient une liste d'octets, que l'on compresse en remplaçant chaque suite de valeurs identiques par un couple (compte, valeur). Le candidat écrit le décodage, puis découvre pourquoi la grande image ressort tronquée.

  • Listes
  • Compression RLE
  • Octets
  • Fichiers binaires
  • Cas limites

Mise en situationLe codage RLE

Une image en niveaux de gris est vue comme la liste des valeurs de ses pixels, entre 0 (noir) et 255 (blanc), ligne par ligne. Les dessins et schémas présentent de grandes zones d'un même gris : on remplace donc chaque suite de valeurs identiques par un couple (compte, valeur), et la liste de couples est elle-même aplatie en [compte1, valeur1, compte2, valeur2, ...]. C'est le codage RLE (run-length encoding).

Par exemple, [4, 4, 4, 0, 5, 5] contient trois fois 4, une fois 0 puis deux fois 5 : son codage RLE est [3, 4, 1, 0, 2, 5]. La liste [0, 0, 0, 0, 0] donne [5, 0], plus courte.

Toutes les cellules de cette page partagent le même Python, comme un notebook : une fonction écrite à une question sert aux suivantes. Maj + Entrée exécute la cellule.

Pour l'examinateur

Repère

Les images décodées s'affichent sous la cellule qui les crée, ce qui rend visible l'image tronquée de la question 3.

1

Question 1Plus court, vraiment ?

Déterminer si la liste obtenue par codage RLE est forcément de longueur inférieure ou égale à la liste de départ.

La fonction codage_rle du fichier réalise le codage :

Appel professeur

À demander au candidat

  1. Donnez une liste dont le codage RLE est deux fois plus long qu'elle. Quel est le pire cas ?
  2. Pour quel genre d'image le codage RLE est-il efficace ? Pour lequel est-il contre-productif ?
Point de vigilance

Non : une liste sans deux valeurs consécutives égales donne un codage de longueur double.

Résultats attendus
[1, 2, 3]
[1, 1, 1, 2, 1, 3], deux fois plus long
2

Question 2Le décodage

En étudiant bien la fonction codage_rle (question 1) qui réalise le codage, écrire le corps de la fonction decodage_rle qui réalise le décodage d'une liste. Des tests sont fournis dans la fonction test_codage, on pourra les compléter.

Appel professeur

À demander au candidat

  1. Pourquoi parcourir la liste codée de deux en deux ? Que contiennent liste_rle[i] et liste_rle[i + 1] ?
  2. Décrivez la boucle de codage_rle : à quoi sert la condition i + occ < len(liste_octets) ?
Point de vigilance

La liste codée alterne compte et valeur : un pas de 2 dans la boucle, ou des indices pairs et impairs.

3

Question 3Deux images

Pour tester le codage sur une image, on peut utiliser la fonction fournie encoder_decoder_image qui effectue le codage puis le décodage d'une image pour l'enregistrer à nouveau dans un fichier. Utiliser cette fonction sur les images bac_nsi_32.png et bac_nsi_256.png et observer la différence de comportement.

Appel professeur

À demander au candidat

  1. Que fait enregistrer_octets d'une valeur supérieure à 255 ? Pourquoi ?
  2. Pourquoi la petite image est-elle correcte et pas la grande ?
Point de vigilance

La grande image contient une suite de 5 842 pixels identiques : écrit sur un octet, ce compte est ramené à 255 et l'image décodée perd des lignes.

Résultats attendus
Petite image
1 024 pixels retrouvés
Grande image
51 456 pixels au lieu de 65 536
4

Question 4Des suites trop longues

Le problème précédent est lié au fait que sur des grandes images, il est possible d'avoir plus de 255 pixels de la même couleur. Proposer une démarche de résolution de ce problème qui modifie les fonctions d'encodage et de décodage, puis l'implémenter. Les fonctions se trouvent aux questions 1 et 2.

Appel professeur

À demander au candidat

  1. Pourquoi un compte ne peut-il pas dépasser 255 dans le fichier ?
  2. Votre correction modifie-t-elle aussi le décodage ? Pourquoi ?
  3. Comment vérifier, sans regarder l'image, que la grande image est maintenant correcte ?
Point de vigilance

Il suffit de couper les suites à 255 au codage : [7] * 300 devient [255, 7, 45, 7], et le décodage reste inchangé.

Résultats attendus
codage_rle([7] * 300)
[255, 7, 45, 7]
Grande image, après correction
9 120 octets codés, image identique

Le fichier du candidat

Le jour de l'épreuve, le candidat travaille dans un seul fichier. Ce bouton rassemble vos cellules dans l'ordre, telles qu'elles sont à l'écran, en un rle.py à ouvrir dans votre éditeur habituel.

Chargement de Python…