Frage Wie ist PNG verlustfrei, da es einen Komprimierungsparameter hat?


PNG-Dateien sollen verlustfreie Komprimierung verwenden. Wann immer ich in einem Bildeditor bin, wie z GIMP Wenn Sie versuchen, ein Bild als PNG-Datei zu speichern, werden Sie nach dem Komprimierungsparameter gefragt, der zwischen 0 und 9 liegt. Wenn ein Komprimierungsparameter die visuelle Genauigkeit des komprimierten Bilds beeinflusst, wie wird PNG verlustfrei gemacht?

Bekomme ich verlustfreies Verhalten nur, wenn ich den Komprimierungsparameter auf 9 setze?


149
2017-11-26 18:11


Ursprung


Die meisten verlustfreien Komprimierungsalgorithmen haben Einstellparameter (wie die Größe des Verzeichnisses), die in einem Schieberegler "Wie viel Aufwand sollte bei der Minimierung der Ausgabegröße gemacht werden" verallgemeinert werden. Dies gilt für ZIP, GZip, BZip2, LZMA, ... - Daniel B
Die Frage könnte anders formuliert werden. Wenn durch die Komprimierung keine Qualität verloren geht, warum nicht immer die Komprimierung verwenden, die die kleinste Größe erzeugt? Die Antwort wäre dann, weil es mehr RAM und mehr CPU-Zeit zum Komprimieren und Dekomprimieren benötigt. Manchmal möchten Sie eine schnellere Komprimierung und interessieren sich nicht so sehr für das Komprimierungsverhältnis. - kasperd
PNG-Komprimierung ist fast identisch mit ZIP-Dateien. Sie können sie mehr oder weniger komprimieren, aber Sie erhalten die genaue Datei zurück, wenn sie dekomprimiert - das macht es verlustfrei. - mikebabcock
Die meisten Komprimierungssoftware wie Zip und Rar erlauben es Ihnen, "Komprimierungsstufe" einzugeben, mit der Sie zwischen einer kleineren Datei <-> kürzeren Zeit wählen können. Es bedeutet nicht, dass diese Software Daten während der Komprimierung verwerfen. Diese Einstellung (in GIMP, pngcrush usw.) ist ähnlich. - Salman A
@ Naxa: Es gibt keine Vorbehalte, wie verlustfrei png wirklich ist. Es ist immer 100% verlustfrei. Der Artikel warnt Sie nur vor Bugs, die einige alte Browser in ihrer PNG-Implementierung zur Handhabung der Gammakorrektur hatten. Und das ist nur sinnvoll, wenn Sie die Farbe mit CSS-Farben abgleichen müssen (die nicht gammakorrigiert sind). - Pauli L


Antworten:


PNG ist verlustfrei. GIMP verwendet in diesem Fall höchstwahrscheinlich nicht das beste Wort. Stellen Sie es sich als "Qualität der Komprimierung" oder mit anderen Worten "Komprimierungsgrad" vor. Mit geringerer Komprimierung erhalten Sie eine größere Datei, aber es dauert weniger Zeit zu produzieren, während Sie mit höherer Komprimierung eine kleinere Datei erhalten, die länger dauert. Normalerweise erhalten Sie abnehmende Renditen (d. H. Nicht so viel Verringerung der Größe im Vergleich zu der Zunahme der Zeit), wenn Sie zu den höchsten Komprimierungsstufen gehen, aber es liegt an Ihnen.


181
2017-11-26 18:31



