Motivasi utama untuk format PNG adalah untuk menciptakan pengganti GIF yang tidak hanya gratis tetapi juga perbaikan di atasnya dalam semua hal. Akibatnya, kompresi PNG benar-benar lossless - yaitu, data gambar asli dapat direkonstruksi dengan tepat, sedikit demi sedikit - sama seperti pada GIF dan sebagian besar bentuk TIFF.
PNG menggunakan proses kompresi 2-tahap:
- Pra-kompresi: pemfilteran (prediksi)
- Kompresi: DEFLATE (lihat wikipedia )
Langkah precompression disebut filtering, yang merupakan metode mengubah data gambar secara reversibel sehingga mesin kompresi utama dapat beroperasi lebih efisien.
Sebagai contoh sederhana, pertimbangkan urutan byte meningkat secara seragam dari 1 menjadi 255:
1, 2, 3, 4, 5, .... 255
Karena tidak ada pengulangan dalam urutan, itu memampatkan sangat buruk atau tidak sama sekali. Namun modifikasi sepele dari urutan - yaitu, meninggalkan byte pertama saja tetapi mengganti setiap byte berikutnya dengan perbedaan antara itu dan pendahulunya - mengubah urutan menjadi set yang sangat kompresibel:
1, 1, 1, 1, 1, .... 1
Transformasi di atas adalah lossless, karena tidak ada byte yang dihilangkan, dan sepenuhnya reversibel. Ukuran terkompresi dari seri ini akan jauh berkurang, tetapi seri asli masih dapat disusun kembali dengan sempurna.
Gambar-data aktual jarang sesempurna itu, tetapi pemfilteran memang meningkatkan kompresi dalam gambar skala abu-abu dan warna, dan dapat membantu pada beberapa gambar palet juga. PNG mendukung lima jenis filter, dan pembuat enkode dapat memilih untuk menggunakan filter yang berbeda untuk setiap baris piksel dalam gambar:
Algoritma ini bekerja pada byte, tetapi untuk piksel besar (misalnya, 24-bit RGB atau 64-bit RGBA) hanya byte yang sesuai yang dibandingkan, artinya komponen merah dari warna-piksel ditangani secara terpisah dari komponen piksel hijau dan biru.
Untuk memilih filter terbaik untuk setiap baris, pembuat enkode harus menguji semua kemungkinan kombinasi. Ini jelas tidak mungkin, karena bahkan gambar 20-baris akan membutuhkan pengujian lebih dari 95 triliun kombinasi, di mana "pengujian" akan melibatkan penyaringan dan kompresi seluruh gambar.
Tingkat kompresi biasanya didefinisikan sebagai angka antara 0 (tidak ada) dan 9 (terbaik). Ini merujuk pada pengorbanan antara kecepatan dan ukuran, dan berkaitan dengan berapa banyak kombinasi filter baris yang akan dicoba. Tidak ada standar mengenai tingkat kompresi ini, sehingga setiap editor gambar dapat memiliki algoritma sendiri untuk berapa banyak filter untuk mencoba ketika mengoptimalkan ukuran gambar.
Level kompresi 0 berarti filter tidak digunakan sama sekali, yang cepat tetapi boros. Level yang lebih tinggi berarti semakin banyak kombinasi yang dicoba pada baris gambar dan hanya yang terbaik yang dipertahankan.
Saya akan menebak bahwa pendekatan paling sederhana untuk kompresi terbaik adalah secara bertahap menguji-kompres setiap baris dengan setiap filter, simpan hasil terkecil, dan ulangi untuk baris berikutnya. Ini sama dengan menyaring dan mengompresi seluruh gambar lima kali, yang mungkin merupakan trade-off yang wajar untuk gambar yang akan dikirim dan didekodekan berkali-kali. Nilai kompresi yang lebih rendah akan melakukan lebih sedikit, sesuai kebijakan pengembang alat.
Selain filter, level kompresi juga dapat memengaruhi level kompresi zlib yang merupakan angka antara 0 (tanpa Deflate) dan 9 (Deflate maksimum). Bagaimana level 0-9 yang ditentukan memengaruhi penggunaan filter, yang merupakan fitur optimisasi utama PNG, masih bergantung pada pengembang alat.
Kesimpulannya adalah bahwa PNG memiliki parameter kompresi yang dapat mengurangi ukuran file dengan sangat signifikan, semua tanpa kehilangan bahkan satu piksel pun.
Sumber:
Dokumentasi Wikipedia Portable Network Graphics
libpng Bab 9 - Kompresi dan Penyaringan