Question Comment PNG sans perte compte-t-il un paramètre de compression?


Les fichiers PNG utilisent la compression sans perte. Cependant, chaque fois que je suis dans un éditeur d'image, tel que GIMP et essayez de sauvegarder une image en tant que fichier PNG, elle demande le paramètre de compression, qui varie entre 0 et 9. Si le paramètre de compression affecte la précision visuelle de l’image compressée, en quoi cela rend-il PNG sans perte?

Est-ce que j'obtiens un comportement sans perte uniquement lorsque le paramètre de compression est défini sur 9?


149
2017-11-26 18:11


origine


La plupart des algorithmes de compression sans perte ont des paramètres ajustables (comme la taille du dictionnaire) qui sont généralisés dans un curseur "combien d'efforts doivent être faits pour minimiser la taille de sortie". Ceci est valable pour ZIP, GZip, BZip2, LZMA, ... - Daniel B
La question pourrait être énoncée différemment. Si aucune compression n'est perdue, pourquoi ne pas toujours utiliser la compression produisant la plus petite taille? La réponse serait alors, car il faut plus de mémoire vive et plus de temps processeur pour compresser et décompresser. Parfois, vous voulez une compression plus rapide et vous souciez moins du taux de compression. - kasperd
La compression PNG est presque identique aux fichiers ZIPping. Vous pouvez les compresser plus ou moins, mais vous récupérez le fichier exact quand il se décompresse - c'est ce qui le rend sans perte. - mikebabcock
La plupart des logiciels de compression tels que Zip et Rar vous permettent d'entrer le "niveau de compression" qui vous permet de choisir entre un fichier plus petit <-> un temps plus court. Cela ne signifie pas que ces logiciels rejettent les données pendant la compression. Ce paramètre (dans GIMP, pngcrush, etc.) est similaire. - Salman A
@naxa: Il n'y a pas de mise en garde quant à la réalité du png sans perte. C'est toujours 100% sans perte. L'article ne vous avertit que des bogues que certains anciens navigateurs avaient dans leur implémentation PNG pour gérer la correction gamma. Et cela n'a de sens que si vous devez faire correspondre la couleur avec les couleurs CSS (qui ne sont pas corrigées des rayons gamma). - Pauli L


Réponses:


PNG est sans perte. GIMP n'utilise probablement pas le meilleur mot dans ce cas. Pensez-y comme "qualité de compression", ou en d'autres termes, "niveau de compression". Avec une compression plus faible, vous obtenez un fichier plus volumineux, mais cela prend moins de temps à produire, alors qu'avec une compression plus élevée, vous obtenez un fichier plus petit qui prend plus de temps à produire. Généralement, vous obtenez des rendements décroissants (c’est-à-dire pas une diminution de la taille par rapport à l’augmentation du temps nécessaire) lorsque vous atteignez les niveaux de compression les plus élevés, mais c’est vous qui décidez.


181
2017-11-26 18:31



De plus, la compression PNG comporte de nombreux paramètres ajustables, où les ajustements dans les deux sens peuvent réduire la taille de la sortie en fonction du contenu de la source - elle est beaucoup plus complexe qu’un simple curseur «meilleur» et «pire». Pour des raisons générales, ce n'est pas trop important, mais si vous voulez le plus petit absolu, utilisez un outil comme pngcrush cela peut comparer beaucoup de variations pour le plus petit possible. - Bob
Un niveau de compression plus élevé augmente le temps de compression, mais affecte-t-il également décompression ainsi que? - Nolonar
@Nolonar Généralement non; au contraire, un niveau de compression plus élevé réduit généralement le temps de décompression, car il nécessite moins de données à lire et à traiter. Le temps de compression plus long est dû à un travail plus approfondi de recherche de motifs à compresser (simplification excessive). - fluffy
La réponse de @fluffy LordNeckbeard faisait que la compression la plus élevée prenait 5 fois plus de temps à décoder que la plus faible. - André Chalella
Pour PNG, il est assez commun d'avoir plus de temps de décompression pour des fichiers mieux compressés. Le problème est que, avec le format PNG, une des astuces possibles consiste à appliquer l’algorithme de compression encore et encore tant que le fichier est plus petit. Une fois la taille augmentée, vous arrêtez de l'appliquer. Il est donc très possible que vous appliquiez l'algorithme de compression 5 ou 6 fois, ce qui signifie que vous devez décompresser le fichier 5 ou 6 fois pour afficher l'image. - yo'


