Cara kerja format JPEG

Gambar JPEG ada di mana-mana dalam kehidupan digital kita, namun di balik lapisan kesadaran ini terdapat algoritma yang menghilangkan detail yang tidak terlihat oleh mata manusia. Hasilnya adalah kualitas visual tertinggi dalam ukuran file terkecil - tapi bagaimana sebenarnya cara kerjanya? Mari kita lihat apa sebenarnya yang tidak dilihat mata kita!

Cara kerja format JPEG

Sangat mudah untuk menganggap remeh kemampuan mengirim foto ke teman dan tidak khawatir tentang perangkat, browser, atau sistem operasi yang mereka gunakan - namun hal itu tidak selalu terjadi. Pada awal tahun 1980-an, komputer dapat menyimpan dan menampilkan gambar digital, namun terdapat banyak gagasan yang bersaing tentang cara terbaik untuk melakukan hal ini. Anda tidak bisa begitu saja mengirim gambar dari satu komputer ke komputer lain dan berharap gambar itu berhasil.

Untuk mengatasi masalah ini, sebuah komite ahli dari seluruh dunia dibentuk pada tahun 1986 yang disebut "Kelompok Gabungan Pakar FotografiΒ» (Joint Photographic Experts Group, JPEG), didirikan sebagai upaya bersama antara Organisasi Internasional untuk Standardisasi (ISO) dan Komisi Elektroteknik Internasional (IEC), dua organisasi standar internasional yang berkantor pusat di Jenewa, Swiss.

Sekelompok orang bernama JPEG menciptakan standar kompresi gambar digital JPEG pada tahun 1992. Siapa pun yang pernah menggunakan Internet mungkin pernah menemukan gambar berkode JPEG. Ini adalah cara paling umum untuk menyandikan, mengirim, dan menyimpan gambar. Dari halaman web, email, hingga media sosial, JPEG digunakan miliaran kali sehariβ€”hampir setiap kali kita melihat gambar secara online atau mengirimkannya. Tanpa JPEG, web akan menjadi kurang berwarna, lebih lambat, dan mungkin memiliki lebih sedikit gambar kucing!

Artikel ini tentang cara memecahkan kode gambar JPEG. Dengan kata lain, apa yang diperlukan untuk mengubah data terkompresi yang disimpan di komputer menjadi gambar yang muncul di layar. Hal ini patut diketahui, bukan hanya karena penting untuk memahami teknologi yang kita gunakan sehari-hari, namun juga karena dengan membuka tingkat kompresi, kita belajar lebih banyak tentang persepsi dan penglihatan, serta detail apa saja yang paling sensitif bagi mata kita.

Selain itu, bermain-main dengan gambar dengan cara ini sangatlah menarik.

Cara kerja format JPEG

Melihat ke dalam JPEG

Di komputer, semuanya disimpan sebagai rangkaian bilangan biner. Biasanya bit-bit ini, nol dan satu, dikelompokkan dalam kelompok delapan untuk membentuk byte. Saat Anda membuka gambar JPEG di komputer, sesuatu (browser, sistem operasi, atau lainnya) harus memecahkan kode byte, mengembalikan gambar asli sebagai daftar warna yang dapat ditampilkan.

Jika Anda mengunduh yang manis ini foto seekor kucing dan membukanya di editor teks, Anda akan melihat banyak karakter yang tidak koheren.

Cara kerja format JPEG
Di sini saya menggunakan Notepad++ untuk memeriksa isi file, karena editor teks biasa seperti Notepad di Windows akan merusak file biner setelah disimpan dan tidak lagi memenuhi format JPEG.

Membuka gambar di pengolah kata akan membingungkan komputer, sama seperti Anda membingungkan otak saat Anda menggosok mata dan mulai melihat bintik-bintik warna!