Außerdem hat die PNG-Komprimierung tatsächlich viele einstellbare Parameter, bei denen Anpassungen in beiden Richtungen die Ausgabegröße abhängig vom Inhalt der Quelle verringern können - sie ist weitaus komplexer als ein einfacher "besserer" und "schlechterer" Schieberegler. Für allgemeine Zwecke ist es nicht so wichtig, aber wenn Sie das absolut kleinste wollen, dann verwenden Sie ein Werkzeug wie pngcrush das kann viele Variationen für das kleinstmögliche vergleichen. - Bob
Ein höherer Komprimierungsgrad erhöht die Komprimierungszeit, hat aber auch Auswirkungen Dekompression auch? - Nolonar
@Nolonar Im Allgemeinen keine; Wenn überhaupt, verringert eine höhere Komprimierungsstufe normalerweise die Dekomprimierungszeit, da weniger Daten für das Lesen und Verarbeiten benötigt werden. Die längere Komprimierungszeit ist darauf zurückzuführen, dass eine gründlichere Suche nach zu komprimierenden (zu stark vereinfachenden) Mustern durchgeführt wird. - fluffy
@fluffy LordNeckbeards Antwort hatte die höchste Komprimierung und dauerte 5x länger als die niedrigste. - André Chalella
Für PNG, es ist ziemlich häufig, um eine längere Dekompressionszeit für besser komprimierte Dateien zu haben. Das Problem ist, dass mit PNG ein möglicher Trick darin besteht, den Komprimierungsalgorithmus immer wieder anzuwenden, solange die Datei kleiner wird. Sobald die Größe zunimmt, hören Sie auf, es anzuwenden. Es ist also gut möglich, dass Sie den Komprimierungsalgorithmus 5 oder 6 Mal anwenden, was bedeutet, dass Sie die Datei 5 oder 6 Mal dekomprimieren müssen, um das Bild anzuzeigen. - yo'


PNG ist komprimiert, aber verlustfrei

Das Komprimierungsniveau ist ein Kompromiss zwischen Dateigröße und Codier- / Decodiergeschwindigkeit. Zu übermäßig verallgemeinernd, haben auch Nicht-Bildformate wie FLAC ähnliche Konzepte.

Unterschiedliche Komprimierungsstufen, gleiche decodierte Ausgabe

Obwohl die Dateigrößen aufgrund der unterschiedlichen Komprimierungsstufen unterschiedlich sind, ist die tatsächliche dekodierte Ausgabe identisch.

Sie können das vergleichen MD5 Hashes der dekodierten Ausgaben mit ffmpeg Verwendung der MD5-Muxer.

Dies wird am besten anhand einiger Beispiele gezeigt:

Erstellen Sie PNG-Dateien:

$ ffmpeg -i input -vframes 1 -compression_level 0 0.png
$ ffmpeg -i input -vframes 1 -compression_level 100 100.png
  • Standardmäßig ffmpeg wird benutzen -compression_level 100 für PNG-Ausgabe.

Dateigröße vergleichen:

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

Dekodiere die PNG-Dateien und zeige MD5-Hashes:

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

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

Da beide Hashes identisch sind, können Sie sicher sein, dass die dekodierten Ausgaben (das unkomprimierte, rohe Video) genau gleich sind.


210
2017-11-27 08:27



+1 wusste nicht, dass ffmpeg mit PNGs umgehen konnte. - Lekensteyn
@ Lekensteyn Es ist großartig für Screenshots machen. Beispiel um 30 Sekunden zu überspringen und Screenshot zu machen: ffmpeg -ss 30 -i input -vframes 1 output.png Auch gut für Videos aus Bildern machen und umgekehrt. - LordNeckbeard
Bedeutet es, dass das PNG jedes Mal dekomprimiert werden muss, wenn es gerendert werden muss? Denn wenn das stimmt, müssen wir sein - akshay2000
Wenn Sie die Datei erneut von Diskette oder Cache lesen, muss sie dekomprimiert werden. Auf derselben Seite kann der Cache die dekomprimierte Version wahrscheinlich wiederverwenden. - David Mårtensson
@ akshay2000 Hängt davon ab, wie das Programm arbeitet, das das PNG rendert. Normalerweise wird die Datei von der Festplatte gelesen, dekomprimiert und im RAM gepuffert. Solange es im RAM gepuffert ist, muss das Bild nicht erneut dekomprimiert werden. - xZise


