Principe de compression PNG : pourquoi DEFLATE est-il sans perte ?

Conclusion d'abord : PNG est une compression sans perte parce qu'il utilise l'algorithme DEFLATE — la compression par dictionnaire LZ77 et le codage Huffman sont deux opérations mathématiques entièrement réversibles, les données après décompression sont identiques octet par octet aux données originales. Le processus de compression PNG est : les données de pixels passent d'abord par un filtrage de ligne pour éliminer la redondance entre pixels adjacents, puis sont compressées par DEFLATE. Une capture d'UI 3000×2000 passe de 17,2 Mo à 0,35 Mo en PNG, soit une réduction de 97,9 %, sans qu'aucune valeur de pixel ne change. Ci-dessous, nous détaillons la structure du fichier PNG et le principe de l'algorithme DEFLATE.

Si vous n'êtes pas encore familier avec les méthodes globales de compression d'images, nous vous recommandons de lire d'abordGuide de compression d'images : comparaison JPG/PNG/WebP

I. Structure du fichier PNG : comment les données sont-elles organisées

Un fichier PNG est composé d'une série de blocs de données (chunks), chacun contenant un type, une longueur, des données et une somme de contrôle. Comprendre le rôle de ces chunks, c'est comprendre la structure interne d'un fichier PNG.

Bloc de donnéesNom completFonctionRequisTaille typique
SignaturePNG SignatureIdentifiant de fichier 8 octets (89 50 4E 47 0D 0A 1A 0A)Requis8 octets
IHDRImage HeaderInformations de base de l'image (largeur/hauteur/profondeur de couleur/type de couleur)Requis25 octets
IDATImage DataDonnées de pixels compressées (encodage DEFLATE)RequisVariable (principal)
IENDImage EndMarqueur de fin de fichierRequis12 octets
PLTEPalettePalette (mode couleur indexée)Requis pour couleur indexée≤ 768 octets
tRNSTransparencyInformations de transparenceOptionnelVariable
tEXtTextMétadonnées textuelles (auteur/description, etc.)OptionnelVariable
gAMAImage GammaInformations de correction gammaOptionnel16 octets

Le chunk le plus important d'un PNG est IDAT, qui stocke les données de pixels après filtrage de ligne et compression DEFLATE. Une image RGB 24 bits de 3000×2000 a des données de pixels originales d'environ 17,2 Mo (3000×2000×3 octets) ; après compression PNG, la partie IDAT peut ne faire que 0,3–0,5 Mo. L'effet de compression dépend principalement de la répétabilité du contenu de l'image — les grandes zones de couleur unie offrent le meilleur taux de compression, les photos avec bruit le plus faible.

II. Principe de l'algorithme DEFLATE : compression en deux étapes LZ77 + Huffman

Le moteur de compression principal de PNG est l'algorithme DEFLATE, composé de deux étapes : la première, la compression par dictionnaire LZ77, élimine les séquences répétées ; la seconde, le codage Huffman, élimine la redondance d'encodage. Les deux étapes sont des opérations réversibles sans perte, c'est la raison fondamentale pour laquelle la compression PNG est sans perte.

ÉtapeAlgorithmePrincipeRedondance éliminéeRéversibilité
Première étapeLZ77Rechercher les séquences d'octets répétées, remplacer par référence (distance, longueur)Redondance de séquences répétéesEntièrement réversible
Deuxième étapeCodage HuffmanDonnées haute fréquence en code court, basse fréquence en code longRedondance d'encodageEntièrement réversible

1. Compression par dictionnaire LZ77

LZ77 est un algorithme de compression par dictionnaire à « fenêtre coulissante ». Il maintient une fenêtre coulissante (généralement 32 Ko) et recherche dans la fenêtre la plus longue séquence d'octets correspondant à la position actuelle. Si une correspondance est trouvée, la séquence est remplacée par une référence (distance, longueur) ; sinon, les octets originaux sont émis.

Exemple : supposons que les données d'image contiennent des pixels blancs consécutifs (RGB 255,255,255) répétés 1000 fois. LZ77 trouve ce motif répété dans la fenêtre : après le premier triplet enregistré, les 999 triplets suivants sont remplacés par une référence « reculer de 3 octets, copier 3 octets, répéter 999 fois ». Les 3000 octets de données originales sont compressés en une séquence de références d'une dizaine d'octets, soit un taux de compression supérieur à 99 %.

Caractéristiques des donnéesEffet de compression LZ77Taux de compression typiqueRaison
Grande zone de couleur unieExcellent95%+Séquences répétées longues, substitution par référence efficace
Dégradé horizontalBon70%-85%Motif de dégradé correspondant
Texture régulièreBon60%-80%Texture répétée référençable
Bruit aléatoireFaible0%-10%Aucune séquence répétée à correspondre
Photo naturelleFaible5%-20%Différences de pixels importantes, peu de correspondances

