Eine Hauptmotivation für das PNG-Format war die Schaffung eines Ersatzes für GIF, der nicht nur kostenlos war, sondern auch in praktisch jeder Hinsicht eine Verbesserung darstellte. Dadurch ist die PNG-Komprimierung völlig verlustfrei - das heißt, die ursprünglichen Bilddaten können Bit für Bit genau rekonstruiert werden - genau wie in GIF und den meisten TIFF-Formen.
PNG verwendet ein zweistufiges Komprimierungsverfahren:
- Vorkomprimierung: Filterung (Vorhersage)
- Komprimierung: DEFLATE (siehe Wikipedia )
Der Vorkomprimierungsschritt wird als Filtern bezeichnet. Hierbei handelt es sich um eine Methode zur reversiblen Transformation der Bilddaten, damit die Hauptkomprimierungsmaschine effizienter arbeiten kann.
Betrachten Sie als einfaches Beispiel eine Folge von Bytes, die gleichmäßig von 1 auf 255 ansteigt:
1, 2, 3, 4, 5, .... 255
Da die Sequenz keine Wiederholung enthält, wird sie entweder sehr schlecht oder gar nicht komprimiert. Eine triviale Modifikation der Sequenz - nämlich das erste Byte in Ruhe 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 ausgelassen wurden, und ist vollständig umkehrbar. Die komprimierte Größe dieser Serie wird stark reduziert, aber die ursprüngliche Serie kann immer noch perfekt wiederhergestellt werden.
Tatsächliche Bilddaten sind selten so perfekt, aber das Filtern verbessert die Komprimierung von Graustufen- und Echtfarbenbildern und kann auch bei einigen Palettenbildern hilfreich sein. PNG unterstützt fünf Filtertypen, und ein Encoder kann für jede Pixelzeile im Bild einen anderen Filter verwenden:
Der Algorithmus arbeitet mit Bytes, aber für große Pixel (z. B. 24-Bit-RGB oder 64-Bit-RGBA) werden nur entsprechende Bytes verglichen, was bedeutet, dass die roten Komponenten der Pixelfarben getrennt von den grünen und blauen Pixelkomponenten behandelt werden.
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 Bild mit 20 Zeilen das Testen von mehr als 95 Billionen Kombinationen erfordern würde, wobei das "Testen" das Filtern und Komprimieren des gesamten Bildes umfassen 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 darauf, wie viele Kombinationen von Zeilenfiltern ausprobiert werden sollen. Bezüglich dieser Komprimierungsstufen gibt es keine Standards. Daher verfügt jeder Bildeditor möglicherweise über eigene Algorithmen, um zu bestimmen, wie viele Filter bei der Optimierung der Bildgröße verwendet werden sollen.
Komprimierungsstufe 0 bedeutet, dass überhaupt keine Filter verwendet werden, was zwar schnell, aber verschwenderisch ist. Höhere Werte bedeuten, dass immer mehr Kombinationen für Bildzeilen ausprobiert werden und nur die besten beibehalten werden.
Ich würde vermuten, dass der einfachste Ansatz für die beste Komprimierung darin besteht, jede Zeile mit jedem Filter inkrementell zu komprimieren, das kleinste Ergebnis zu speichern und für die nächste Zeile zu wiederholen. Dies bedeutet, dass das gesamte Bild fünfmal gefiltert und komprimiert wird. Dies kann ein angemessener Kompromiss für ein Bild sein, das viele Male übertragen und decodiert wird. Niedrigere Komprimierungswerte können nach Ermessen des Werkzeugentwicklers weniger bewirken.
Zusätzlich zu Filtern kann die Komprimierungsstufe auch die zlib-Komprimierungsstufe beeinflussen, die eine Zahl zwischen 0 (keine Deflate) und 9 (maximale Deflate) ist. Wie sich die angegebenen 0-9-Stufen auf die Verwendung von Filtern auswirken, die die Hauptoptimierungsfunktion von PNG darstellen, hängt weiterhin vom Entwickler des Tools ab.
Die Schlussfolgerung ist, dass PNG über einen Komprimierungsparameter verfügt, der die Dateigröße erheblich reduzieren kann, ohne dass auch nur ein Pixel verloren geht.
Quellen:
Wikipedia Portable Network Graphics
libpng-Dokumentation Kapitel 9 - Komprimierung und Filterung