Bintik-bintik yang Anda lihat ini dikenal sebagai fosfena, dan bukan merupakan hasil rangsangan ringan atau halusinasi yang ditimbulkan oleh pikiran. Hal ini terjadi karena otak Anda mengira bahwa sinyal listrik apa pun di saraf optik menyampaikan informasi tentang cahaya. Otak perlu membuat asumsi-asumsi ini karena tidak ada cara untuk mengetahui apakah suatu sinyal adalah suara, penglihatan, atau sesuatu yang lain. Semua saraf di tubuh mengirimkan impuls listrik yang persis sama. Dengan memberikan tekanan pada mata Anda, Anda mengirimkan sinyal yang tidak bersifat visual, namun mengaktifkan reseptor mata, yang diinterpretasikan oleh otak Anda - dalam hal ini, secara tidak benar - sebagai sesuatu yang visual. Anda benar-benar dapat melihat tekanannya!

Lucu rasanya memikirkan betapa miripnya komputer dengan otak, tetapi ini juga merupakan analogi yang berguna untuk menggambarkan seberapa besar makna data - baik yang dibawa ke seluruh tubuh oleh saraf atau disimpan di komputer - bergantung pada interpretasinya. Semua data biner terdiri dari XNUMX dan XNUMX, komponen dasar yang dapat menyampaikan informasi apa pun. Komputer Anda sering kali mengetahui cara menafsirkannya dengan menggunakan petunjuk seperti ekstensi file. Sekarang kami memaksanya untuk menafsirkannya sebagai teks, karena itulah yang diharapkan oleh editor teks.

Untuk memahami cara memecahkan kode JPEG, kita perlu melihat sinyal aslinya sendiri - data biner. Ini dapat dilakukan dengan menggunakan editor heksadesimal, atau langsung halaman web artikel asli! Ada gambar, di sebelahnya di bidang teks terdapat semua byte-nya (kecuali header), disajikan dalam bentuk desimal. Anda dapat mengubahnya, dan skrip akan menyandikan ulang dan menghasilkan gambar baru dengan cepat.

Cara kerja format JPEG

Anda dapat belajar banyak hanya dengan bermain-main dengan editor ini. Misalnya, dapatkah Anda mengetahui urutan penyimpanan piksel?

Yang aneh dari contoh ini adalah mengubah beberapa angka tidak mempengaruhi gambar sama sekali, tetapi, misalnya, jika Anda mengganti angka 17 dengan 0 di baris pertama, foto akan rusak total!

Cara kerja format JPEG

Perubahan lainnya, seperti mengganti angka 7 pada baris 1988 dengan angka 254, mengubah warna, tetapi hanya piksel berikutnya.

Cara kerja format JPEG

Mungkin yang paling aneh adalah beberapa angka tidak hanya mengubah warna, tetapi juga bentuk gambarnya. Ubah 70 pada baris 12 menjadi 2 dan lihat baris atas gambar untuk mengetahui maksud saya.

Cara kerja format JPEG

Dan apa pun gambar JPEG yang Anda gunakan, Anda akan selalu menemukan pola catur misterius ini saat mengedit byte.

Saat bermain-main dengan editor, sulit untuk memahami bagaimana foto dibuat ulang dari byte ini, karena kompresi JPEG terdiri dari tiga teknologi berbeda, yang diterapkan secara berurutan berdasarkan level. Kami akan mempelajari masing-masing secara terpisah untuk mengungkap perilaku misterius yang kami lihat.

Tiga tingkat kompresi JPEG:

  1. Subsampling warna.
  2. Transformasi dan pengambilan sampel kosinus diskrit.
  3. Jalankan pengkodean panjang, delta ΠΈ Huffman

Untuk memberi gambaran besarnya kompresi, perhatikan bahwa gambar di atas mewakili 79 angka atau sekitar 819 KB. Jika kita menyimpannya tanpa kompresi, setiap piksel memerlukan tiga angka - untuk komponen merah, hijau, dan biru. Ini akan berjumlah 79 angka, atau sekitar. 917 KB. Sebagai hasil kompresi JPEG, file akhir berkurang lebih dari 700 kali lipat!

Faktanya, gambar ini dapat dikompres lebih banyak lagi. Di bawah ini adalah dua gambar berdampingan - foto di sebelah kanan telah dikompresi menjadi 16 KB, yaitu 57 kali lebih kecil dari versi yang tidak dikompresi!

