PNG ist die Kombination von Filter + LZ77 + Huffman (die Kombination von LZ77 + Huffman heißt Deflate) in dieser Reihenfolge:
Schritt 1) Wenn sich der Filter von None unterscheidet, wird der Wert der Pixel durch den Unterschied zu den benachbarten Pixeln ersetzt (weitere Informationen finden Sie unter http://www.libpng.org/pub/png/book/chapter09.html ). . Dies erhöht die Komprimierung von Bildern mit Farbverläufen (so wird ... 4 5 6 7 zu ... 1 1 1) und kann in Bereichen mit derselben Farbe hilfreich sein (... 3 3 3 5 5 5 5 5 wird 0) 0 0 2 0 0 0 0 0). Standardmäßig sind Filter in 24-Bit-Bildern aktiviert und in 8-Bit-Bildern mit einer Palette deaktiviert.
Schritt 2) Die Daten werden mit LZ77 komprimiert, das wiederholte (Übereinstimmungs-) Zeichenfolgen von Bytes durch ein Tupel ersetzt, das den Abstand zur Übereinstimmung und die Länge der Übereinstimmung enthält.
Schritt 3) Das Ergebnis von Schritt 2 wird mit Huffman-Code codiert, der Symbole fester Länge durch Codes variabler Länge ersetzt. Je häufiger das Symbol ist, desto kürzer ist der Code.
Es gibt mehrere Probleme:
Eine kleine Änderung, die nur wenige Pixel betrifft, führt zu Änderungen der Ergebnisse aus den drei Schritten der PNG-Komprimierung:
1) Der gefilterte Wert benachbarter Pixel ändert sich (abhängig vom verwendeten Filter). Dadurch werden die Auswirkungen kleiner Änderungen verstärkt.
2) Die Änderung bedeutet, dass die Übereinstimmungen mit diesem Bereich unterschiedlich sind. Das Ändern von 333333 in 333533 führt beispielsweise dazu, dass ein anderes Vorkommen von 333333 nicht mehr übereinstimmt, sodass eine andere Übereinstimmung mit 333333 mit einer anderen Entfernung oder dieselbe Übereinstimmung mit einer kürzeren Länge und dann eine weitere Übereinstimmung für die letzten 3 Bytes ausgewählt wird. An sich wird das die Ergebnisse sehr verändern.
3) Das größte Problem ist in Schritt 3. Der Huffman-Code verwendet eine variable Anzahl von Bits, sodass selbst eine kleine Änderung dazu führt, dass alles, was folgt, nicht mehr ausgerichtet wird. AFAIK Die meisten Komprimierungsalgorithmen können keine Übereinstimmungen erkennen, die nicht byteausgerichtet sind, sodass die Komprimierung der bereits komprimierten Daten, die auf die Änderung folgen, verhindert (oder zumindest stark reduziert wird), es sei denn, der Komprimierer kann Übereinstimmungen erkennen, die nicht byteausgerichtet sind.
Die anderen Fragen werden bereits in anderen Antworten behandelt:
4) Gzip verwendet denselben Deflate-Algorithmus mit einem 32-KB-Wörterbuch. Wenn die PNG-Dateien also größer als 32 KB sind, werden die Übereinstimmungen nicht erkannt, auch wenn sie identisch sind. Bzip2 ist in dieser Hinsicht besser, da es einen Block von 900 KB verwendet. XZ verwendet LZMA, wobei IIRC ein 4-MB-Wörterbuch in der Standardkomprimierungsstufe hat. 5) Das Zip-Format verwendet keine feste Komprimierung, sodass ähnliche oder identische Dateien nicht besser komprimiert werden.
Vielleicht werden Kompressoren aus der PAQ- oder PPMD-Familie besser komprimiert, aber wenn Sie viele ähnliche Bilddateien komprimieren müssen, können Sie drei Ansätze in Betracht ziehen:
1) Speichern Sie die Bilder unkomprimiert (mit PNG -0 oder in einem Format ohne Komprimierung) und komprimieren Sie sie mit einem Kompressor mit einem großen Wörterbuch oder Blockgröße. (LZMA wird gut funktionieren)
2) Eine andere Option wäre, die Filter beizubehalten, aber die Deflate-Komprimierung aus den PNGs zu entfernen. Dies kann beispielsweise mit dem Dienstprogramm ( AdvDef ) erfolgen. Dann komprimieren Sie die resultierenden unkomprimierten PNGs. Nach der Dekomprimierung können Sie das unkomprimierte PNG beibehalten oder mit AdvDef erneut komprimieren (dies wird jedoch einige Zeit dauern).
Sie müssen beide Ansätze testen, um festzustellen, welche Komprimierung am stärksten ist.
3) Die letzte Option wäre das Konvertieren der PNG-Bilder in ein Video, das Komprimieren mit einem verlustfreien Videokomprimierer wie x264 lossless (wobei besonders auf das richtige Farbformat geachtet wird) und das Extrahieren der Frames in einzelne PNG-Bilder. Das geht mit ffmpeg. Sie müssten auch die Zuordnung zwischen der Bildnummer und dem ursprünglichen Namen beibehalten.
Das wäre der komplexeste Ansatz, aber wenn die PNGs alle Teil einer Animation sind, ist dies möglicherweise der effektivste. Sie benötigen jedoch ein Videoformat, das Transparenz unterstützt, wenn Sie es benötigen.
Bearbeiten: Es gibt auch MNG-Format, würde es nicht oft verwendet.