Die PNG-Komprimierung erfolgt in zwei Stufen.

  1. Die Vorkomprimierung ordnet die Bilddaten neu an, sodass sie durch einen allgemeinen Komprimierungsalgorithmus stärker komprimierbar sind.
  2. Die eigentliche Komprimierung wird von DEFLATE durchgeführt, das nach doppelten Byte-Sequenzen sucht und sie durch kurze Token ersetzt.

Da Schritt 2 eine sehr zeit- und ressourcenintensive Aufgabe ist, benötigt die zugrunde liegende zlib-Bibliothek (Encapsulation of Raw DEFLATE) einen Komprimierungsparameter von 1 = schnellste Komprimierung, 9 = beste Komprimierung, 0 = keine Komprimierung. Von dort kommt der 0-9-Bereich, und GIMP übergibt diesen Parameter einfach an zlib. Beachten Sie, dass auf Stufe 0 Ihr png tatsächlich etwas größer ist als die entsprechende Bitmap.

Level 9 ist jedoch nur das "Beste" was zlib versuchen wird und ist immer noch sehr a Kompromisslösung.
Um wirklich ein Gefühl dafür zu bekommen, können Sie, wenn Sie 1000x mehr Rechenleistung für eine erschöpfende Suche ausgeben wollen, eine 3-8% höhere Datendichte verwenden zöpfli anstelle von zlib.
Die Komprimierung ist immer noch verlustfrei, es ist nur eine optimale DEFLATE-Darstellung der Daten. Dies nähert sich den Grenzen einer zlib-kompatiblen Bibliothek und ist daher die wahre "beste" Komprimierung, die mit PNG erreicht werden kann.


24
2017-11-28 09:55



Hinweis: Die Dekomprimierungszeit ist unabhängig von der Komprimierungsstufe oder der Anzahl der Iterationen bei Verwendung von zopflipng gleich. - Adria


Eine Hauptmotivation für das PNG-Format bestand darin, einen Ersatz für GIF zu schaffen, der nicht nur kostenlos war, sondern auch im wesentlichen in jeder Hinsicht eine Verbesserung darstellte. Als Ergebnis ist die PNG-Komprimierung vollständig verlustfrei - das heißt, die ursprünglichen Bilddaten können Bit für Bit genau rekonstruiert werden - genau wie in GIF und den meisten Formen von TIFF.

PNG verwendet einen 2-stufigen Komprimierungsprozess:

  1. Vorkomprimierung: Filtern (Vorhersage)
  2. Kompression: DEFLATE (siehe Wikipedia)

Der Vorkomprimierungsschritt wird als Filtern bezeichnet, bei dem es sich um ein Verfahren zum reversiblen Transformieren der Bilddaten handelt, so dass die Hauptkomprimierungsmaschine effizienter arbeiten kann.

Betrachten Sie als einfaches Beispiel eine Sequenz von Bytes, die gleichmäßig von 1 bis 255 ansteigen:

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

Da es in der Sequenz keine Wiederholung gibt, komprimiert es entweder sehr schlecht oder gar nicht. Aber eine triviale Modifikation der Sequenz - nämlich das erste Byte alleine zu lassen, aber jedes nachfolgende Byte durch den Unterschied zwischen ihm und seinem Vorgänger zu ersetzen - transformiert die Sequenz in eine extrem komprimierbare Menge:

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

Die obige Transformation ist verlustfrei, da keine Bytes weggelassen wurden und vollständig reversibel sind. Die komprimierte Größe dieser Serie wird sehr reduziert sein, aber die ursprüngliche Serie kann noch perfekt rekonstituiert sein.

Tatsächliche Bilddaten sind selten so perfekt, aber die Filterung verbessert die Komprimierung in Graustufen- und Echtfarbenbildern und kann auch bei einigen Palettenbildern hilfreich sein. PNG unterstützt fünf Arten von Filtern und ein Encoder kann für jede Pixelzeile im Bild einen anderen Filter verwenden:

