PNG, Filtreler + LZ77 + Huffman (LZ77 + Huffman kombinasyonuna Deflate denir) kombinasyonudur:
1. adım) filtre Yok'tan farklıysa, piksellerin değeri bitişik piksellerden farklılıkla değiştirilir (daha fazla ayrıntı için bkz. http://www.libpng.org/pub/png/book/chapter09.html ) . Bu, görüntülerin degradelerle sıkıştırılmasını artırır (böylece ... 4 5 6 7 olur ... 1 1 1 1) ve aynı renkteki alanlarda yardımcı olabilir (... 3 3 3 5 5 5 5 5 0 olur 0 0 2 0 0 0 0 0). Varsayılan olarak filtreler 24 bitlik görüntülerde etkinleştirilir ve paletle 8 bitlik görüntülerde devre dışı bırakılır.
adim 2) veriler, tekrarlanan (eşleşme) bayt dizelerini, eşleşmeye olan mesafeyi ve eşleşmenin uzunluğunu içeren bir tuple ile değiştiren LZ77 ile sıkıştırılır.
Aşama 3) Aşama 2'nin sonucu, sabit uzunluklu sembolleri değişken uzunluklu kodlarla değiştiren Huffman kodu ile kodlanır, sembol ne kadar sık olursa kod o kadar kısa olur.
Birden fazla sorun var:
Birkaç pikseli etkileyen küçük bir değişiklik, png sıkıştırmasının 3 adımındaki sonuçlarda değişikliklere neden olur:
1) Bitişik piksellerin filtrelenmiş değeri değişecektir (kullanılan filtreye bağlı olarak). Bu, küçük değişikliklerin etkilerini artıracaktır.
2) Değişiklik, o bölgeyle eşleşmenin farklı olacağı anlamına gelecektir. Örneğin, 333333'ü 333533 olarak değiştirmek, 333333'ün başka bir oluşumunun artık eşleşmemesine neden olur, bu nedenle farklı bir mesafeyle 333333'e başka bir eşleşme seçer veya aynı eşleşmeyi seçer, ancak daha kısa bir uzunluk ve daha sonra son 3 bayt için başka bir eşleşme seçer. Kendi başına sonuçları çok değiştirecek.
3) En büyük sorun 3. adımdadır. Huffman kodu değişken sayıda bit kullanır, böylece küçük bir değişiklik bile takip eden her şeyin artık hizalanmamasına neden olur. AFAIK Çoğu sıkıştırma algoritması, bayt hizalı olmayan eşleşmeleri algılayamaz, böylece kompresör bayt hizalı olmayan eşleşmeleri algılayamazsa, değişikliği izleyen zaten sıkıştırılmış veriler üzerinde sıkıştırmayı önler (veya en azından çok azaltır).
Diğer konular zaten diğer yanıtlar tarafından ele alınmıştır:
4) Gzip, 32KB sözlükle aynı Deflate algoritmasını kullanır, bu nedenle png dosyaları 32KB'den büyükse eşleşmeler aynı olsalar bile algılanmaz. Bzip2, 900 KB'lık bir blok kullandığından bu açıdan daha iyidir. XZ, IIRC'nin varsayılan sıkıştırma düzeyinde 4 MB'lik bir sözlüğe sahip olduğu LZMA'yı kullanır. 5) Zip formatı katı sıkıştırma kullanmaz, bu nedenle benzer veya aynı dosyaları daha iyi sıkıştırmaz.
Belki PAQ veya PPMD ailesinden kompresörler daha iyi sıkıştırır, ancak çok sayıda benzer görüntü dosyasını sıkıştırmanız gerekiyorsa, 3 yaklaşımı düşünebilirsiniz:
1) Görüntüleri sıkıştırılmamış olarak saklayın (PNG -0 ile veya sıkıştırma olmadan bir formatta) ve büyük sözlük veya blok boyutlu bir kompresörle sıkıştırın. (LZMA iyi çalışır)
2) Başka bir seçenek de filtreleri tutmak, ancak PNG'lerden Deflate sıkıştırmasını kaldırmak olabilir. Bu, örneğin ( AdvDef ) yardımcı programıyla yapılabilir. Sonra ortaya çıkan sıkıştırılmamış PNG'leri sıkıştırırsınız. Dekompresyondan sonra sıkıştırılmamış PNG'yi koruyabilir veya AdvDef ile tekrar sıkıştırabilirsiniz (ancak bu zaman alacaktır).
Hangisinin en çok sıkıştırdığını görmek için her iki yaklaşımı da test etmeniz gerekir.
3) Son seçenek, bir videodaki png görüntülerini dönüştürmek, kayıpsız x264 gibi kayıpsız bir video kompresörü ile sıkıştırmak (doğru renk formatını kullanarak özel dikkat göstererek) ve daha sonra çıkarma üzerine çerçeveleri bireysel png görüntülerine çıkarmak olacaktır. Bu ffmpeg ile yapılabilir. Ayrıca, kare numarası ile orijinal ad arasındaki eşlemeyi de tutmanız gerekir.
Bu en karmaşık yaklaşım olacaktır, ancak png'lerin tümü bir animasyonun parçasıysa en etkili yöntem olabilir. Ancak, gerekirse saydamlığı destekleyen bir video biçimine ihtiyacınız olacaktır.
Düzenleme: Ayrıca sık kullanılmaz MNG biçimi vardır.