PNG est compressé, mais sans perte

Le niveau de compression est un compromis entre la taille du fichier et la vitesse de codage / décodage. Pour trop généraliser, même les formats non-image, tels que FLAC, ont des concepts similaires.

Différents niveaux de compression, même sortie décodée

Bien que les tailles de fichiers soient différentes, en raison des différents niveaux de compression, la sortie décodée réelle sera identique.

Vous pouvez comparer les MD5 les hachages des sorties décodées avec ffmpeg en utilisant le MD5 muxer.

Ceci est mieux illustré avec quelques exemples:

Créez des fichiers PNG:

$ ffmpeg -i input -vframes 1 -compression_level 0 0.png
$ ffmpeg -i input -vframes 1 -compression_level 100 100.png
  • Par défaut ffmpeg utilisera -compression_level 100 pour la sortie PNG.

Comparer la taille du fichier:

$ du -h *.png
  228K    0.png
  4.0K    100.png

Décodez les fichiers PNG et affichez les hachages MD5:

$ ffmpeg -loglevel error -i 0.png -f md5 -
3d3fbccf770a51f9d81725d4e0539f83

$ ffmpeg -loglevel error -i 100.png -f md5 -
3d3fbccf770a51f9d81725d4e0539f83

Comme les deux hachages sont identiques, vous pouvez être assuré que les sorties décodées (la vidéo brute non compressée) sont exactement les mêmes.


210
2017-11-27 08:27



+1 ne savait pas que ffmpeg pouvait gérer les pngs. - Lekensteyn
@Lekensteyn C'est génial pour faire des captures d'écran. Exemple pour sauter 30 secondes et prendre une capture d'écran: ffmpeg -ss 30 -i input -vframes 1 output.png Aussi bien pour faire des vidéos à partir d'images et vice versa. - LordNeckbeard
Est-ce que cela signifie que le PNG doit être décompressé chaque fois qu'il doit être rendu? Parce que si c'est vrai, il faut être - akshay2000
Si vous relisez le fichier à partir du disque ou du cache, oui, il doit être décompressé. Dans la même page, le cache peut probablement réutiliser la version décompressée. - David Mårtensson
@ akshay2000 Dépend de la façon dont fonctionne le programme qui rend le PNG. Habituellement, le fichier est lu à partir du disque, décompressé et mis en mémoire tampon dans la RAM. Donc, tant qu'il est mis en mémoire tampon dans la RAM, il ne sera plus nécessaire de décompresser l'image. - xZise


La compression PNG se déroule en deux étapes.

  1. La pré-compression réorganise les données d'image afin qu'elles soient plus compressibles grâce à un algorithme de compression général.
  2. La compression réelle est effectuée par DEFLATE, qui recherche et élimine les séquences d'octets en double en les remplaçant par des jetons courts.

Etant donné que l'étape 2 est une tâche nécessitant beaucoup de temps / ressources, la bibliothèque zlib sous-jacente (encapsulation de DEFLATE brute) prend un paramètre de compression allant de 1 = compression la plus rapide, 9 = meilleure compression, 0 = pas de compression. C'est là que provient la plage 0-9, et GIMP transmet simplement ce paramètre à zlib. Notez qu'au niveau 0, votre png sera légèrement plus grand que le bitmap équivalent.

