L'essence de la compression : exprimer la même information avec moins de données
Avant de plonger dans la distinction entre compression sans perte et compression avec perte, il nous faut comprendre ce que fait réellement la compression.
Au cœur de la compression se trouve l'idée d'exprimer la même information avec moins de données. Toute donnée — qu'il s'agisse de texte, d'images, d'audio ou de vidéo — contient de la « redondance ». La redondance désigne les parties qui peuvent être supprimées sans perdre le sens de l'information. Le travail d'un algorithme de compression consiste à identifier et à éliminer cette redondance.
Considérons un exemple simple. La chaîne de caractères AAAAABBBCC occupe 10 octets. Mais nous pouvons représenter la même information de manière plus compacte en enregistrant « chaque caractère et combien de fois il se répète consécutivement », ce qui donne 5A3B2C — seulement 6 octets. La taille des données chute de 40 %, pourtant le sens est identique. C'est la forme la plus primitive de compression, connue sous le nom de Run-Length Encoding (RLE).
Du point de vue de la théorie de l'information, Claude Shannon a introduit le concept d'« entropie de l'information » : la longueur minimale moyenne du codage d'un flux de données est bornée par son entropie. Aucun algorithme sans perte ne peut briser cette limite théorique. Cela signifie que recomprimer des données déjà compressées n'apporte presque aucun bénéfice — la redondance a déjà été éliminée.
Comprendre cette essence révèle deux voies techniques fondamentalement différentes : la compression sans perte vise une fidélité parfaite, tandis que la compression avec perte abandonne délibérément les détails que l'œil ou l'oreille humaine ne peut pas facilement percevoir, les échangeant contre un taux de compression bien plus élevé.
Compression sans perte : restaurer chaque bit
La promesse centrale de la compression sans perte est que les données décompressées sont identiques octet par octet à l'original — pas un seul bit ne peut différer. Ces algorithmes n'éliminent que la « redondance statistique » et la « redondance structurelle », sans jamais toucher au contenu sémantique de l'information.
DEFLATE : l'algorithme sans perte le plus utilisé
DEFLATE est l'algorithme à la base de ZIP, gzip, zlib et de nombreux autres outils. Il combine élégamment deux techniques classiques :
- LZ77 : utilise une fenêtre glissante pour rechercher des sous-chaînes répétées dans les données déjà traitées, en les remplaçant par des pointeurs « distance + longueur ». Par exemple, le mot « compression » apparaissant de façon répétée dans un fichier texte peut être remplacé par une référence arrière à sa première occurrence.
- Codage de Huffman : applique un codage à longueur variable au flux de symboles produit par LZ77. Les symboles fréquents reçoivent des codes courts ; les symboles rares reçoivent des codes longs. Cela rapproche le codage de la limite d'entropie.
Les atouts de DEFLATE sont sa simplicité, sa vitesse et sa compatibilité universelle — presque toutes les bibliothèques standard des langages de programmation en proposent une implémentation.
LZMA : des ratios plus élevés grâce à la modélisation contextuelle
LZMA (Lempel-Ziv-Markov chain Algorithm) s'appuie sur LZ77 avec une fenêtre glissante bien plus grande (jusqu'à plusieurs Go), un modèle de probabilité plus raffiné et un codage par intervalles. Comparé à DEFLATE, LZMA atteint généralement des taux de compression plus élevés, au prix d'une vitesse de compression plus lente et d'une consommation de mémoire plus importante. Le format 7z est basé sur LZMA.
L'amélioration clé de LZMA est qu'il ne s'appuie pas sur une table de probabilité statique. Au contraire, il prédit dynamiquement la probabilité du prochain symbole en fonction du contexte. Cette « modélisation contextuelle » rapproche beaucoup plus le codage de la limite théorique d'entropie.
Filtrage PNG : un prétraitement pour les données d'image
PNG est un format d'image sans perte, mais il n'applique pas DEFLATE directement aux valeurs de pixels brutes. Avant la compression, PNG applique un « filtre » à chaque ligne de pixels afin de rendre les données plus favorables à DEFLATE.
Un filtre courant stocke la différence entre chaque pixel et son voisin de gauche, du dessus ou en haut à gauche. Comme les images naturelles ont des pixels localement similaires, ces différences ont tendance à se regrouper autour de zéro. Ces données transformées présentent une redondance plus élevée, ce qui permet à DEFLATE de les compresser bien plus efficacement.
Cela explique aussi pourquoi ZIP ne peut pas compresser efficacement les images JPEG : JPEG est déjà hautement compressé par DCT et codage entropique, ne laissant presque aucune redondance statistique que DEFLATE puisse exploiter. Exécuter ZIP sur un JPEG ajoute généralement quelques octets d'en-tête sans aucune réduction de taille.
Compression avec perte : l'échange sous le seuil de perception
L'idée centrale de la compression avec perte est que la perception humaine a des limites. Si les détails abandonnés se situent sous le seuil perceptuel, la différence visuelle ou auditive est négligeable — mais la réduction des données peut être énorme.
DCT : le fondement mathématique de JPEG
La Transformée en Cosinus Discrète (DCT) est le cœur de la compression d'images JPEG. Son rôle est de convertir une image du « domaine spatial » vers le « domaine fréquentiel ».
Dans le domaine spatial, une image est représentée par les valeurs de luminosité des pixels. Dans le domaine fréquentiel, l'image est décomposée en une somme de composantes d'ondes cosinus à différentes fréquences : les composantes de basse fréquence représentent les grandes zones lisses, tandis que les composantes de haute fréquence représentent les contours et les détails fins.
La DCT elle-même est réversible et ne perd aucune information. La « perte » réelle se produit à l'étape suivante — la quantification.
Quantification : la source de la perte
La quantification associe les coefficients DCT de haute précision à un ensemble limité de valeurs discrètes. En pratique, chaque coefficient est divisé par une valeur d'une table de quantification, puis arrondi à un entier. Comme l'œil humain est moins sensible aux détails de haute fréquence, la table de quantification applique des diviseurs plus grands aux coefficients de haute fréquence, ce qui fait que beaucoup d'entre eux deviennent zéro.
Cette étape provoque une perte d'information irréversible — une fois qu'un coefficient est arrondi à zéro, il ne peut pas être récupéré. Mais elle crée aussi une énorme opportunité de compression : les longues suites de zéros peuvent être codées très efficacement par run-length encoding.
Concevoir la table de quantification est un art : des diviseurs plus grands donnent une compression plus élevée mais une perte de qualité plus visible. C'est exactement ce que contrôle le paramètre de qualité JPEG (par exemple quality=80) — il met à l'échelle la table de quantification à la hausse ou à la baisse.
Prédiction inter-images : la clé de la compression vidéo
La compression vidéo va un pas plus loin que les images fixes. Les images consécutives d'une vidéo changent souvent très peu (par exemple, un arrière-plan statique avec une personne en mouvement), il n'est donc pas nécessaire de stocker chaque image en entier.
La prédiction inter-images utilise « l'estimation de mouvement » pour trouver le déplacement entre l'image courante et une image de référence, en ne stockant que des « vecteurs de mouvement » et des « résidus ». Cette élimination de la redondance temporelle permet aux taux de compression vidéo d'atteindre des centaines, voire des milliers pour un, bien au-delà de ce que la compression d'images à image unique peut atteindre.
Sans perte vs avec perte : diagramme de comparaison
L'organigramme ci-dessous illustre les branches principales et les applications typiques des deux familles de compression :
Diagramme du principe de la DCT
Le diagramme ci-dessous simplifie la façon dont la DCT transforme un bloc de pixels 8x8 du domaine spatial vers le domaine fréquentiel, puis conserve les basses fréquences tout en abandonnant les hautes fréquences par quantification :
Exemples de code
Compression sans perte avec zlib
import zlib
# Données texte originales avec forte répétition
original = b"compression compression compression " * 50
# Compresser
compressed = zlib.compress(original, level=9)
print(f"Taille originale : {len(original)} octets")
print(f"Taille compressée : {len(compressed)} octets")
print(f"Ratio : {len(original) / len(compressed):.2f}x")
# Décompresser et vérifier que les données sont identiques
decompressed = zlib.decompress(compressed)
assert decompressed == original, "Non-concordance des données !"
print("Vérification réussie : les données décompressées sont identiques à l'original")
En exécutant ce code, vous verrez généralement un taux de compression supérieur à 10x, et les données décompressées sont identiques octet par octet à l'original. C'est ce que signifie « sans perte ».
Compression avec perte avec PIL
from PIL import Image
import io
# Créer une image de test riche en détails haute fréquence
img = Image.new("RGB", (512, 512))
pixels = img.load()
for x in range(512):
for y in range(512):
# Générer un motif avec des détails haute fréquence
pixels[x, y] = ((x * 7) % 256, (y * 5) % 256, ((x + y) * 3) % 256)
# Enregistrer en PNG sans perte
img.save("test_lossless.png")
png_size = len(open("test_lossless.png", "rb").read())
print(f"Taille PNG (sans perte) : {png_size} octets")
# Enregistrer en JPEG avec perte avec qualité 20 pour amplifier l'effet
buffer = io.BytesIO()
img.save(buffer, format="JPEG", quality=20)
jpeg_size = buffer.tell()
print(f"Taille JPEG (avec perte) : {jpeg_size} octets")
print(f"Ratio : {png_size / jpeg_size:.2f}x")
# Recharger le JPEG et comparer les différences de pixels
buffer.seek(0)
img_jpeg = Image.open(buffer)
diff_count = sum(
1 for x in range(512) for y in range(512)
if img.getpixel((x, y)) != img_jpeg.getpixel((x, y))
)
print(f"Pixels modifiés : {diff_count} / {512 * 512}")
print("Conclusion : la compression JPEG modifie les valeurs de pixels de façon irréversible")
Ce code illustre la marque de fabrique de la compression avec perte : un fichier plus petit, mais avec des valeurs de pixels modifiées de façon irréversible.
Tableau comparatif
| Dimension | Compression sans perte | Compression avec perte |
|---|---|---|
| Principe fondamental | Élimine la redondance statistique et structurelle | Abandonne les infos sous le seuil de perception |
| Fidélité | 100 % réversible, identique après décompression | Irréversible, perte irrécupérable |
| Algorithmes typiques | DEFLATE, LZMA, Brotli, Zstandard | DCT+quantification, ondelettes, MDCT |
| Techniques clés | LZ77, codage de Huffman, codage par intervalles | Codage par transformation, quantification, prédiction |
| Applications typiques | ZIP, GZIP, 7Z, PNG, FLAC | JPEG, WebP, H.264, MP3, AAC |
| Le mieux adapté à | Texte, code source, archives, imagerie médicale | Photos, vidéo, musique, streaming |
| Ratio typique | Généralement 2x à 5x | Généralement 10x à 100x ou plus |
| Non adapté à | Données déjà compressées (ex. fichiers JPEG) | Données nécessitant une reproduction exacte (ex. texte juridique) |
FAQ
Q1 : Pourquoi ZIP ne peut-il pas compresser une image JPEG ?
Au moment où un JPEG est créé, il a déjà traversé la DCT, la quantification et le codage entropique. La redondance statistique des données a été presque entièrement éliminée. DEFLATE ne peut pas trouver de motifs de répétition exploitables, donc exécuter ZIP sur un JPEG ne réduit pas la taille et peut même ajouter quelques octets d'en-tête.
Q2 : PNG est-il toujours plus grand que JPEG pour la même image ?
Pas nécessairement. Pour les images avec de grandes zones de couleur unie ou une palette limitée (comme les logos, les icônes ou les captures d'écran), la combinaison filtre-plus-DEFLATE de PNG est souvent plus petite que JPEG et préserve une qualité parfaite. Mais pour les photographies naturelles riches en couleurs, la combinaison DCT-plus-quantification de JPEG atteint généralement des taux de compression supérieurs à 10x, ce qui la rend bien plus petite que PNG.
Q3 : Peut-on compresser plusieurs fois le même fichier avec un algorithme sans perte ?
Non. Chaque passe de compression sans perte rapproche les données de leur limite d'entropie. Après la première passe, la redondance est largement éliminée, et une seconde passe n'a presque plus rien à exploiter — elle peut même grossir légèrement à cause des métadonnées ajoutées. C'est pourquoi « compresser un fichier déjà compressé » est vain.
Résumé
La compression sans perte et la compression avec perte ne sont pas des camps opposés, mais des choix optimaux faits pour différentes caractéristiques de l'information :
- La compression sans perte sert les données où « pas un seul bit ne peut être faux » — texte, code, archives. Elle utilise des techniques comme LZ77 et le codage de Huffman pour éliminer la redondance statistique tout en garantissant une reconstruction parfaite.
- La compression avec perte sert les détails « que l'œil et l'oreille ne peuvent pas percevoir » — photos, vidéo, musique. Elle utilise la DCT, la quantification et la prédiction inter-images pour faire des compromis sous le seuil de perception, échangeant une perte d'information contrôlée contre des améliorations d'un ordre de grandeur du taux de compression.
Comprendre la différence fondamentale entre ces deux voies est la pierre angulaire de la maîtrise de toute la technologie de compression. Dans les articles suivants, nous plongerons dans les implémentations algorithmiques spécifiques le long de chaque voie, en comprenant l'élégance de la compression ligne par ligne.
Lectures associées :
- Guide complet de la compression de fichiers : principes et méthodes de compression PDF/image/vidéo/document
- Principes et méthodes de compression PDF : comment réduire efficacement la taille d'un PDF
- Guide de compression d'images : comparaison et choix des formats JPG/PNG/WebP
Besoin de compresser des fichiers ? Essayez SmartSlim
Basé sur un moteur de compression Rust développé en interne, prenant en charge 10 catégories et plus de 40 formats dont PDF, images, vidéo, Office et OFD, avec une compression locale qui conserve vos données sur place.