PNG adalah kombinasi dari Filter + LZ77 + Huffman (kombinasi dari LZ77 + Huffman disebut Deflate) dengan urutan:
langkah 1) jika filter berbeda dari Tidak Ada, nilai piksel digantikan oleh perbedaan dari piksel yang berdekatan (untuk lebih jelasnya lihat http://www.libpng.org/pub/png/book/chapter09.html ) . Yang meningkatkan kompresi gambar dengan gradien (jadi ... 4 5 6 7 menjadi ... 1 1 1 1) dan itu dapat membantu di area dengan warna yang sama (... 3 3 3 5 5 5 5 5 menjadi 0 0 0 2 0 0 0 0 0). Secara default filter diaktifkan dalam gambar 24-bit dan dinonaktifkan dalam gambar 8-bit dengan palet.
langkah 2) data dikompres dengan LZ77 yang menggantikan string byte (match) yang diulang dengan tuple yang berisi jarak ke pertandingan dan panjang pertandingan.
langkah 3) hasil langkah 2 dikodekan dengan kode Huffman yang menggantikan simbol panjang tetap dengan kode panjang variabel, semakin sering simbol semakin pendek kode.
Ada beberapa masalah:
Perubahan kecil yang memengaruhi beberapa piksel akan menghasilkan perubahan hasil dari 3 langkah kompresi png:
1) Nilai yang disaring dari piksel yang berdekatan akan berubah (tergantung pada filter yang digunakan). Itu akan memperkuat efek dari perubahan kecil.
2) Perubahan akan berarti bahwa kecocokan dengan area itu akan berbeda. Misalnya mengubah 333333 menjadi 333533 menyebabkan kemunculan 333333 yang lain tidak lagi cocok sehingga akan memilih kecocokan lain menjadi 333333 dengan jarak yang berbeda atau akan memilih kecocokan yang sama tetapi dengan panjang yang lebih pendek dan kemudian kecocokan lainnya untuk 3 byte terakhir. Dengan sendirinya itu akan banyak mengubah hasil.
3) Masalah terbesar adalah pada langkah 3. Kode huffman menggunakan sejumlah variabel bit sehingga bahkan perubahan kecil akan menghasilkan bahwa segala sesuatu yang mengikuti tidak lagi selaras. AFAIK Kebanyakan algoritma kompresi tidak dapat mendeteksi kecocokan yang tidak selaras byte sehingga akan mencegah (atau setidaknya mengurangi banyak) kompresi pada data yang sudah dikompresi yang mengikuti perubahan kecuali kompresor dapat mendeteksi kecocokan yang tidak selaras byte.
Masalah lain sudah dicakup oleh balasan lain:
4) Gzip menggunakan algoritma Deflate yang sama dengan kamus 32KB, jadi jika file png lebih besar dari 32KB, kecocokan tidak akan terdeteksi meskipun mereka identik. Bzip2 lebih baik dalam aspek itu karena menggunakan blok 900 KB. XZ menggunakan LZMA, yang IIRC memiliki kamus 4 MB di tingkat kompresi standar. 5) Format zip tidak menggunakan kompresi padat sehingga tidak akan mengkompres file yang sama atau identik lebih baik.
Mungkin kompresor dari keluarga PAQ atau PPMD akan memampatkan lebih baik tetapi jika Anda perlu mengompres banyak file gambar yang serupa maka Anda dapat mempertimbangkan 3 pendekatan:
1) Simpan gambar tanpa kompresi (dengan PNG -0 atau dalam format tanpa kompresi) dan kompres dengan kompresor dengan kamus besar atau ukuran blok. (LZMA akan bekerja dengan baik)
2) Pilihan lain adalah menyimpan filter tetapi menghapus kompresi Deflate dari PNG. Itu bisa dilakukan misalnya dengan utilitas ( AdvDef ). Lalu Anda kompres PNGs terkompresi yang dihasilkan. Setelah dekompresi, Anda dapat menyimpan PNG yang tidak terkompresi atau mengompresnya lagi dengan AdvDef (tetapi itu akan memakan waktu).
Anda perlu menguji kedua pendekatan untuk melihat kompres mana yang paling banyak.
3) Opsi terakhir adalah mengonversi gambar png dalam video, mengompresnya dengan kompresor video lossless seperti x264 lossless (dengan hati-hati menggunakan format warna yang tepat) dan kemudian mengekstraksi ekstrak frame ke gambar png individu. Itu bisa dilakukan dengan ffmpeg. Anda juga perlu menjaga pemetaan antara nomor bingkai dan nama asli.
Itu akan menjadi pendekatan yang paling kompleks tetapi jika pngs semua bagian dari animasi itu mungkin yang paling efektif. Namun Anda akan memerlukan format video yang mendukung transparansi jika Anda membutuhkannya.
Sunting: Ada juga format MNG yang tidak sering digunakan.