Cependant, le niveau 9 n'est que le "meilleur" que zlib va ​​tenter, et est toujours très solution de compromis.
Pour avoir une idée de la situation, si vous êtes prêt à consacrer 1000 fois plus de puissance de traitement à une recherche exhaustive, vous pouvez augmenter la densité de données de 3 à 8% en utilisant zopfli au lieu de zlib.
La compression est toujours sans perte, c'est juste une représentation DEFLATE plus optimale des données. Cela se rapproche des limites des bibliothèques compatibles avec zlib, et constitue par conséquent la véritable "meilleure" compression possible avec PNG.


24
2017-11-28 09:55



Remarque: Le temps de décompression est le même quel que soit le niveau de compression ou le nombre d'itérations lors de l'utilisation de zopflipng. - Adria


Une des principales motivations du format PNG était de remplacer le format GIF, qui était non seulement gratuit, mais également en amélioration à tous égards. En conséquence, la compression PNG est totalement sans perte, c'est-à-dire que les données d'image originales peuvent être reconstruites exactement, peu à peu, comme dans le format GIF et la plupart des formes de fichiers TIFF.

PNG utilise un processus de compression en deux étapes:

  1. Pré-compression: filtrage (prédiction)
  2. Compression: DEFLATE (voir Wikipédia)

L'étape de précompression est appelée filtrage, qui est une méthode de transformation réversible des données d'image afin que le moteur de compression principal puisse fonctionner plus efficacement.

À titre d'exemple simple, considérons une séquence d'octets augmentant uniformément de 1 à 255:

1, 2, 3, 4, 5, .... 255

Comme il n'y a pas de répétition dans la séquence, il se comprime très mal ou pas du tout. Mais une modification triviale de la séquence - à savoir, laisser le premier octet seul mais remplacer chaque octet suivant par la différence entre ce dernier et son prédécesseur - transforme la séquence en un ensemble extrêmement compressible:

1, 1, 1, 1, 1, .... 1

La transformation ci-dessus est sans perte, car aucun octet n'a été omis et est entièrement réversible. La taille compressée de cette série sera beaucoup réduite, mais la série originale peut encore être parfaitement reconstitué.

Les données d'image réelles sont rarement parfaites, mais le filtrage améliore la compression dans les images en niveaux de gris et en couleurs réelles, et peut également aider sur certaines images de palette. PNG prend en charge cinq types de filtres, et un encodeur peut choisir d'utiliser un filtre différent pour chaque ligne de pixels de l'image:

image

L'algorithme fonctionne sur les octets, mais pour les gros pixels (par exemple, RVB 24 bits ou RGBA 64 bits) seuls les octets correspondants sont comparés, ce qui signifie que les composants rouges des pixels-couleurs sont gérées séparément des composants pixel bleu et vert.

Pour choisir le meilleur filtre pour chaque ligne, un encodeur devra tester toutes les combinaisons possibles. Ceci est clairement impossible, car même une image à 20 lignes nécessiterait de tester plus de 95 billions de combinaisons, où «tester» impliquerait le filtrage et la compression de l'image entière.

Les niveaux de compression sont normalement définis comme des nombres compris entre 0 (aucun) et 9 (meilleur). Celles-ci se réfèrent aux compromis entre vitesse et taille et concernent le nombre de combinaisons des filtres de lignes doivent être essayés. Il n'y a pas de normes en ce qui concerne ces niveaux de compression, donc chaque éditeur d'image peut avoir ses propres algorithmes quant au nombre de filtres à essayer quand optimiser la taille de l'image.

Le niveau de compression 0 signifie que les filtres ne sont pas utilisés du tout, ce qui est rapide mais inutile. Des niveaux plus élevés signifient que de plus en plus de combinaisons sont essayées sur des lignes d'images et que seules les meilleures sont obtenues. ceux-ci sont conservés.

Je suppose que l’approche la plus simple pour obtenir la meilleure compression consiste à tester de manière incrémentielle chaque ligne avec chaque filtre, à enregistrer le plus petit résultat et à répéter pour la ligne suivante. Cela revient à filtrer et à compresser la totalité de l'image cinq fois, ce qui peut constituer un compromis raisonnable pour une image qui sera transmise et décodée plusieurs fois. Des valeurs de compression inférieures feront moins, à la discrétion du développeur de l'outil.