2. Codage Huffman

Les données de sortie LZ77 (mélange de références et d'octets originaux) sont ensuite soumises au codage Huffman. L'idée fondamentale du codage Huffman est : les symboles à haute fréquence reçoivent un code court, ceux à basse fréquence un code long, réduisant ainsi la longueur moyenne d'encodage.

Exemple : si dans la sortie LZ77 les « marqueurs de référence » représentent 60 % de fréquence, la valeur d'octet 255 représente 20 %, et les autres valeurs sont minoritaires. Huffman attribue un code de 2 bits aux « marqueurs de référence », 3 bits à la valeur 255, et 8–12 bits aux valeurs à faible fréquence. La longueur moyenne d'encodage par symbole passe de 8 bits fixes à 3–4 bits, soit une compression supplémentaire d'environ 50 %.

DEFLATE utilise deux méthodes de codage Huffman : l'arbre Huffman fixe (table d'encodage prédéfinie, rapide mais taux de compression moyen) et l'arbre Huffman dynamique (table d'encodage optimale construite selon la fréquence réelle des données, taux de compression supérieur mais nécessite le stockage de la table). Le standard PNG exige l'utilisation du codage Huffman dynamique pour obtenir le meilleur effet de compression.

III. Mécanisme de compression sans perte : filtrage de ligne + DEFLATE

La compression sans perte de PNG ne dépend pas seulement de l'algorithme DEFLATE, mais aussi d'une étape de prétraitement clé — le filtrage de ligne (Filter). Cette étape est exécutée avant DEFLATE, dans le but de rendre les données de pixels plus adaptées à la compression LZ77.

Dans une image, les pixels adjacents ont généralement des valeurs similaires (par exemple, les pixels d'une zone de ciel bleu sont proches). Le filtrage de ligne convertit chaque valeur de pixel en soustrayant la valeur du pixel à gauche ou au-dessus, transformant les valeurs absolues en différences — les différences sont généralement petites ou nulles, un modèle de données plus adapté à la compression LZ77 et Huffman.

Type de filtrageNomFormule de prédictionScénario applicable
0NonePas de prédiction, valeur originaleDonnées de bruit aléatoire
1SubValeur actuelle - valeur de gaucheImage à dégradé horizontal
2UpValeur actuelle - valeur du hautImage à dégradé vertical
3AverageValeur actuelle - (gauche + haut) / 2Image à transition douce
4PaethValeur actuelle - valeur prédite PaethUniversel (optimal pour la plupart des images)

L'encodeur PNG peut choisir indépendamment le type de filtrage pour chaque ligne. SmartSlim, basé sur le moteur de compression Rust propriétaire, teste les 5 méthodes de filtrage pour chaque ligne et sélectionne celle offrant la meilleure compression, réduisant le volume de 10 %–20 % supplémentaires par rapport à l'utilisation d'un seul type de filtrage.

Processus de compression complet :
Pixels originaux -> filtrage de ligne (choix optimal) -> compression dictionnaire LZ77 -> codage Huffman -> bloc de données IDAT

Processus de décompression entièrement inverse :
Bloc IDAT -> décodage Huffman -> décompression LZ77 -> filtrage inverse -> pixels originaux

Les deux étapes sont des opérations mathématiques inverses exactes ; les données de pixels après décompression sont identiques octet par octet aux données originales, c'est la garantie fondamentale de la compression sans perte de PNG.

IV. Tests : comparaison de volume PNG vs JPEG vs WebP

Nous avons utilisé le même ensemble d'images de test pour comparer l'effet de compression des trois formats, couvrant différents types de contenu d'image.

Type d'imageTailleBMP originalPNGJPEG(q80)WebP(q80)Taux de compression PNG
Capture d'UI1920x10805.93MB0.35MB0.82MB0.28MB94.1%
Schéma technique2000x15008.58MB0.42MB1.15MB0.35MB95.1%
Photo naturelle3000x200017.16MB12.50MB1.80MB1.42MB27.2%
Photo portrait4000x300034.33MB28.80MB3.50MB2.80MB16.1%
Jeu d'icônes1024x10243.00MB0.08MB0.45MB0.06MB97.3%
Document numérisé2480x350824.80MB1.20MB0.85MB0.72MB95.2%

Les données de test révèlent une conclusion clé : l'effet de compression de PNG dépend fortement du type d'image. Pour les captures d'UI, schémas et icônes contenant de grandes zones de couleur unie, le taux de compression PNG atteint 94 %–97 %, bien supérieur à JPEG. Mais pour les photos naturelles et portraits où les différences de pixels sont importantes, le taux de compression PNG n'est que de 16 %–27 %, bien inférieur à JPEG (89 %–90 %).

Examinons ensuite la comparaison avant/après optimisation PNG, avec un PNG standard et un PNG optimisé :

Type d'imagePNG standardPNG optimiséRéduction après optimisationMéthode d'optimisation
Capture d'UI0.42MB0.35MB16.7%Filtrage Paeth + zlib niveau maximal
Schéma technique0.52MB0.42MB19.2%Filtrage optimal ligne par ligne + suppression métadonnées
Jeu d'icônes0.12MB0.08MB33.3%Conversion 8 bits indexée + filtrage optimal
Document numérisé1.50MB1.20MB20.0%Filtrage optimal ligne par ligne + suppression gAMA

L'optimisation PNG de SmartSlim peut réduire le volume de 15 %–33 % supplémentaires par rapport au PNG standard, grâce à la combinaison du filtrage optimal ligne par ligne et du niveau de compression zlib maximal.

Pour plus de comparaisons de formats, voirCompression sans perte vs compression avec perte : différence essentielleetComparaison de formats WebP vs PNG vs JPG

V. FAQ

Q1 : Pourquoi PNG est-il une compression sans perte ?

PNG utilise l'algorithme DEFLATE pour compresser les données, composé de deux étapes : la compression par dictionnaire LZ77 et le codage Huffman. LZ77 recherche les séquences d'octets répétées et les remplace par des références distance + longueur ; Huffman utilise un codage à longueur variable pour attribuer des codes courts aux données à haute fréquence. Les deux étapes sont des opérations réversibles — lors de la décompression, le décodage Huffman restaure les codes à longueur variable, LZ77 restaure les octets originaux selon les références, les données sont identiques sans aucune perte d'information. C'est pourquoi PNG est une compression sans perte.

Q2 : PNG ou JPEG : quel taux de compression est plus élevé ?

Pour les photos, le taux de compression de JPEG est bien supérieur à celui de PNG. Une photo 3000×2000 fait environ 12,5 Mo en PNG, 1,8 Mo en JPEG qualité 80, soit un rapport de 7. En effet, JPEG utilise la transformation DCT avec perte pour éliminer les détails haute fréquence, tandis que PNG doit conserver sans perte chaque pixel. Mais pour les schémas, captures d'écran et icônes contenant de grandes zones de couleur unie, PNG est plus petit — une capture d'UI fait 0,3 Mo en PNG, 0,8 Mo en JPEG qualité 80. Le choix du format dépend du type de contenu.

Q3 : Quel est le taux de compression maximal de PNG ?

Cela dépend du contenu de l'image. Pour les images avec de grandes zones de couleur unie ou des dégradés, le taux de compression peut dépasser 90 % (par exemple une capture d'UI de 5 Mo compressée à 0,3 Mo) ; pour les photos avec beaucoup de bruit, le taux n'est généralement que de 10 %–30 %, car les différences de pixels sont importantes et LZ77 ne trouve pas de séquences répétées. La limite théorique de PNG avec DEFLATE est environ au niveau de la compression ZIP, incapable d'atteindre les taux extrêmes de JPEG qui supprime de l'information.

