Bitmap
Bitmap (BMP) pada dasarnya adalah apa yang Anda gambarkan, sebuah array angka yang mewakili warna piksel. Misalnya sesuatu
1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1
Kompresi lossless
Sekarang, mari kita tentukan skema kompresi. Dalam skema kompresi kami, kami akan memiliki sejumlah pasangan angka. Misalnya
3, 1, 1, 0, 7, 1
Sekarang, hal pertama yang ingin saya tunjukkan adalah bahwa skema kompresi ini merepresentasikan piksel yang sama dengan array pertama. Array pertama memiliki tiga 1s diikuti oleh satu 0 dan kemudian tujuh 1s. Dan itulah yang kami wakili di sini. Format ini lebih pendek, karena mewakili beberapa piksel dengan dua angka. Format bitmap harus menggunakan satu angka untuk setiap piksel.
Jelas ini adalah tampilan gambar yang agak disederhanakan (misalnya hanya satu baris) dan skema kompresi. Namun mudah-mudahan ini memungkinkan Anda untuk melihat bagaimana skema kompresi mengubah format gambar. Ini adalah bagaimana GIF berhubungan dengan BMP. GIF menggunakan skema kompresi yang disebut Lempel-Ziv-Welch alih - alih yang sederhana ini.
Apa yang kami jelaskan di sini adalah skema kompresi lossless. Masalah dengan skema kompresi lossless adalah bahwa untuk beberapa input, bentuk yang disandikan mungkin lebih lama dari aslinya. Misalnya untuk
1, 0, 1, 0, 1
Pengkodean adalah
1, 1, 1, 0, 1, 1, 1, 0, 1, 1
Yah, itu tidak berguna. Kami membuat input dua kali lebih lama.
Kompresi lossless lain
Sekarang, mari kita pertimbangkan skema kompresi yang berbeda. Di sini, kami akan menampilkan gambar sebagai lingkaran yang dilapis. Untuk setiap lingkaran, kita akan menentukan pusat, jari-jari, dan warna.
Bitmap pertama kami akan menjadi
5, 5, 1, 3, 0, 0
Ini sama panjangnya dengan metode kompresi pertama kami.
Dan yang kedua bisa juga
2, 2, 1, 2, 1, 0, 2, 0, 1
Ini adalah tiga lingkaran yang berpusat di elemen tengah (yang dalam penghitungan komputer adalah nomor 2, saat komputer mulai menghitung pada 0). Satu lingkaran memiliki jari-jari 2 dan warna 1. Kemudian kita menambahkan lingkaran warna 0 dan jari-jari 1. Akhirnya, kita memiliki lingkaran warna 1 dan jari-jari 0. Dalam langkah-langkahnya, ini akan menjadi
1, 1, 1, 1, 1
1, 0, 0, 0, 1
1, 0, 1, 0, 1
Atau
2, 2, 1, 1, 0, 0, 3, 0, 0
Ini adalah lingkaran awal yang sama tetapi ditutupi oleh dua lingkaran titik. Dalam beberapa langkah, itu akan menjadi
1, 1, 1, 1, 1
1, 0, 1, 1, 1
1, 0, 1, 0, 1
Keduanya lebih pendek dari versi yang disandikan pertama tetapi masih lebih lama dari yang asli.
Anda mungkin bertanya-tanya mengapa saya berbicara tentang lingkaran dan bukan rentang. Alasan utamanya adalah bahwa lingkaran lebih dekat dengan apa yang digunakan gambar dua dimensi nyata.
Kompresi lossy
Kami juga memiliki konsep skema kompresi lossy. Skema kompresi lossless ini dapat diubah kembali menjadi array bitmap asli. Skema kompresi yang hilang mungkin tidak dapat dibalik.
Mari kita pertimbangkan versi lossy dari metode lingkaran kami. Dalam hal ini, kita akan menggunakan aturan sederhana. Kami tidak akan menyimpan lingkaran apa pun dengan radius kurang dari 1. Jadi, dalam dua penyandian terakhir, kami akan melakukannya
2, 2, 1, 2, 1, 0
dan
2, 2, 1
yang dikonversi menjadi piksel lagi adalah
1, 0, 0, 0, 1
dan
1, 1, 1, 1, 1
Versi pertama hanya satu elemen lebih panjang dari aslinya. Versi kedua lebih pendek. Keduanya valid, sehingga algoritme bebas untuk mengembangkan keduanya dan memilih yang lebih pendek.
Kami menggambarkan gambar dengan aturan yang lebih ketat sebagai kualitas yang lebih rendah.
Representasi gambar ini sebagai koleksi overlay bentuk lingkaran mirip dengan cara kerja Kelompok Fotografi Bersama atau format JPEG . Bentuknya elips bukan lingkaran, tetapi idenya serupa. Alih-alih metode sederhana kami, ia menggunakan transformasi cosinus diskrit untuk menyandikan gambar.
Tidak seperti GIF, JPEG sebenarnya merupakan cara berbeda untuk mewakili gambar. GIF masih piksel. Mereka hanya disimpan dengan cara yang berbeda. JPEG adalah bentuk. Untuk melihat JPEG, kami kemudian mengonversi bentuk menjadi piksel karena itulah cara kerja layar. Secara teori, kita bisa mengembangkan layar yang tidak berfungsi seperti ini. Alih-alih piksel, itu bisa menghasilkan bentuk agar lebih cocok dengan format JPEG. Tentu saja, layar itu tidak dapat menampilkan bitmap. Untuk menampilkan BMP atau GIF, kami harus mengonversi ke JPEG.
Jika Anda mengonversi GIF standar, katakan 300x300 piksel, ubah menjadi JPEG, dan turunkan kualitasnya, bentuk dasar yang digunakan harus terlihat. Banyak JPEG menghindari artefak ini dengan memulai dengan gambar beresolusi jauh lebih tinggi.
Skala JPEG dengan baik karena mereka bentuk daripada piksel. Jadi, jika Anda mulai dengan gambar 8000x8000, konversikan ke JPEG, dan tampilkan sebagai gambar 300x300, banyak detail yang hilang akan hilang juga. Jika Anda mengonversi 8000x8000 bitmap menjadi 300x300 bitmap terlebih dahulu dan kemudian ke JPEG, hasilnya akan seringkali berkualitas lebih rendah.
MPEG
Kami sudah bicara tentang gambar foto. Grup Gambar Bergerak Pakar atau format MPEG menggunakan jenis kompresi yang sama seperti JPEG, tetapi juga melakukan hal lain. Sementara cara sederhana dalam melakukan video adalah mengirim urutan gambar foto, MPEG sebenarnya mengirim bingkai, diikuti dengan sejumlah perubahan daftar bingkai, dan diakhiri dengan bingkai akhir. Karena sebagian besar frame mirip dengan frame sebelumnya, daftar perubahan seringkali lebih kecil dari gambar kedua.
Urutannya biasanya tidak terlalu panjang, misalnya lima frame. Tapi itu membantu membuat aliran lebih kecil dari yang seharusnya.
Penyederhanaan
Saya telah mengabaikan banyak hal. Gambar saya hanya memiliki dua warna (1-bit), bukan 256 dari gambar 8-bit dan jelas bukan 4.294.967.296 dari gambar 32-bit. Bahkan dengan gambar 8-bit, perhatikan bahwa Anda sering dapat memilih palet berbeda untuk gambar. Jadi dua bitmap 8-bit dengan urutan yang sama dapat mewakili gambar yang terlihat berbeda (bentuk yang sama tetapi warna berbeda).
Gambar saya adalah baris tunggal, bukan dua dimensi. Sebagian besar gambar akan memiliki ukuran baris tertentu yang disimpan, membuat array dua dimensi.
Saya belum mencoba untuk mewakili pengkodean yang sebenarnya sama sekali. Mereka jauh lebih kompleks daripada yang sederhana yang saya gunakan. Saya melakukan ini karena saya ingin dapat menggambarkan pengkodean dalam posting ini. Saya tidak yakin bahwa saya bisa menjelaskan perbaikan Lempel-Ziv apalagi perbaikan Lempel-Ziv-Welch yang lebih kompleks dalam satu jawaban. Dan saya tidak mengerti transformasi Fourier cukup baik untuk menjelaskannya.
Ini adalah versi yang sangat sederhana dari penanganan gambar yang sebenarnya. Namun, saya merasa bahwa untuk tujuan didaktik, lebih mudah dipahami daripada kenyataan yang lebih kompleks sambil tetap mengenai poin-poin penting.