Cara kerja format JPEG

Jika Anda perhatikan lebih dekat, Anda akan melihat bahwa gambar-gambar ini tidak identik. Keduanya adalah gambar dengan kompresi JPEG, tetapi gambar kanan lebih kecil volumenya. Ini juga terlihat sedikit lebih buruk (lihat kotak warna latar belakang). Itu sebabnya JPEG juga disebut kompresi lossy; Selama proses kompresi, gambar berubah dan kehilangan beberapa detail.

1. Subsampling warna

Berikut adalah gambar yang hanya menerapkan kompresi tingkat pertama.

Cara kerja format JPEG
(Versi interaktif - masuk asli artikel). Menghapus satu nomor akan menghancurkan semua warna. Namun, jika tepat enam angka dihilangkan, hal ini hampir tidak berpengaruh pada gambar.

Sekarang angka-angkanya sedikit lebih mudah untuk diuraikan. Ini hampir merupakan daftar warna sederhana, di mana setiap byte mengubah tepat satu piksel, tetapi pada saat yang sama ukurannya sudah setengah dari ukuran gambar yang tidak dikompresi (yang akan memakan sekitar 300 KB dalam ukuran yang diperkecil ini). Bisakah Anda menebak alasannya?

Anda dapat melihat bahwa angka-angka ini tidak mewakili komponen standar merah, hijau, dan biru, karena jika kita mengganti semua angka dengan nol, kita akan mendapatkan gambar berwarna hijau (bukan putih).

Cara kerja format JPEG

Ini karena byte ini mewakili Y (kecerahan),

Cara kerja format JPEG

Cb (relatif kebiruan),

Cara kerja format JPEG

dan gambar Cr (relatif kemerahan).

Cara kerja format JPEG

Mengapa tidak menggunakan RGB? Bagaimanapun, ini adalah cara kerja sebagian besar layar modern. Monitor Anda dapat menampilkan warna apa pun, termasuk merah, hijau, dan biru, dengan intensitas berbeda untuk setiap piksel. Putih diperoleh dengan menyalakan ketiganya pada kecerahan penuh, dan hitam dengan mematikannya.

Cara kerja format JPEG

Hal ini juga sangat mirip dengan cara kerja mata manusia. Reseptor warna pada mata kita disebut "kerucutβ€œ, dan dibagi menjadi tiga jenis, yang masing-masing lebih sensitif terhadap warna merah, hijau, atau biru [Kerucut tipe S sensitif terhadap warna ungu-biru (S dari bahasa Inggris Pendek - spektrum gelombang pendek), M -tipe - di bagian spektrum hijau-kuning (M dari bahasa Inggris Medium - gelombang menengah), dan tipe-L - di bagian spektrum kuning-merah (L dari bahasa Inggris Long - gelombang panjang). Kehadiran ketiga jenis kerucut ini (dan batang, yang sensitif pada bagian spektrum hijau zamrud) memberikan penglihatan warna pada seseorang. / kira-kira. terjemahan.]. Tongkat, jenis fotoreseptor lain di mata kita, mampu mendeteksi perubahan kecerahan, namun jauh lebih sensitif terhadap warna. Mata kita mempunyai sekitar 120 juta batang dan hanya 6 juta kerucut.

Inilah sebabnya mengapa mata kita jauh lebih baik dalam mendeteksi perubahan kecerahan dibandingkan perubahan warna. Jika Anda memisahkan warna dari kecerahan, Anda dapat menghilangkan sedikit warna dan tidak ada yang akan memperhatikan apa pun. Subsampling Chroma adalah proses merepresentasikan komponen warna suatu gambar pada resolusi lebih rendah daripada komponen luminansi. Pada contoh di atas, setiap piksel memiliki tepat satu komponen Y, dan setiap kelompok yang terdiri dari empat piksel memiliki tepat satu komponen Cb dan satu komponen Cr. Oleh karena itu, gambar tersebut mengandung informasi warna empat kali lebih sedikit dibandingkan aslinya.