image

Der Algorithmus arbeitet mit Bytes, aber für große Pixel (z. B. 24-Bit RGB oder 64-Bit RGBA) es werden nur die entsprechenden Bytes verglichen, also die roten Komponenten der Pixelfarben wird getrennt von den grünen und blauen Pixelkomponenten gehandhabt.

Um den besten Filter für jede Zeile auszuwählen, müsste ein Encoder alle möglichen Kombinationen testen. Dies ist eindeutig unmöglich, da selbst ein 20-reihiges Bild Tests über 95 Billionen Kombinationen erfordern würde, wobei "Testen" das Filtern und Komprimieren des gesamten Bildes beinhalten würde.

Komprimierungsstufen werden normalerweise als Zahlen zwischen 0 (keine) und 9 (beste) definiert. Diese beziehen sich auf Kompromisse zwischen Geschwindigkeit und Größe und beziehen sich auf wie viele Kombinationen von Zeilenfiltern soll versucht werden. Bezüglich dieser Komprimierungsstufen gibt es keine Standards. Jeder Bild-Editor kann also eigene Algorithmen haben, wie viele Filter wann zu verwenden sind Optimierung der Bildgröße.

Komprimierungsstufe 0 bedeutet, dass Filter überhaupt nicht verwendet werden, was schnell aber verschwenderisch ist. Höhere Ebenen bedeuten, dass mehr und mehr Kombinationen auf Bildreihen und nur die besten versucht werden diese werden beibehalten.

Ich würde annehmen, dass der einfachste Ansatz für die beste Komprimierung darin besteht, jede Zeile schrittweise mit jedem Filter zu komprimieren, das kleinste Ergebnis zu speichern und für die nächste Zeile zu wiederholen. Dies führt dazu, dass das gesamte Bild fünf Mal gefiltert und komprimiert wird, was ein vernünftiger Kompromiss für ein Bild sein kann, das viele Male übertragen und decodiert wird. Geringere Komprimierungswerte werden nach eigenem Ermessen weniger tun des Entwicklers des Tools.

Zusätzlich zu den Filtern wirkt sich die Komprimierungsstufe möglicherweise auch auf die zlib-Komprimierungsstufe aus Dies ist eine Zahl zwischen 0 (kein Deflate) und 9 (maximales Deflate). Wie die angegebenen 0-9 Ebenen beeinflussen die Verwendung von Filtern, die die Hauptfunktion der Optimierung von PNG sind, ist immer noch abhängig vom Entwickler des Tools.

Die Schlussfolgerung ist, dass PNG einen Komprimierungsparameter hat, der die Dateigröße sehr signifikant reduzieren kann, ohne dass sogar ein einzelner Pixel verloren geht.

Quellen:

Wikipedia Portable Netzwerk Grafik
libpng documentation Kapitel 9 - Komprimierung und Filterung


15
2017-11-29 15:12



Ich glaube nicht, dass die Einstellung der Komprimierungsstufe die Verwendung von Filtern ändert. Die Stufe 1-9 wählt wahrscheinlich nur die ZLIB-Kompressionsstufe 1-9, und die Stufe 0 bedeutet, dass der Deflate-Algorithmus überhaupt nicht verwendet wird. Die meisten Implementierungen ändern wahrscheinlich nicht die Filter pro Zeile, sondern verwenden den Path-Filter die ganze Zeit. - Pauli L
@PauliL: Dem stimme ich nicht zu, denn bei allen Vergleichen von PNG-Komprimierungssoftware gibt es sehr große Unterschiede zwischen den Größen der erzeugten Bilder. Wenn alle Produkte die gleichen Parameter für dieselbe Bibliothek verwenden, sollten alle Größen gleich sein und die Geschwindigkeit sollte gleich sein. - harrymc
Haben Sie Verbindungen zu solchen Vergleichen? - Pauli L
@PauliL: Eine schnelle Suche kam auf dieser Vergleich. - harrymc
@PauliL: Sie haben wahrscheinlich Recht, dass die Komprimierungsstufen von zlib von den Komprimierungsstufen von PNG betroffen sind. Ich habe meine Antwort entsprechend geändert, obwohl kein Komprimierungstool dokumentiert, was sie genau machen. Die Erklärung für die Werkzeuge mit den schlechtesten Ergebnissen ist vielleicht, dass sie überhaupt keine Filter verwenden, nur zlib-Komprimierung. - harrymc