Q4 : Quelle est la différence entre optimisation PNG et compression PNG ?

La compression PNG consiste à encoder les données de pixels originales au format PNG avec DEFLATE, c'est le processus standard. L'optimisation PNG va plus loin en réduisant le volume au-delà de la compression standard, notamment : tester les 5 types de filtrage de ligne pour choisir le meilleur, utiliser le niveau de compression zlib maximal, supprimer les chunks de métadonnées (comme tEXt/gAMA), convertir le RGBA 24 bits en index couleur 8 bits (si ≤ 256 couleurs). L'optimisation PNG de SmartSlim peut réduire le volume de 15 %–30 % supplémentaires par rapport au PNG standard.

Résumé

PNG parvient à une compression sans perte parce que les deux étapes de DEFLATE — LZ77 et Huffman — sont des opérations mathématiques entièrement réversibles, complétées par un prétraitement de filtrage de ligne qui améliore la compressibilité des données. PNG offre d'excellents résultats pour les captures d'UI, schémas et icônes avec de grandes zones de couleur unie (taux de compression 94 %–97 %), mais son taux de compression est limité pour les photos (16 %–27 %) ; dans ce cas, JPEG ou WebP doivent être privilégiés.

Si vous devez optimiser le volume de vos images PNG, SmartSlim, basé sur le moteur de compression Rust, offre un filtrage optimal ligne par ligne et une compression zlib au niveau maximal, réduisant le volume de 15 %–33 % supplémentaires par rapport au PNG standard, prenant en charge 9 formats d'image (png/jpg/jpeg/webp/bmp/tiff, etc.), compression locale sans sortie de données.

Besoin de compresser des fichiers ? Essayez SmartSlim

Construit sur un moteur de compression Rust auto-développé, prenant en charge 10 catégories et plus de 40 formats, dont PDF, images, vidéo, Office et OFD, avec une compression locale qui garde vos données sur place.