En plus des filtres, le niveau de compression peut également affecter le niveau de compression zlib qui est un nombre compris entre 0 (pas de dégonflage) et 9 (dégonflage maximum). Comment le spécifié 0-9 les niveaux affectent l'utilisation des filtres, qui sont la principale caractéristique d'optimisation de PNG, dépend toujours du développeur de l'outil.

La conclusion est que PNG a un paramètre de compression qui peut réduire la taille du fichier de manière très significative, sans même perdre un seul pixel.

Sources:

Wikipedia Portable Network Graphics
Documentation libpng Chapitre 9 - Compression et filtrage


15
2017-11-29 15:12



Je ne pense pas que le réglage du niveau de compression modifie l'utilisation des filtres. Le paramètre de niveau 1 à 9 choisit probablement le niveau de compression zlib 1-9, et le niveau 0 signifie que l'algorithme de dégonflage n'est pas utilisé du tout. La plupart des implémentations ne changent probablement pas les filtres par ligne, mais utilisent simplement le filtre Path tout le temps. - Pauli L
@ PauliL: Je ne suis pas d'accord, car dans toutes les comparaisons du logiciel de compression PNG, il existe de très grandes différences entre les tailles des images générées. Si tous les produits utilisaient les mêmes paramètres pour la même bibliothèque, tous les formats auraient dû être identiques, ainsi que la vitesse. - harrymc
Avez-vous des liens vers de telles comparaisons? - Pauli L
@PauliL: Une recherche rapide a eu lieu avec cette comparaison. - harrymc
@ PauliL: Vous avez probablement raison de dire que les niveaux de compression zlib sont affectés par les niveaux de compression du format PNG. J'ai modifié ma réponse en conséquence, bien qu'aucun outil de compression ne documente exactement ce qu'ils font. Peut-être l'explication des outils avec les plus mauvais résultats en taille est qu'ils n'utilisent aucun filtre, seulement la compression zlib. - harrymc


OK, je suis trop en retard pour la prime, mais voici ma réponse.

PNG est toujours sans perte. Il utilise l'algorithme Deflate / Inflate, similaire à ceux utilisés dans les programmes zip.

L'algorithme Deflate recherche les séquences répétées d'octets et remplace celles avec les tags. Le paramètre de niveau de compression spécifie combien d'effort le programme utilise pour trouver la combinaison optimale de séquences d'octets et la quantité de mémoire réservée pour cela. C'est un compromis entre le temps et l'utilisation de la mémoire par rapport à la taille du fichier compressé. Toutefois, les ordinateurs modernes sont si rapides et disposent de suffisamment de mémoire, de sorte qu’il est rarement nécessaire d’utiliser un paramètre de compression autre que le plus élevé.

De nombreuses implémentations PNG utilisent la bibliothèque zlib pour la compression. Zlib a neuf niveaux de compression, 1-9. Je ne connais pas les paramètres internes de Gimp, mais comme il a des paramètres de niveau de compression de 0 à 9 (0 = pas de compression), je suppose que ce paramètre sélectionne simplement le niveau de compression de zlib.

L'algorithme Deflate est un algorithme de compression à usage général, il n'a pas été conçu pour compresser des images. Contrairement à la plupart des autres formats de fichiers d'images sans perte, le format PNG ne se limite pas à cela. La compression PNG tire parti du fait que nous compressons un Image 2D. Ceci est réalisé par soi-disant les filtres.

