12 poin oleh xguru 2021-11-25 | 3 komentar | Bagikan ke WhatsApp
<p>&quot;Quite OK Image&quot; <br /> - Menjalankan kompresi RGB/RGBA dengan ukuran yang mirip PNG<br /> → kompresi 20x-50x lebih cepat, dan dekompresi 3~4x lebih cepat <br /> → kode open source C single-header sepanjang 300 baris <br /> → implementasi single-thread sederhana tanpa menggunakan SIMD <br /> - Detail teknis <br /> → encode/decode gambar dalam satu pass <br /> → menyentuh semua piksel hanya sekali, dan setiap piksel dienkode dengan salah satu dari 4 cara <br /> ⇨ jika sama dengan piksel tepat sebelumnya, tingkatkan run-length piksel sebelumnya; jika berbeda, kemas piksel baru dengan salah satu dari 3 cara berikut <br /> ⇨ jika sama dengan piksel yang pernah diproses sebelumnya, gunakan indeks piksel tersebut. Untuk ini, disimpan array untuk 64 piksel terbaru<br /> ⇨ jika perbedaannya dengan piksel sebelumnya tidak terlalu besar, simpan nilai selisih RGBA tersebut <br /> ⇨ jika 3 cara di atas gagal, simpan nilai RGBA piksel. Namun hanya bagian yang berbeda dari piksel sebelumnya yang disimpan </p>

3 komentar

 
lifthrasiir 2021-11-25
<p>Kalau agak dibesar-besarkan, QOI pada dasarnya adalah PNG tanpa zlib, hanya menyisakan filtering lalu memperbaikinya.<br /> <br /> Algoritma kompresi zlib/gzip/DEFLATE yang juga digunakan PNG memang dipakai luas, tetapi selain sudah sangat tua sehingga efisiensinya menurun, algoritma keluarga LZ77 seperti zlib juga berangkat dari asumsi dasar bahwa “di antara byte-byte terbaru, ada beberapa kemunculan berurutan dari rangkaian byte yang sama” (misalnya, jika inputnya “to be or not to be”, memanfaatkan fakta bahwa bagian “to be” muncul dua kali). Namun gambar adalah jenis data yang asumsi seperti ini tidak terlalu cocok, sehingga PNG pada praktiknya memakai zlib hanya untuk entropy coding (pendekatan kompresi berdasarkan probabilitas byte berikutnya tanpa konteks tambahan lain), lalu menggunakan filtering sederhana sebagai tahap prapemrosesan agar data yang masuk ke zlib sebisa mungkin sesuai dengan asumsi tersebut, tetapi sebenarnya ini tidak bisa dibilang terlalu efisien.<br /> <br /> Dalam format gambar lossless modern, perbaikan ini umumnya dilakukan lewat dua pendekatan besar: ada pendekatan yang memperbaiki prediksi piksel yang setara dengan filtering pada PNG (misalnya dengan sangat menambah jenis filtering, atau menerapkan filtering yang berbeda pada bagian gambar yang berbeda), dan ada pendekatan yang memperbaiki entropy coding yang setara dengan zlib pada PNG. Pendekatan QOI juga mirip, tetapi demi kesederhanaan ia memiliki ciri tidak sama sekali menggunakan piksel di atas posisi saat ini untuk prediksi piksel, serta meninggalkan entropy coding dan sebagai gantinya menyediakan beberapa skema pengodean selisih (delta) berbasis heuristik. Khususnya karena ciri pertama ini, terlepas dari performa kompresi/dekompresinya, rasio kompresinya cenderung lebih rendah daripada PNG, meski tampaknya hal ini bisa diperbaiki dengan sedikit mengorbankan kesederhanaan.</p>
 
xguru 2021-11-25
<p>Oh, terima kasih atas penjelasan tambahannya. Menarik juga.</p>
 
xguru 2021-11-25
<p>Mungkin sulit digunakan untuk menggantikan format lain, tetapi karena kodenya sederhana dan implementasinya juga dijelaskan dengan baik, sepertinya ini kode yang menarik untuk dibaca.<br /> https://github.com/phoboslab/qoi/blob/master/qoi.h<br /> </p>