Ruang warna YCbCr tidak hanya digunakan dalam JPEG. Ini awalnya ditemukan pada tahun 1938 untuk program televisi. Tidak semua orang memiliki TV berwarna, jadi memisahkan warna dan kecerahan memungkinkan semua orang mendapatkan sinyal yang sama, dan TV tanpa warna hanya menggunakan komponen kecerahan saja.

Jadi menghapus satu nomor dari editor akan merusak semua warna. Komponen disimpan dalam bentuk YYYY Cb Cr (sebenarnya tidak harus dalam urutan itu - urutan penyimpanan ditentukan di header file). Menghapus angka pertama akan menyebabkan nilai pertama Cb dianggap sebagai Y, Cr sebagai Cb, dan secara umum Anda akan mendapatkan efek domino yang mengubah semua warna gambar.

Spesifikasi JPEG tidak memaksa Anda untuk menggunakan YCbCr. Namun sebagian besar file menggunakannya karena menghasilkan gambar downsampling yang lebih baik daripada RGB. Tapi kamu tidak perlu mempercayai kata-kataku. Lihat sendiri pada tabel di bawah seperti apa tampilan subsampling masing-masing komponen di RGB dan YCbCr.

Cara kerja format JPEG
(Versi interaktif - masuk asli artikel).

Hilangnya warna biru tidak begitu terlihat seperti warna merah atau hijau. Itu karena dari enam juta sel kerucut di mata Anda, sekitar 64% sensitif terhadap warna merah, 32% terhadap hijau, dan 2% terhadap biru.

Downsampling komponen Y (kiri bawah) paling baik dilihat. Bahkan perubahan kecil pun terlihat.

Mengonversi gambar dari RGB ke YCbCr tidak mengurangi ukuran file, namun mempermudah menemukan detail yang kurang terlihat yang dapat dihapus. Kompresi lossy terjadi pada tahap kedua. Hal ini didasarkan pada ide untuk menyajikan data dalam bentuk yang lebih dapat dikompresi.

2. Transformasi dan pengambilan sampel kosinus diskrit

Tingkat kompresi ini, sebagian besar, adalah inti dari JPEG. Setelah mengubah warna menjadi YCbCr, komponen dikompresi satu per satu, sehingga kita dapat berkonsentrasi hanya pada komponen Y. Dan inilah tampilan byte komponen Y setelah menerapkan lapisan ini.

Cara kerja format JPEG
(Versi interaktif - masuk asli artikel). Dalam versi interaktif, mengklik sebuah piksel akan menggulirkan editor ke baris yang mewakilinya. Coba hapus angka dari akhir atau tambahkan beberapa angka nol ke angka tertentu.

Sekilas, sepertinya kompresinya sangat buruk. Ada 100 piksel dalam sebuah gambar, dan dibutuhkan 000 angka untuk mewakili kecerahannya (komponen Y)β€”itu lebih buruk daripada tidak mengompresi apa pun!

Namun, perhatikan bahwa sebagian besar angka-angka ini adalah nol. Selain itu, semua angka nol di akhir baris dapat dihilangkan tanpa mengubah gambar. Ada sekitar 26 nomor yang tersisa, dan ini hampir 000 kali lebih sedikit!

Level ini berisi rahasia pola catur. Berbeda dengan efek lain yang telah kita lihat, kemunculan pola ini bukanlah suatu kesalahan. Mereka adalah elemen penyusun keseluruhan gambar. Setiap baris editor berisi tepat 64 angka, koefisien transformasi kosinus diskrit (DCT) yang sesuai dengan intensitas 64 pola unik.

Pola-pola ini terbentuk berdasarkan cosine plot. Inilah beberapa di antaranya:

Cara kerja format JPEG
8 dari 64 peluang

Di bawah ini adalah gambar yang menunjukkan 64 pola.

Cara kerja format JPEG
(Versi interaktif - masuk asli artikel).

Pola-pola ini sangat penting karena membentuk dasar gambar 8x8. Jika Anda belum terbiasa dengan aljabar linier, ini berarti gambar berukuran 8x8 apa pun dapat dibuat dari 64 pola ini. DCT adalah proses membagi gambar menjadi blok berukuran 8x8 dan mengubah setiap blok menjadi kombinasi 64 koefisien tersebut.