(Filter est en fait un terme un peu trompeur ici. Il ne modifie pas réellement le contenu de l'image, il le code simplement différemment. Un nom plus précis serait un encodeur delta.)

La spécification PNG spécifie 5 filtres différents (dont 0 = aucun). Le filtre remplace les valeurs de pixels absolues par différence du pixel précédent à gauche, en haut, en diagonale ou en combinaison de ceux-ci. Cela peut considérablement améliorer le taux de compression. Chaque ligne de numérisation sur l'image peut utiliser un filtre différent. L'encodeur peut optimiser la compression en choisissant le meilleur filtre pour chaque ligne.

Pour plus de détails sur le format de fichier PNG, voir Spécification PNG.

Comme il y a un nombre pratiquement infini de combinaisons, il n'est pas possible de les essayer toutes. Par conséquent, différents types de stratégies ont été développés pour trouver une combinaison efficace. La plupart des éditeurs d'images n'essayent probablement même pas d'optimiser les filtres ligne par ligne mais utilisent plutôt un filtre fixe (probablement le Paeth).

Un programme en ligne de commande pngcrush essaie plusieurs stratégies pour trouver le meilleur résultat. Cela peut réduire considérablement la taille du fichier PNG créé par d'autres programmes, mais cela peut prendre un certain temps sur les images plus grandes. Voir Source Forge - pngcrush.


5
2017-11-30 13:45





Le niveau de compression des éléments sans perte consiste toujours à échanger des ressources de codage (généralement du temps, parfois aussi de la RAM) par rapport au débit binaire. La qualité est toujours de 100%.

Bien sûr, les compresseurs sans perte peuvent NE JAMAIS GARANTI toute compression réelle. Les données aléatoires sont incompressibles, il n'y a aucun modèle à trouver et aucune similarité. La théorie de l'information de Shannon et tout ça. L'intérêt de la compression de données sans perte est que les humains travaillent généralement avec des données très aléatoires, mais pour la transmission et le stockage, nous pouvons les compresser en un minimum de bits. Espérons que le plus près possible de la La complexité de Kolmogorov de l'original.

Qu'il s'agisse de données génériques zip ou 7z, d'images png, audio flac ou de vidéo h.264 (en mode sans perte), c'est la même chose. Avec certains algorithmes de compression, comme lzma (7zip) et bzip2, augmenter le temps de compression augmentera le temps CPU (bzip2) du DECODER ou plus souvent la quantité de RAM nécessaire (lzma et bzip2, et h.264 avec plus d'images de référence) . Souvent, le décodeur doit enregistrer davantage de sorties décodées dans la RAM car le décodage de l'octet suivant peut se référer à un octet décodé il y a plusieurs mégaoctets (par exemple, une image vidéo semblable à une seconde serait codée avec des références à 12 images). ). Même chose avec bzip2 et en choisissant une taille de bloc importante, mais qui décompresse également plus lentement. lzma possède un dictionnaire de taille variable et vous pouvez créer des fichiers nécessitant 1,5 Go de RAM pour le décoder.


3
2017-12-02 13:38



Hmmm j'ai vu une mise en œuvre pour contrôler le moteur pas à pas de la commande et la tête directement pour fournir une compression sans perte garantie. Le codage Manchester est facilement battu si vous avez une source d'horloge haute résolution. - Joshua
@Joshua: L'utilisation d'un format de stockage physique à haute densité n'est pas identique à la compression de données ... - SamB


Premièrement, le PNG est toujours sans perte. Le paradoxe apparent est dû au fait qu’il existe deux types de compression possibles (pour tous les types de données): perte et perte.

Compression sans perte réduit les données (c.-à-d. la taille du fichier) en utilisant différentes astuces, en conservant tout et sans faire aucune approximation. En conséquence, il est possible que la compression sans perte ne puisse pas réellement compresser les choses. (Techniquement, les données à forte entropie peuvent être très difficiles, voire impossibles à compresser pour les méthodes sans perte.)     La compression avec perte se rapproche des données réelles, mais l'approximation est imparfaite, mais ce "rejet" de précision permet généralement une meilleure compression.

Voici un exemple trivial de compression sans perte: si vous avez une image composée de 1 000 pixels noirs, au lieu de stocker la valeur 1 000 fois en noir, vous pouvez stocker un nombre (1000) et une valeur (noire) pour compresser 1000 pixels " image "en seulement deux chiffres. (Ceci est une forme brute d'une méthode de compression sans perte appelée encodage de longueur d'exécution).


0
2017-11-27 06:07