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
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.
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
- Donnez une liste dont le codage RLE est deux fois plus long qu'elle. Quel est le pire cas ?
- Pour quel genre d'image le codage RLE est-il efficace ? Pour lequel est-il contre-productif ?
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
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
- Pourquoi parcourir la liste codée de deux en deux ? Que contiennent
liste_rle[i]etliste_rle[i + 1]? - Décrivez la boucle de
codage_rle: à quoi sert la conditioni + occ < len(liste_octets)?
La liste codée alterne compte et valeur : un pas de 2 dans la boucle, ou des indices pairs et impairs.
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
- Que fait
enregistrer_octetsd'une valeur supérieure à 255 ? Pourquoi ? - Pourquoi la petite image est-elle correcte et pas la grande ?
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
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
- Pourquoi un compte ne peut-il pas dépasser 255 dans le fichier ?
- Votre correction modifie-t-elle aussi le décodage ? Pourquoi ?
- Comment vérifier, sans regarder l'image, que la grande image est maintenant correcte ?
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.