OK, ich bin zu spät für die Belohnung, aber hier ist meine Antwort trotzdem.

PNG ist immer verlustfrei. Es verwendet Deflate / Inflate-Algorithmus, ähnlich wie in Zip-Programmen.

Der Deflate-Algorithmus durchsucht wiederholte Sequenzen von Bytes und ersetzt diese durch Tags. Die Einstellung für die Komprimierungsstufe gibt an, wie viel Aufwand das Programm benötigt, um die optimale Kombination von Bytefolgen zu finden, und wie viel Speicher dafür reserviert ist. Es ist ein Kompromiss zwischen Zeit und Speicherverbrauch vs. komprimierte Dateigröße. Moderne Computer sind jedoch so schnell und verfügen über genügend Arbeitsspeicher, dass nur selten die höchste Komprimierungseinstellung verwendet werden muss.

Viele PNG-Implementierungen verwenden die zlib-Bibliothek für die Komprimierung. Zlib hat neun Komprimierungsstufen, 1-9. Ich kenne die Interna von Gimp nicht, aber da es Kompressionseinstellungen von 0-9 hat (0 = keine Komprimierung), würde ich annehmen, dass diese Einstellung einfach den Komprimierungsgrad von zlib auswählt.

Deflate Algorithmus ist a Allgemeiner KomprimierungsalgorithmusEs wurde nicht zum Komprimieren von Bildern entwickelt. Im Gegensatz zu den meisten anderen verlustfreien Bilddateiformaten ist das PNG-Format nicht darauf beschränkt. Die PNG-Komprimierung nutzt das Wissen, das wir komprimieren 2D-Bild. Dies wird durch so genannt Filter.

(Filter ist hier eigentlich ein etwas irreführender Begriff. Er verändert den Bildinhalt nicht, er kodiert ihn nur anders. Genauerer Name wäre Delta-Encoder.)

Die PNG-Spezifikation spezifiziert 5 verschiedene Filter (einschließlich 0 = keine). Der Filter ersetzt absolute Pixelwerte mit Unterschied zum vorherigen Pixel nach links, oben, diagonal oder Kombination von denen. Dies kann das Kompressionsverhältnis signifikant verbessern. Jede Scanlinie auf dem Bild kann verschiedene Filter verwenden. Der Encoder kann die Komprimierung optimieren, indem er den besten Filter für jede Zeile auswählt.

Einzelheiten zum PNG-Dateiformat finden Sie unter PNG-Spezifikation.

Da es praktisch unendlich viele Kombinationen gibt, ist es nicht möglich, alle zu testen. Daher wurden verschiedene Arten von Strategien entwickelt, um eine wirksame Kombination zu finden. Die meisten Bildbearbeitungsprogramme versuchen wahrscheinlich nicht einmal, die Filter Zeile für Zeile zu optimieren, sondern verwenden stattdessen einen festen Filter (höchstwahrscheinlich Paeth).

Ein Befehlszeilenprogramm pngcrush versucht mehrere Strategien, um das beste Ergebnis zu finden. Es kann die Größe der PNG-Datei, die von anderen Programmen erstellt wird, erheblich reduzieren, bei größeren Bildern kann es jedoch etwas länger dauern. Sehen Quellschmiede - pngcrush.


5
2017-11-30 13:45