Tampaknya ajaib bahwa gambar apa pun dapat terdiri dari 64 pola tertentu. Namun, ini sama dengan mengatakan bahwa tempat mana pun di Bumi dapat digambarkan dengan dua angka - garis lintang dan garis bujur [menunjukkan belahan bumi / kira-kira. terjemahan.]. Kita sering menganggap permukaan bumi dua dimensi, sehingga kita hanya membutuhkan dua angka. Gambar 8x8 mempunyai 64 dimensi, jadi kita membutuhkan 64 angka.

Belum jelas bagaimana hal ini membantu kami dalam hal kompresi. Jika kita memerlukan 64 angka untuk mewakili gambar 8x8, mengapa ini lebih baik daripada hanya menyimpan 64 komponen kecerahan? Kami melakukan ini dengan alasan yang sama saat kami mengubah tiga angka RGB menjadi tiga angka YCbCr: ini memungkinkan kami menghapus detail halus.

Sulit untuk melihat secara pasti detail apa yang dihilangkan pada tahap ini karena JPEG menerapkan DCT pada blok 8x8. Namun, tidak ada yang melarang kita menerapkannya pada gambaran keseluruhan. Berikut tampilan DCT untuk komponen Y yang diterapkan pada keseluruhan gambar:

Cara kerja format JPEG

Lebih dari 60 nomor dapat dihapus dari akhir tanpa perubahan nyata pada foto.

Cara kerja format JPEG

Namun, perhatikan bahwa jika kita menghilangkan lima angka pertama, perbedaannya akan terlihat jelas.

Cara kerja format JPEG

Angka-angka di awal mewakili perubahan frekuensi rendah pada gambar, yang paling baik ditangkap oleh mata kita. Angka di bagian akhir menunjukkan perubahan frekuensi tinggi yang lebih sulit diperhatikan. Untuk β€œmelihat apa yang tidak dapat dilihat oleh mata”, kita dapat mengisolasi detail frekuensi tinggi ini dengan menghilangkan 5000 angka pertama.

Cara kerja format JPEG

Kami melihat semua area gambar di mana perubahan terbesar terjadi dari piksel ke piksel. Mata kucing, kumisnya, selimut terry, dan bayangan di pojok kiri bawah menonjol. Anda dapat melangkah lebih jauh dengan memusatkan perhatian pada 10 angka pertama:

Cara kerja format JPEG

20 000:

Cara kerja format JPEG

40 000:

Cara kerja format JPEG

60 000:

Cara kerja format JPEG

Detail frekuensi tinggi ini dihapus oleh JPEG selama tahap kompresi. Tidak ada kerugian dalam mengubah warna menjadi koefisien DCT. Kerugian terjadi pada langkah pengambilan sampel, di mana nilai frekuensi tinggi atau mendekati nol dihilangkan. Saat Anda menurunkan kualitas penyimpanan JPEG, program meningkatkan ambang batas jumlah nilai yang dihapus, yang mengurangi ukuran file, tetapi membuat gambar lebih berpiksel. Itu sebabnya gambar di bagian pertama, yang 57 kali lebih kecil, tampak seperti ini. Setiap blok 8x8 diwakili oleh koefisien DCT yang jauh lebih sedikit dibandingkan dengan versi kualitas yang lebih tinggi.

Anda dapat membuat efek keren seperti streaming gambar secara bertahap. Anda dapat menampilkan gambar buram yang menjadi semakin detail seiring semakin banyaknya koefisien yang diunduh.

Di sini, hanya untuk bersenang-senang, adalah apa yang Anda dapatkan hanya dengan menggunakan 24 nomor:

Cara kerja format JPEG

Atau hanya 5000:

Cara kerja format JPEG

Sangat buram, tapi entah bagaimana bisa dikenali!

3. Jalankan pengkodean panjang, delta dan Huffman

