La compression PNG est fondamentalement sans perte
Voici la chose la plus importante à comprendre à propos de PNG : le niveau de compression n'affecte pas la qualité. Un PNG enregistré au niveau de compression 1 et un PNG enregistré au niveau de compression 9 produiront exactement la même image lorsqu'ils seront ouverts. Chaque pixel sera identique, bit pour bit.
PNG utilise l'algorithme DEFLATE (le même qui se cache derrière gzip et les fichiers ZIP) pour compresser les données de pixels. Lorsque vous ajustez le niveau de « compression », vous contrôlez la rigueur avec laquelle l'encodeur recherche des motifs répétitifs et des stratégies d'encodage optimales. Les niveaux plus élevés signifient :
- Fichiers plus petits — l'encodeur trouve des moyens plus efficaces de représenter les mêmes données
- Encodage plus lent — plus de calcul nécessaire pour trouver ces efficacités
- Décompression identique — quel que soit le niveau, les pixels décodés sont les mêmes
Ceci est fondamentalement différent du JPEG, où le paramètre de qualité contrôle directement la quantité de données visuelles définitivement supprimées. Avec PNG, rien n'est jamais supprimé. La question de « qualité » est simplement : combien de temps CPU êtes-vous prêt à consacrer pour extraire quelques octets supplémentaires ?
Concept clé : Niveau de compression PNG = effort d'encodage, pas de qualité. Le niveau 9 ne signifie pas « qualité inférieure » — cela signifie « essayer plus dur de trouver une représentation plus petite des mêmes données ».
PNG-8 vs PNG-24 vs PNG-32
La façon la plus efficace de réduire la taille du fichier PNG est de choisir le bon sous-type PNG pour votre image. La différence entre ces types peut signifier une réduction de taille de 3 à 5 fois avec une modification minimale ou aucune modification visible.
| Type | Profondeur de couleur | Couleurs | Transparence | Taille typique |
|---|---|---|---|---|
| PNG-8 | 8 bits (palette indexée) | Jusqu'à 256 | 1 bit (activé/désactivé) ou alpha 8 bits | Le plus petit |
| PNG-24 | 24 bits (RVB) | 16,7 millions | Aucune | Moyen |
| PNG-32 | 32 bits (RVBA) | 16,7 millions | Alpha complet 8 bits | Le plus grand |
PNG-8 : L'arme secrète pour les petits fichiers
PNG-8 stocke chaque pixel comme un index dans une palette de jusqu'à 256 couleurs. Au lieu d'utiliser 3 octets par pixel (RVB) ou 4 octets (RVBA), il n'en utilise qu'1. Cette différence fondamentale rend les fichiers PNG-8 3 à 5 fois plus petits que les équivalents PNG-24.
PNG-8 est idéal pour :
- Logos — la plupart des logos utilisent moins de 20 couleurs
- Icônes et éléments d'interface — les icônes de conception plate contiennent généralement 5 à 15 couleurs
- Illustrations simples — diagrammes, graphiques, infographies avec zones de couleur plate
- Captures d'écran d'interfaces riches en texte — résultats de terminal, éditeurs de code, documents texte
PNG-8 n'est pas approprié pour :
- Photographies — les photos contiennent des milliers de couleurs ; réduire à 256 provoque des bandes visibles
- Dégradés fluides — 256 couleurs ne peuvent pas représenter un dégradé lisse sans étapes visibles
- Images nécessitant une semi-transparence — le PNG-8 standard ne supporte que les pixels entièrement transparents ou entièrement opaques (bien que certains outils supportent l'alpha 8 bits en mode indexé)
PNG-24 vs PNG-32 : Avez-vous besoin du canal alpha ?
La différence entre PNG-24 et PNG-32 est le canal alpha (transparence). Chaque pixel dans PNG-32 porte un octet supplémentaire pour la transparence, rendant les fichiers 25 à 33 % plus grands que PNG-24. Si votre image n'a pas besoin de transparence (pas de zones transparentes ou semi-transparentes), enregistrez-la en PNG-24 pour éviter la surcharge d'un canal alpha inutilisé.
Gain rapide : Si vous avez une image PNG-24 qui n'utilise que 50 couleurs distinctes (courant pour les maquettes d'interface et les diagrammes), la conversion en PNG-8 peut réduire la taille du fichier de 70 à 80 % sans aucune modification visible. Les outils comme pngquant détectent cela automatiquement.
Suppression des métadonnées
Les fichiers PNG peuvent contenir des métadonnées dans des segments de texte : tEXt, iTXt, zTXt et d'autres segments ancillaires. Ceux-ci incluent :
- Balises logicielles — quel programme a créé le fichier (Photoshop, GIMP, etc.)
- Horodatage de création — quand l'image a été créée ou modifiée pour la dernière fois
- Auteur et droits d'auteur — champs de texte incorporés
- Profil de couleur ICC — peut faire de 500 octets à 800 Ko+ pour les profils large gamme
- Données privées Photoshop — les logiciels Adobe intègrent les données de couche, les références d'objets intelligents et l'historique d'édition qui peuvent être substantiels
Pour la livraison web, toutes ces métadonnées sont des surcharges inutiles. La suppression produit un fichier plus petit avec aucune modification visuelle :
# Supprimer toutes les métadonnées avec ImageMagick
magick input.png -strip output.png
# Supprimer avec pngcrush (préserve uniquement les segments critiques)
pngcrush -rem allb input.png output.png
# Supprimer avec optipng (optimise également la compression)
optipng -strip all input.png -out output.png
Les économies de suppression de métadonnées sont généralement 1 à 5 Ko pour les images simples, mais peuvent atteindre 50 à 800 Ko pour les fichiers exportés de Photoshop avec des profils ICC incorporés et des segments de données privées.
Paramètres de niveau de compression
Le niveau de compression PNG contrôle la rigueur avec laquelle l'algorithme DEFLATE recherche des motifs. Voici ce que chaque niveau signifie en pratique :
| Niveau | Vitesse d'encodage | Taille du fichier | Cas d'utilisation |
|---|---|---|---|
| 0 | Instantané | Le plus grand (aucune compression) | Débogage, traitement intermédiaire |
| 1 à 3 | Très rapide | Grand | Traitement en temps réel, fichiers temporaires |
| 4 à 6 | Modéré | Moyen | Usage général (la plupart des outils par défaut à 6) |
| 7 à 8 | Lent | Petit | Livraison web, archivage |
| 9 | Le plus lent | Le plus petit | Livraison finale, ressources web |
La différence entre le niveau 6 (par défaut) et le niveau 9 (maximum) est généralement 2 à 5 % de taille de fichier. La différence de temps d'encodage est plus importante — le niveau 9 peut prendre 5 à 10 fois plus longtemps que le niveau 6 pour les grandes images. Pour les ressources web où vous encodez une fois et servez des millions de fois, le niveau 9 vaut toujours le temps d'encodage supplémentaire.
Paramètre de qualité PNG ImageMagick
ImageMagick encode à la fois le niveau de compression et le type de filtre dans un seul paramètre -quality pour PNG. Le chiffre des dizaines est le niveau de compression zlib (0 à 9), et le chiffre des unités est le type de filtre (0 à 5) :
# Compression maximale, filtrage adaptatif
magick input.png -strip -quality 95 PNG:output.png
# Décomposition : 9 = niveau de compression 9, 5 = filtre adaptatif
# Le filtre adaptatif teste tous les 5 types de filtre par ligne pour les résultats optimaux
# Compression rapide, pas de filtrage
magick input.png -strip -quality 10 PNG:output.png
# Décomposition : 1 = niveau de compression 1, 0 = pas de filtre
Meilleure valeur par défaut : Utilisez -quality 95 pour la sortie PNG ImageMagick. Le 9 signifie effort de compression maximal, et 5 signifie filtrage adaptatif (essaie tous les types de filtre par ligne). Cela produit le fichier le plus petit au prix d'un encodage plus lent.
Types de filtres PNG expliqués
Avant la compression DEFLATE, PNG applique un filtre de prédiction par ligne qui transforme les données de pixels pour les rendre plus compressibles. Le filtre ne change pas l'image — c'est complètement réversible. L'objectif est de rendre les données plus répétitives pour que DEFLATE puisse les compresser mieux.
| Filtre | ID | Méthode de prédiction | Meilleur pour |
|---|---|---|---|
| Aucun | 0 | Pas de prédiction (octets bruts) | Images palettisées (PNG-8), bruit aléatoire |
| Sub | 1 | Pixel moins voisin gauche | Dégradés horizontaux, motifs horizontaux |
| Haut | 2 | Pixel moins pixel au-dessus | Dégradés verticaux, motifs verticaux |
| Moyenne | 3 | Pixel moins moyenne de gauche + au-dessus | Zones fluides, contenu mélangé |
| Paeth | 4 | Pixel moins prédicteur Paeth (le plus proche de gauche, au-dessus, en haut à gauche) | Images naturelles complexes |
| Adaptatif | 5 | Teste tous les filtres par ligne, choisit le meilleur | Toutes les images (meilleure valeur par défaut) |
Le filtre adaptatif (parfois appelé « mixte » ou « tous ») teste les cinq types de filtre pour chaque ligne de pixels et choisit celui qui produit la sortie la plus compressible. Cette approche par force brute produit presque toujours le fichier le plus petit mais prend plus de temps à encoder. Pour la livraison web finale, le filtrage adaptatif est toujours le bon choix.
Combien les filtres importent-ils ?
Le mauvais choix de filtre peut augmenter la taille du fichier de 10 à 30 %. Par exemple, l'utilisation d'un filtre « Aucun » sur une photographie (où les pixels adjacents sont similaires) gaspille un potentiel de compression important. Inversement, l'utilisation de « Sub » ou « Paeth » sur une image palettisée avec des valeurs d'index aléatoires peut en fait rendre le fichier plus grand que sans filtre du tout.
C'est pourquoi le filtrage adaptatif est la valeur par défaut sûre — il choisit toujours le bon filtre pour chaque ligne, même si l'image contient des types de contenu mixtes (comme une capture d'écran avec du texte et des photographies).
Optimisation de la palette de couleurs
La réduction la plus spectaculaire de la taille PNG provient de la conversion du PNG 24 bits (16,7 millions de couleurs) en une palette 8 bits optimisée (256 couleurs). Les outils comme pngquant et pngnq utilisent des algorithmes sophistiqués pour sélectionner les 256 meilleures couleurs et appliquer du tramage pour simuler les couleurs manquantes.
Comment pngquant fonctionne
pngquant analyse l'image pour trouver les 256 couleurs qui représentent le mieux l'original. Pour les pixels qui se situent entre les couleurs de la palette, il applique un tramage Floyd-Steinberg — une technique qui distribue l'erreur de couleur aux pixels voisins, créant l'illusion de plus de couleurs par mélange spatial.
# Optimisation de palette basique (256 couleurs, qualité 65-80)
pngquant 256 --quality=65-80 input.png -o output.png
# Optimisation de palette à qualité maximale
pngquant 256 --quality=80-100 --speed 1 input.png -o output.png
# Convertir en nombre spécifique de couleurs
pngquant 64 input.png -o output.png # 64 couleurs
pngquant 16 input.png -o output.png # 16 couleurs (très petit)
Résultats typiques de l'optimisation de palette
| Type d'image | Taille PNG-24 | PNG-8 (256 couleurs) | Économies | Impact visuel |
|---|---|---|---|---|
| Logo (12 couleurs) | 45 Ko | 8 Ko | 82 % | Aucun (sans perte) |
| Capture d'écran d'interface | 380 Ko | 95 Ko | 75 % | Tramage minimal |
| Illustration (couleurs plates) | 210 Ko | 52 Ko | 75 % | Aucun à minimal |
| Infographie avec dégradés | 620 Ko | 180 Ko | 71 % | Tramage dans les dégradés |
| Photographie | 8,5 Mo | 2,1 Mo | 75 % | Tramage lourd (utiliser JPG à la place) |
Important : L'optimisation de palette est techniquement avec perte — elle réduit le nombre de couleurs disponibles. Cependant, pour les images qui utilisent déjà moins de 256 couleurs distinctes, la conversion est parfaitement sans perte. Pour les images avec un peu plus de couleurs, le tramage produit des résultats qui sont visuellement indiscernables de l'original à des distances de visualisation normales.
Outils d'optimisation PNG comparés
Plusieurs outils spécialisés offrent plus que ce qu'ImageMagick propose pour la compression PNG. Chacun adopte une approche différente :
| Outil | Type | Approche | Économies typiques |
|---|---|---|---|
| optipng | Sans perte | Essaie plusieurs combinaisons de filtre/compression | 5 à 15 % |
| pngcrush | Sans perte | Test par force brute de tous les combos filtre/niveau | 5 à 15 % |
| zopflipng | Sans perte | Algorithme Zopfli de Google (mieux que DEFLATE) | 8 à 20 % |
| pngquant | Avec perte (palette) | Réduit à palette 256 couleurs avec tramage | 60 à 80 % |
| oxipng | Sans perte | Alternative optipng multi-threadée (Rust) | 5 à 15 % |
Pour les meilleurs résultats, combinez un outil avec et sans perte : commencez par exécuter pngquant (si la réduction de palette est acceptable), puis exécutez zopflipng ou optipng sur le résultat pour une compression sans perte maximale :
# Pipeline de compression maximale
pngquant 256 --quality=80-100 input.png -o temp.png
zopflipng temp.png output.png
rm temp.png
Quand la compression PNG atteint ses limites
Aucune quantité d'optimisation PNG ne peut surmonter la réalité fondamentale : la compression sans perte ne peut pas rivaliser avec la compression avec perte pour les photographies. Ce n'est pas un défaut de PNG — c'est une certitude mathématique. Les algorithmes sans perte doivent conserver chaque pixel, tandis que JPEG supprime les informations que l'œil ne peut pas percevoir.
| Type d'image | PNG optimisé | JPEG Q85 | PNG est plus grand de |
|---|---|---|---|
| Photo smartphone 12 MP | 14,2 Mo | 1,8 Mo | 7,9x |
| Photo DSLR 24 MP | 28,5 Mo | 4,7 Mo | 6,1x |
| Capture d'écran 1080p | 850 Ko | 240 Ko | 3,5x |
| Logo simple (12 couleurs) | 8 Ko | 22 Ko | JPEG est 2,8x plus grand |
| Icône d'interface (couleurs plates) | 3 Ko | 9 Ko | JPEG est 3x plus grand |
Le motif est clair :
- Photographies et images naturelles complexes — convertir en JPEG. Vous économiserez 3 à 8 fois avec aucune perte de qualité perceptible à Q85.
- Graphiques simples, logos, icônes, captures d'écran riches en texte — rester avec PNG. Il sera plus petit que JPEG et préservera les bords nets parfaitement.
- Images avec transparence — rester avec PNG (JPEG ne supporte pas la transparence). Envisagez WebP comme alternative qui supporte à la fois la compression avec perte et la transparence.
La réponse honnête : Si votre PNG est une photographie et que la taille du fichier vous préoccupe, la meilleure stratégie de « compression PNG » est la conversion en JPEG. Utilisez le convertisseur ci-dessus pour aller de PNG à JPG — vous verrez généralement une réduction de taille de 70 à 90 % avec une perte de qualité imperceptible.
Guide pas à pas de compression PNG
Voici un arbre de décision pratique pour réduire la taille du fichier PNG :
Étape 1 : Votre image est-elle une photographie ?
Si oui, convertir en JPEG. Téléchargez votre PNG dans le convertisseur ci-dessus et sélectionnez JPG comme format de sortie. C'est l'action la plus efficace pour les PNG de photos. Un PNG de photographie de 15 Mo devient un JPEG de 1 à 2 Mo à Q85 sans différence visible.
Si non (c'est un graphique, logo, icône ou capture d'écran), passez à l'étape 2.
Étape 2 : Combien de couleurs votre image utilise-t-elle ?
Vérifiez avec ImageMagick :
magick identify -verbose input.png | grep "Colors:"
Si 256 couleurs ou moins : convertir en PNG-8 pour 70 à 80 % d'économies avec zéro perte de qualité :
magick input.png -strip -colors 256 -type Palette PNG8:output.png
Si plus de 256 couleurs : décider si la réduction de palette avec tramage est acceptable, ou garder PNG-24.
Étape 3 : Supprimer les métadonnées et maximiser la compression
# Compression sans perte maximale avec suppression des métadonnées
magick input.png -strip -quality 95 PNG:output.png
Étape 4 : Envisager les outils spécialisés pour plus d'économies
# Optimisation sans perte (zéro changement de qualité garanti)
optipng -o7 -strip all input.png -out output.png
# OU réduction de palette avec perte (économies spectaculaires)
pngquant 256 --quality=80-100 input.png -o output.png
Compression PNG par lot
Quand vous avez besoin de compresser un dossier entier de fichiers PNG, les outils en ligne de commande sont la façon la plus rapide.
Compression par lot sans perte
# Linux / macOS : compression max + suppression des métadonnées
mkdir -p compressed
for f in *.png *.PNG; do
[ -f "$f" ] || continue
magick "$f" -strip -quality 95 "compressed/$f"
done
Optimisation de palette par lot (pngquant)
# Réduire tous les PNG à la palette 256 couleurs
mkdir -p optimized
for f in *.png *.PNG; do
[ -f "$f" ] || continue
pngquant 256 --quality=80-100 "$f" -o "optimized/$f"
done
Windows PowerShell
New-Item -ItemType Directory -Force -Path ".\compressed"
Get-ChildItem *.png | ForEach-Object {
magick $_.FullName -strip -quality 95 (".\compressed\" + $_.Name)
}
Conversion PNG en JPG par lot (économies maximales pour les photos)
# Convertir toutes les photos PNG en JPEG Q85
mkdir -p jpg_output
for f in *.png *.PNG; do
[ -f "$f" ] || continue
magick "$f" -quality 85 -interlace Plane -strip "jpg_output/${f%.*}.jpg"
done