Die Komprimierungsstufe in verlustfreien Daten ist immer nur die Kodierung von Ressourcen (normalerweise Zeit, manchmal auch RAM) im Vergleich zur Bitrate. Qualität ist immer 100%.

Natürlich können verlustfreie Kompressoren NIEMALS garantieren jede tatsächliche Komprimierung. Zufällige Daten sind inkompressibel, es gibt kein Muster und keine Ähnlichkeit. Shannon Informationstheorie und all das. Der Hauptgrund für die verlustfreie Datenkomprimierung ist, dass Menschen normalerweise mit sehr zufälligen Daten arbeiten, aber für die Übertragung und Speicherung können wir sie auf möglichst wenige Bits komprimieren. Hoffentlich bis zum nächsten Kolmogorov Komplexität vom Original.

Egal, ob es sich um Zip- oder 7z-generische Daten, PNG-Bilder, Flac-Audio oder h.264-Videos (im verlustfreien Modus) handelt, es ist dasselbe. Mit einigen Komprimierungsalgorithmen wie lzma (7zip) und bzip2 erhöht das Hochfahren der Komprimierungseinstellung die CPU-Zeit des DECODERs (bzip2) oder öfter nur die Menge an benötigtem RAM (lzma und bzip2 und h.264 mit mehr Referenzbildern). . Oft muss der Dekodierer mehr dekodierte Ausgaben im RAM speichern, da das Decodieren des nächsten Bytes sich auf ein vor vielen Megabyte dekodiertes Byte beziehen könnte (z. B. würde ein Videoframe, der dem einer vor einer halben Sekunde am ähnlichsten ist, mit Referenzen auf 12 Frames codiert werden) ). Das Gleiche gilt für bzip2 und die Auswahl einer großen Blockgröße, die aber auch langsamer dekomprimiert wird. lsma hat ein Wörterbuch mit variabler Größe, und Sie könnten Dateien erstellen, die 1,5 GB RAM benötigen, um zu dekodieren.


3
2017-12-02 13:38



Hmmm, ich sah eine Implementierung, um die Steuerung des Antriebsschrittmotors und -kopfs direkt zu steuern, um eine verlustfreie Kompression zu gewährleisten. Die Manchester-Codierung ist leicht zu übertreffen, wenn Sie eine hochauflösende Taktquelle haben. - Joshua
@Joshua: Die Verwendung eines physischen Speicherformats mit höherer Dichte ist nicht dasselbe wie bei der Datenkomprimierung ... - SamB


Erstens ist PNG immer verlustfrei. Das scheinbare Paradox liegt an der Tatsache, dass es zwei verschiedene Arten von Komprimierung gibt (für jede Art von Daten): verlustbehaftet und verlustfrei.

Verlustfreie Kompression drückt die Daten (d. h. die Dateigröße) mit verschiedenen Tricks zusammen, behält alles bei und macht keine Annäherung. Als Ergebnis ist es möglich, dass eine verlustfreie Komprimierung die Dinge überhaupt nicht komprimieren kann. (Technisch können Daten mit hoher Entropie für verlustfreie Methoden sehr schwer oder sogar unmöglich komprimiert werden.)     Verlustbehaftete Komprimierung approximiert die realen Daten, aber die Annäherung ist nicht perfekt, aber dieses "Wegwerfen" der Präzision ermöglicht typischerweise eine bessere Komprimierung.

Hier ist ein triviales Beispiel für verlustfreie Komprimierung: Wenn Sie ein Bild aus 1.000 schwarzen Pixeln haben, können Sie den Wert für Schwarz 1.000 Mal speichern. Sie können also eine Zahl (1000) und einen Wert (schwarz) speichern und so ein 1000 Pixel komprimieren. Bild "in nur zwei Zahlen. (Dies ist eine grobe Form einer verlustfreien Komprimierungsmethode, die als Lauflängencodierung bezeichnet wird).


0
2017-11-27 06:07