Sejauh ini, semua tahapan kompresi bersifat lossy. Sebaliknya, tahap terakhir berlangsung tanpa kerugian. Itu tidak menghapus informasi, tetapi secara signifikan mengurangi ukuran file.

Bagaimana Anda bisa mengompresi sesuatu tanpa membuang informasi? Bayangkan bagaimana kita mendeskripsikan persegi panjang hitam sederhana berukuran 700 x 437.

JPEG menggunakan 5000 angka untuk ini, namun hasil yang jauh lebih baik dapat dicapai. Dapatkah Anda membayangkan skema pengkodean yang dapat mendeskripsikan gambar seperti itu dalam byte sesedikit mungkin?

Skema minimal yang dapat saya buat menggunakan empat: tiga untuk mewakili suatu warna, dan yang keempat untuk menunjukkan berapa banyak piksel yang dimiliki warna tersebut. Gagasan untuk merepresentasikan nilai berulang dengan cara yang ringkas ini disebut pengkodean run-length. Tidak ada kerugian karena kita dapat mengembalikan data yang dikodekan ke bentuk aslinya.

File JPEG dengan persegi panjang hitam jauh lebih besar dari 4 byte - ingatlah bahwa pada tingkat DCT, kompresi diterapkan pada blok piksel 8x8. Oleh karena itu, minimal kita memerlukan satu koefisien DCT untuk setiap 64 piksel. Kita membutuhkannya karena alih-alih menyimpan satu koefisien DCT yang diikuti oleh 63 angka nol, pengkodean run length memungkinkan kita menyimpan satu angka dan menunjukkan bahwa β€œsemua angka lainnya adalah nol.”

Pengkodean Delta adalah teknik di mana setiap byte berisi perbedaan dari beberapa nilai, bukan nilai absolut. Oleh karena itu, mengedit byte tertentu akan mengubah warna semua piksel lainnya. Misalnya, daripada menyimpannya

12 13 14 14 14 13 13 14

Kita bisa mulai dengan 12 dan kemudian menunjukkan berapa banyak yang perlu kita tambahkan atau kurangi untuk mendapatkan angka berikutnya. Dan urutan dalam pengkodean delta ini berbentuk:

12 1 1 0 0 -1 0 1

Data yang dikonversi tidak lebih kecil dari data asli, namun lebih mudah untuk dikompres. Menerapkan pengkodean delta sebelum pengkodean panjang proses dapat banyak membantu sambil tetap melakukan kompresi lossless.

Pengkodean Delta adalah salah satu dari sedikit teknik yang digunakan di luar blok 8x8. Dari 64 koefisien DCT, salah satunya hanyalah fungsi gelombang konstan (warna solid). Ini mewakili kecerahan rata-rata setiap blok untuk komponen luma, atau rata-rata kebiruan untuk komponen Cb, dan seterusnya. Nilai pertama dari setiap blok DCT disebut nilai DC, dan setiap nilai DC dikodekan delta terhadap nilai sebelumnya. Oleh karena itu, mengubah kecerahan blok pertama akan mempengaruhi semua blok.

Misteri terakhir yang masih tersisa: bagaimana mengubah bentuk tunggal dapat merusak keseluruhan gambaran? Sejauh ini, tingkat kompresi belum memiliki sifat seperti itu. Jawabannya terletak pada header JPEG. 500 byte pertama berisi metadata tentang gambar - lebar, tinggi, dll., dan kami belum mengerjakannya.

Tanpa header hampir tidak mungkin (atau sangat sulit) untuk memecahkan kode JPEG. Sepertinya saya sedang mencoba mendeskripsikan gambar tersebut kepada Anda, dan saya mulai menciptakan kata-kata untuk menyampaikan kesan saya. Deskripsinya mungkin akan cukup ringkas, karena saya dapat menemukan kata-kata dengan makna yang tepat yang ingin saya sampaikan, tetapi bagi orang lain kata-kata itu tidak masuk akal.

Kedengarannya bodoh, tapi itulah yang terjadi. Setiap gambar JPEG dikompresi dengan kode khusus untuk itu. Kamus kode disimpan di header. Teknik ini disebut kode Huffman dan kosakatanya disebut tabel Huffman. Di header, tabel ditandai dengan dua byte - 255 dan kemudian 196. Setiap komponen warna dapat memiliki tabelnya sendiri.

Perubahan pada tabel akan berdampak besar pada gambar apa pun. Contoh yang bagus adalah mengubah baris ke-15 menjadi 1.

Cara kerja format JPEG

Hal ini terjadi karena tabel menentukan bagaimana masing-masing bit harus dibaca. Sejauh ini kita hanya bekerja dengan bilangan biner dalam bentuk desimal. Tapi ini menyembunyikan dari kita fakta bahwa jika Anda ingin menyimpan angka 1 dalam satu byte, maka akan terlihat seperti 00000001, karena setiap byte harus memiliki tepat delapan bit, meskipun hanya satu yang diperlukan.

Ini berpotensi membuang-buang ruang jika Anda memiliki banyak nomor kecil. Kode Huffman adalah teknik yang memungkinkan kita melonggarkan persyaratan bahwa setiap angka harus menempati delapan bit. Artinya jika Anda melihat dua byte:

234 115

Kemudian, bergantung pada tabel Huffman, ini bisa berupa tiga angka. Untuk mengekstraknya, Anda harus memecahnya menjadi beberapa bagian terlebih dahulu:

11101010 01110011

Kemudian kita melihat tabel untuk mengetahui cara mengelompokkannya. Misalnya, ini bisa berupa enam bit pertama, (111010), atau 58 dalam desimal, diikuti oleh lima bit (10011), atau 19, dan terakhir empat bit terakhir (0011), atau 3.

Oleh karena itu, sangat sulit untuk memahami byte pada tahap kompresi ini. Byte tidak mewakili apa yang terlihat. Saya tidak akan membahas detail cara bekerja dengan tabel di artikel ini, tapi bahan tentang masalah ini secara online cukup.

Salah satu trik menarik yang dapat Anda lakukan dengan pengetahuan ini adalah dengan memisahkan header dari JPEG dan menyimpannya secara terpisah. Faktanya, ternyata hanya Anda yang bisa membaca file tersebut. Facebook melakukan ini untuk membuat file menjadi lebih kecil.

Apa lagi yang bisa dilakukan adalah sedikit mengubah tabel Huffman. Bagi yang lain, ini akan terlihat seperti gambar rusak. Dan hanya Anda yang tahu cara ajaib untuk memperbaikinya.

Mari kita rangkum: jadi apa yang diperlukan untuk memecahkan kode JPEG? Diperlukan:

  1. Ekstrak tabel Huffman dari header dan dekode bitnya.
  2. Ekstrak koefisien transformasi kosinus diskrit untuk setiap komponen warna dan pencahayaan untuk setiap blok 8x8, dengan melakukan transformasi pengkodean delta dan run-length terbalik.
  3. Gabungkan cosinus berdasarkan koefisien untuk mendapatkan nilai piksel untuk setiap blok 8x8.
  4. Skalakan komponen warna jika subsampling dilakukan (informasi ini ada di header).
  5. Ubah nilai YCbCr yang dihasilkan untuk setiap piksel menjadi RGB.
  6. Tampilkan gambar di layar!

Kerja serius hanya untuk melihat foto dengan kucing! Namun, yang saya sukai adalah ia menunjukkan betapa teknologi JPEG berpusat pada manusia. Hal ini didasarkan pada kekhasan persepsi kami, yang memungkinkan kami mencapai kompresi yang jauh lebih baik daripada teknologi konvensional. Dan sekarang setelah kita memahami cara kerja JPEG, kita dapat membayangkan bagaimana teknologi ini dapat ditransfer ke area lain. Misalnya, pengkodean delta dalam video dapat memberikan pengurangan ukuran file yang signifikan, karena seringkali ada seluruh area yang tidak berubah dari satu bingkai ke bingkai lainnya (misalnya, latar belakang).

Kode yang digunakan dalam artikel, terbuka, dan berisi petunjuk tentang cara mengganti gambar dengan gambar Anda sendiri.

Sumber: www.habr.com

Tambah komentar