Bagaimana format JPEG berfungsi

Imej JPEG terdapat di mana-mana dalam kehidupan digital kita, tetapi di sebalik venir kesedaran ini adalah algoritma yang mengalih keluar butiran yang tidak dapat dilihat oleh mata manusia. Hasilnya ialah kualiti visual tertinggi dalam saiz fail terkecil - tetapi bagaimana sebenarnya semuanya berfungsi? Mari lihat apa sebenarnya yang tidak dilihat oleh mata kita!

Bagaimana format JPEG berfungsi

Sangat mudah untuk mengambil mudah keupayaan untuk menghantar foto kepada rakan dan tidak bimbang tentang peranti, penyemak imbas atau sistem pengendalian yang mereka gunakan - tetapi itu tidak selalu berlaku. Menjelang awal 1980-an, komputer boleh menyimpan dan memaparkan imej digital, tetapi terdapat banyak idea yang bersaing tentang cara terbaik untuk melakukan ini. Anda tidak boleh hanya menghantar imej dari satu komputer ke komputer lain dan berharap ia akan berfungsi.

Untuk menyelesaikan masalah ini, sebuah jawatankuasa pakar dari seluruh dunia telah dipasang pada tahun 1986 yang dipanggil "Kumpulan Bersama Pakar FotografiΒ» (Kumpulan Pakar Fotografi Bersama, JPEG), diasaskan sebagai usaha bersama antara Pertubuhan Standardisasi Antarabangsa (ISO) dan Suruhanjaya Elektroteknikal Antarabangsa (IEC), dua organisasi piawaian antarabangsa yang beribu pejabat di Geneva, Switzerland.

Sekumpulan orang yang dipanggil JPEG mencipta standard pemampatan imej digital JPEG pada tahun 1992. Sesiapa sahaja yang telah menggunakan Internet mungkin telah menemui imej berkod JPEG. Ini ialah cara yang paling biasa untuk mengekod, menghantar dan menyimpan imej. Daripada halaman web ke e-mel ke media sosial, JPEG digunakan berbilion kali sehariβ€”hampir setiap kali kami melihat imej dalam talian atau menghantarnya. Tanpa JPEG, web akan menjadi kurang berwarna, lebih perlahan dan mungkin mempunyai lebih sedikit gambar kucing!

Artikel ini adalah mengenai cara menyahkod imej JPEG. Dalam erti kata lain, apa yang diperlukan untuk menukar data mampat yang disimpan pada komputer kepada imej yang muncul pada skrin. Ini wajar diketahui, bukan sahaja kerana penting untuk memahami teknologi yang kami gunakan setiap hari, tetapi juga kerana dengan membuka kunci tahap mampatan, kami mengetahui lebih lanjut tentang persepsi dan penglihatan, serta butiran yang paling sensitif bagi mata kita.

Di samping itu, bermain dengan imej dengan cara ini sangat menarik.

Bagaimana format JPEG berfungsi

Melihat ke dalam JPEG

Pada komputer, semuanya disimpan sebagai urutan nombor binari. Biasanya bit ini, sifar dan satu, dikumpulkan dalam kumpulan lapan untuk membentuk bait. Apabila anda membuka imej JPEG pada komputer, sesuatu (pelayar, sistem pengendalian, sesuatu yang lain) mesti menyahkod bait, memulihkan imej asal sebagai senarai warna yang boleh dipaparkan.

Jika anda memuat turun manis ini gambar kucing dan membukanya dalam editor teks, anda akan melihat sekumpulan aksara yang tidak koheren.

Bagaimana format JPEG berfungsi
Di sini saya menggunakan Notepad++ untuk memeriksa kandungan fail, kerana editor teks biasa seperti Notepad pada Windows akan merosakkan fail binari selepas menyimpan dan ia tidak lagi memenuhi format JPEG.

Membuka imej dalam pemproses perkataan mengelirukan komputer, sama seperti anda mengelirukan otak anda apabila anda menggosok mata anda dan mula melihat bintik-bintik warna!

Tempat yang anda lihat ini dikenali sebagai fosfen, dan bukan hasil daripada rangsangan cahaya atau halusinasi yang dijana oleh minda. Ia berlaku kerana otak anda berfikir bahawa sebarang isyarat elektrik dalam saraf optik menyampaikan maklumat tentang cahaya. Otak perlu membuat andaian ini kerana tidak ada cara untuk mengetahui sama ada isyarat adalah bunyi, penglihatan, atau sesuatu yang lain. Semua saraf dalam badan menghantar impuls elektrik yang sama. Dengan menggunakan tekanan pada mata anda, anda menghantar isyarat yang bukan visual, tetapi mengaktifkan reseptor mata, yang ditafsirkan oleh otak anda - dalam kes ini, secara tidak betul - sebagai sesuatu yang visual. Anda benar-benar dapat melihat tekanan!

Sungguh melucukan untuk memikirkan tentang kesamaan komputer dengan otak, tetapi ia juga merupakan analogi yang berguna untuk menggambarkan sejauh mana makna dataβ€”sama ada dibawa melalui badan oleh saraf atau disimpan pada komputerβ€”bergantung pada cara ia ditafsirkan. Semua data binari terdiri daripada XNUMXs dan XNUMXs, komponen asas yang boleh menyampaikan maklumat dalam apa jua bentuk. Komputer anda sering memikirkan cara untuk mentafsirnya dengan menggunakan petunjuk seperti sambungan fail. Sekarang kami memaksanya untuk mentafsirkannya sebagai teks, kerana itulah yang diharapkan oleh editor teks.

Untuk memahami cara menyahkod JPEG, kita perlu melihat sendiri isyarat asal - data binari. Ini boleh dilakukan menggunakan editor heksadesimal, atau terus hidup laman web artikel asal! Terdapat imej, di sebelahnya dalam medan teks terdapat semua baitnya (kecuali pengepala), dibentangkan dalam bentuk perpuluhan. Anda boleh menukarnya, dan skrip akan mengekod semula dan menghasilkan imej baharu dengan pantas.

Bagaimana format JPEG berfungsi

Anda boleh belajar banyak hanya dengan bermain dengan editor ini. Sebagai contoh, bolehkah anda memberitahu dalam susunan mana piksel disimpan?

Perkara yang pelik tentang contoh ini ialah menukar beberapa nombor tidak menjejaskan imej sama sekali, tetapi, sebagai contoh, jika anda menggantikan nombor 17 dengan 0 di baris pertama, foto itu akan hancur sepenuhnya!

Bagaimana format JPEG berfungsi

Perubahan lain, seperti menggantikan 7 pada baris 1988 dengan nombor 254, menukar warna, tetapi hanya piksel berikutnya.

Bagaimana format JPEG berfungsi

Mungkin perkara yang paling pelik ialah beberapa nombor mengubah bukan sahaja warna, tetapi juga bentuk imej. Tukar 70 dalam baris 12 kepada 2 dan lihat pada baris atas imej untuk melihat apa yang saya maksudkan.

Bagaimana format JPEG berfungsi

Dan tidak kira apa imej JPEG yang anda gunakan, anda akan sentiasa menemui corak catur misteri ini apabila mengedit bait.

Apabila bermain dengan editor, sukar untuk memahami cara foto dicipta semula daripada bait ini, kerana pemampatan JPEG terdiri daripada tiga teknologi berbeza, digunakan secara berurutan dalam tahap. Kami akan mengkaji setiap satu secara berasingan untuk mendedahkan tingkah laku misteri yang kami lihat.

Tiga tahap pemampatan JPEG:

  1. Pensubsampelan warna.
  2. Transformasi dan persampelan kosinus diskret.
  3. Pengekodan panjang jalankan, delta ΠΈ Huffman

Untuk memberi anda gambaran tentang magnitud pemampatan, ambil perhatian bahawa imej di atas mewakili 79 nombor, atau kira-kira 819 KB. Jika kami menyimpannya tanpa pemampatan, setiap piksel memerlukan tiga nombor - untuk komponen merah, hijau dan biru. Ini akan berjumlah 79 nombor, atau lebih kurang. 917 KB. Hasil daripada pemampatan JPEG, fail akhir telah dikurangkan lebih daripada 700 kali ganda!

Malah, imej ini boleh dimampatkan lebih banyak lagi. Di bawah ialah dua imej bersebelahan - foto di sebelah kanan telah dimampatkan kepada 16 KB, iaitu 57 kali lebih kecil daripada versi tidak dimampatkan!

Bagaimana format JPEG berfungsi

Jika anda melihat dengan teliti, anda akan melihat bahawa imej ini tidak sama. Kedua-duanya adalah imej dengan pemampatan JPEG, tetapi yang betul adalah lebih kecil dalam volum. Ia juga kelihatan lebih teruk sedikit (lihat petak warna latar belakang). Itulah sebabnya JPEG juga dipanggil lossy compression; Semasa proses pemampatan, imej berubah dan kehilangan beberapa butiran.

1. Pensubsampelan warna

Berikut ialah imej dengan hanya tahap pertama pemampatan digunakan.

Bagaimana format JPEG berfungsi
(Versi interaktif - dalam asal artikel). Mengalih keluar satu nombor memusnahkan semua warna. Walau bagaimanapun, jika tepat enam nombor dialih keluar, ia hampir tidak mempunyai kesan pada imej.

Kini nombornya lebih mudah untuk dihuraikan. Ini hampir senarai warna yang mudah, di mana setiap bait berubah tepat satu piksel, tetapi pada masa yang sama ia sudah separuh saiz imej yang tidak dimampatkan (yang akan mengambil kira-kira 300 KB dalam saiz yang dikurangkan ini). Boleh teka kenapa?

Anda boleh melihat bahawa nombor ini tidak mewakili komponen merah, hijau dan biru standard, kerana jika kita menggantikan semua nombor dengan sifar, kita akan mendapat imej hijau (bukannya putih).

Bagaimana format JPEG berfungsi

Ini kerana bait ini bermaksud Y (kecerahan),

Bagaimana format JPEG berfungsi

Cb (kebiruan relatif),

Bagaimana format JPEG berfungsi

dan gambar Cr (kemerahan relatif).

Bagaimana format JPEG berfungsi

Mengapa tidak menggunakan RGB? Lagipun, beginilah cara kebanyakan skrin moden berfungsi. Monitor anda boleh memaparkan sebarang warna, termasuk merah, hijau dan biru, dengan keamatan berbeza untuk setiap piksel. Putih diperoleh dengan menghidupkan ketiga-tiganya pada kecerahan penuh, dan hitam dengan mematikannya.

Bagaimana format JPEG berfungsi

Ini juga sangat serupa dengan cara mata manusia berfungsi. Reseptor warna di mata kita dipanggil "konβ€œ, dan dibahagikan kepada tiga jenis, setiap satunya lebih sensitif kepada sama ada warna merah, hijau atau biru [Kon jenis-S sensitif dalam biru ungu (S daripada bahasa Inggeris Pendek - spektrum gelombang pendek), M -jenis - dalam warna hijau-kuning (M dari Bahasa Inggeris Sederhana - gelombang sederhana), dan jenis L - dalam bahagian kuning-merah (L dari Bahasa Inggeris Long - gelombang panjang) spektrum. Kehadiran tiga jenis kon ini (dan rod, yang sensitif di bahagian spektrum hijau zamrud) memberikan penglihatan warna kepada seseorang. / lebih kurang. terjemah]. Sticks, satu lagi jenis fotoreseptor di mata kita, mampu mengesan perubahan dalam kecerahan, tetapi jauh lebih sensitif kepada warna. Mata kita mempunyai kira-kira 120 juta batang dan hanya 6 juta kon.

Inilah sebabnya mengapa mata kita lebih baik dalam mengesan perubahan dalam kecerahan daripada perubahan dalam warna. Jika anda memisahkan warna daripada kecerahan, anda boleh mengeluarkan sedikit warna dan tiada siapa yang akan perasan apa-apa. Pensubsampelan Chroma ialah proses mewakili komponen warna imej pada resolusi yang lebih rendah daripada komponen pencahayaan. Dalam contoh di atas, setiap piksel mempunyai tepat satu komponen Y, dan setiap kumpulan individu empat piksel mempunyai tepat satu komponen Cb dan satu Cr. Oleh itu, imej mengandungi empat kali kurang maklumat warna daripada yang asal.

Ruang warna YCbCr digunakan bukan sahaja dalam JPEG. Ia pada asalnya dicipta pada tahun 1938 untuk program televisyen. Tidak semua orang mempunyai TV berwarna, jadi mengasingkan warna dan kecerahan membolehkan semua orang mendapat isyarat yang sama, dan TV tanpa warna hanya menggunakan komponen kecerahan sahaja.

Jadi mengalih keluar satu nombor daripada editor benar-benar merosakkan semua warna. Komponen disimpan dalam bentuk YYYY Cb Cr (sebenarnya, tidak semestinya dalam susunan itu - susunan storan dinyatakan dalam pengepala fail). Mengalih keluar nombor pertama akan menyebabkan nilai pertama Cb dianggap sebagai Y, Cr sebagai Cb, dan secara amnya anda akan mempunyai kesan domino yang menukar semua warna gambar.

Spesifikasi JPEG tidak memaksa anda untuk menggunakan YCbCr. Tetapi kebanyakan fail menggunakannya kerana ia menghasilkan imej yang lebih rendah sampel daripada RGB. Tetapi anda tidak perlu mengambil kata-kata saya untuk itu. Lihat sendiri dalam jadual di bawah apakah rupa subsampling bagi setiap komponen individu dalam kedua-dua RGB dan YCbCr.

Bagaimana format JPEG berfungsi
(Versi interaktif - dalam asal artikel).

Penyingkiran biru tidak begitu ketara seperti merah atau hijau. Itu kerana enam juta kon di mata anda, kira-kira 64% sensitif kepada merah, 32% kepada hijau dan 2% kepada biru.

Pensampelan bawah komponen Y (kiri bawah) paling baik dilihat. Walaupun sedikit perubahan ketara.

Menukar imej daripada RGB kepada YCbCr tidak mengurangkan saiz fail, tetapi ia memudahkan untuk mencari butiran yang kurang kelihatan yang boleh dialih keluar. Mampatan lossy berlaku pada peringkat kedua. Ia berdasarkan idea untuk membentangkan data dalam bentuk yang lebih boleh dimampatkan.

2. Transformasi dan persampelan kosinus diskret

Tahap pemampatan ini, sebahagian besarnya, adalah tentang JPEG. Selepas menukar warna kepada YCbCr, komponen dimampatkan secara individu, jadi kita boleh menumpukan pada komponen Y sahaja. Dan inilah rupa bait komponen Y selepas menggunakan lapisan ini.

Bagaimana format JPEG berfungsi
(Versi interaktif - dalam asal artikel). Dalam versi interaktif, mengklik pada piksel akan menatal editor ke baris yang mewakilinya. Cuba alih keluar nombor dari hujung atau tambah beberapa sifar pada nombor tertentu.

Pada pandangan pertama, ia kelihatan seperti pemampatan yang sangat buruk. Terdapat 100 piksel dalam imej, dan memerlukan 000 nombor untuk mewakili kecerahannya (komponen-Y)β€”itu lebih teruk daripada memampatkan apa-apa langsung!

Walau bagaimanapun, ambil perhatian bahawa kebanyakan nombor ini adalah sifar. Selain itu, semua sifar pada penghujung baris boleh dialih keluar tanpa mengubah imej. Terdapat kira-kira 26 nombor yang tinggal, dan ini hampir 000 kali lebih sedikit!

Tahap ini mengandungi rahsia corak catur. Tidak seperti kesan lain yang kami lihat, penampilan corak ini bukanlah satu masalah. Mereka adalah blok bangunan keseluruhan imej. Setiap baris editor mengandungi tepat 64 nombor, pekali transformasi kosinus diskret (DCT) sepadan dengan keamatan 64 corak unik.

Corak ini dibentuk berdasarkan plot kosinus. Berikut ialah beberapa daripada mereka kelihatan seperti:

Bagaimana format JPEG berfungsi
8 daripada 64 kemungkinan

Di bawah ialah imej yang menunjukkan kesemua 64 corak.

Bagaimana format JPEG berfungsi
(Versi interaktif - dalam asal artikel).

Corak ini amat penting kerana ia membentuk asas kepada imej 8x8. Jika anda tidak biasa dengan algebra linear, ini bermakna mana-mana imej 8x8 boleh dibuat daripada 64 corak ini. DCT ialah proses membahagikan imej kepada blok 8x8 dan menukar setiap blok kepada gabungan 64 pekali ini.

Ia seolah-olah ajaib bahawa mana-mana imej boleh terdiri daripada 64 corak tertentu. Walau bagaimanapun, ini adalah sama seperti mengatakan bahawa mana-mana tempat di Bumi boleh digambarkan dengan dua nombor - latitud dan longitud [menunjukkan hemisfera / lebih kurang. terjemah]. Kita sering menganggap permukaan Bumi sebagai dua dimensi, jadi kita hanya memerlukan dua nombor. Imej 8x8 mempunyai 64 dimensi, jadi kita memerlukan 64 nombor.

Masih belum jelas bagaimana ini membantu kami dari segi pemampatan. Jika kita memerlukan 64 nombor untuk mewakili imej 8x8, mengapa ini lebih baik daripada hanya menyimpan 64 komponen kecerahan? Kami melakukan ini atas sebab yang sama kami menukar tiga nombor RGB kepada tiga nombor YCbCr: ia membolehkan kami mengalih keluar butiran halus.

Sukar untuk melihat dengan tepat butiran yang dialih keluar pada peringkat ini kerana JPEG menggunakan DCT pada blok 8x8. Walau bagaimanapun, tiada siapa yang melarang kami untuk menerapkannya pada keseluruhan gambar. Inilah rupa DCT untuk komponen Y yang digunakan pada keseluruhan gambar:

Bagaimana format JPEG berfungsi

Lebih daripada 60 nombor boleh dialih keluar dari penghujung dengan hampir tiada perubahan ketara pada foto.

Bagaimana format JPEG berfungsi

Walau bagaimanapun, ambil perhatian bahawa jika kita sifarkan lima nombor pertama, perbezaannya akan jelas.

Bagaimana format JPEG berfungsi

Angka-angka pada permulaan mewakili perubahan frekuensi rendah dalam imej, yang paling dilihat oleh mata kita. Nombor menjelang akhir menunjukkan perubahan dalam frekuensi tinggi yang lebih sukar untuk diperhatikan. Untuk "melihat perkara yang tidak dapat dilihat oleh mata", kita boleh mengasingkan butiran frekuensi tinggi ini dengan menyifarkan 5000 nombor pertama.

Bagaimana format JPEG berfungsi

Kami melihat semua kawasan imej di mana perubahan terbesar berlaku daripada piksel ke piksel. Mata kucing, misainya, selimut terry dan bayang-bayang di sudut kiri bawah menonjol. Anda boleh pergi lebih jauh dengan menolakkan 10 nombor pertama:

Bagaimana format JPEG berfungsi

20 000:

Bagaimana format JPEG berfungsi

40 000:

Bagaimana format JPEG berfungsi

60 000:

Bagaimana format JPEG berfungsi

Butiran frekuensi tinggi ini dialih keluar oleh JPEG semasa peringkat pemampatan. Tiada kerugian dalam menukar warna kepada pekali DCT. Kehilangan berlaku pada langkah pensampelan, di mana nilai frekuensi tinggi atau hampir sifar dikeluarkan. Apabila anda menurunkan kualiti penjimatan JPEG, program ini meningkatkan ambang untuk bilangan nilai yang dialih keluar, yang mengurangkan saiz fail, tetapi menjadikan gambar lebih piksel. Itulah sebabnya imej dalam bahagian pertama, yang 57 kali lebih kecil, kelihatan seperti ini. Setiap blok 8x8 diwakili oleh pekali DCT yang jauh lebih sedikit berbanding versi kualiti yang lebih tinggi.

Anda boleh mencipta kesan hebat seperti penstriman imej secara beransur-ansur. Anda boleh memaparkan gambar kabur yang menjadi lebih dan lebih terperinci apabila semakin banyak pekali dimuat turun.

Di sini, hanya untuk keseronokan, ialah apa yang anda perolehi menggunakan hanya 24 nombor:

Bagaimana format JPEG berfungsi

Atau hanya 5000:

Bagaimana format JPEG berfungsi

Sangat kabur, tetapi entah bagaimana boleh dikenali!

3. Pengekodan panjang jalankan, delta dan Huffman

Setakat ini, semua peringkat pemampatan telah hilang. Peringkat terakhir, sebaliknya, diteruskan tanpa kerugian. Ia tidak memadam maklumat, tetapi ia mengurangkan saiz fail dengan ketara.

Bagaimanakah anda boleh memampatkan sesuatu tanpa membuang maklumat? Bayangkan bagaimana kita akan menerangkan segi empat tepat hitam ringkas 700 x 437.

JPEG menggunakan 5000 nombor untuk ini, tetapi hasil yang lebih baik boleh dicapai. Bolehkah anda bayangkan skema pengekodan yang akan menerangkan imej sedemikian dalam sesedikit bait yang mungkin?

Skim minimum yang boleh saya hasilkan menggunakan empat: tiga untuk mewakili warna, dan yang keempat untuk menunjukkan bilangan piksel yang ada pada warna itu. Idea untuk mewakili nilai berulang dengan cara yang ringkas ini dipanggil pengekodan jangka panjang. Ia tidak rugi kerana kami boleh memulihkan data yang dikodkan kepada bentuk asalnya.

Fail JPEG dengan segi empat tepat hitam adalah lebih besar daripada 4 bait - ingat bahawa pada tahap DCT, pemampatan digunakan pada blok 8x8 piksel. Oleh itu, sekurang-kurangnya, kita memerlukan satu pekali DCT untuk setiap 64 piksel. Kami memerlukan satu kerana bukannya menyimpan satu pekali DCT diikuti dengan 63 sifar, pengekodan panjang larian membolehkan kami menyimpan satu nombor dan menunjukkan bahawa "semua yang lain adalah sifar."

Pengekodan Delta ialah teknik di mana setiap bait mengandungi perbezaan daripada beberapa nilai, bukannya nilai mutlak. Oleh itu, mengedit bait tertentu menukar warna semua piksel lain. Sebagai contoh, bukannya menyimpan

12 13 14 14 14 13 13 14

Kita boleh mulakan dengan 12 dan kemudian hanya menunjukkan berapa banyak yang perlu kita tambah atau tolak untuk mendapatkan nombor seterusnya. Dan urutan ini dalam pengekodan delta mengambil bentuk:

12 1 1 0 0 -1 0 1

Data yang ditukar tidak lebih kecil daripada data asal, tetapi lebih mudah untuk memampatkannya. Menggunakan pengekodan delta sebelum pengekodan panjang larian boleh banyak membantu sementara masih menjadi pemampatan tanpa kerugian.

Pengekodan Delta ialah salah satu daripada beberapa teknik yang digunakan di luar blok 8x8. Daripada 64 pekali DCT, satu hanyalah fungsi gelombang malar (warna pepejal). Ia mewakili purata kecerahan setiap blok untuk komponen luma, atau purata kebiruan untuk komponen Cb, dan sebagainya. Nilai pertama setiap blok DCT dipanggil nilai DC, dan setiap nilai DC dikodkan delta berkenaan dengan yang sebelumnya. Oleh itu, menukar kecerahan blok pertama akan menjejaskan semua blok.

Misteri terakhir kekal: bagaimana menukar tunggal sepenuhnya merosakkan keseluruhan gambar? Setakat ini, tahap mampatan tidak mempunyai sifat sedemikian. Jawapannya terletak pada tajuk JPEG. 500 bait pertama mengandungi metadata tentang imej - lebar, tinggi, dsb., dan kami belum bekerja dengannya lagi.

Tanpa pengepala hampir mustahil (atau sangat sukar) untuk menyahkod JPEG. Ia akan kelihatan seolah-olah saya cuba menerangkan gambar itu kepada anda, dan saya mula mencipta perkataan untuk menyampaikan tanggapan saya. Huraian mungkin agak padat, kerana saya boleh mencipta perkataan dengan betul-betul maksud yang ingin saya sampaikan, tetapi bagi orang lain, perkataan itu tidak masuk akal.

Kedengarannya bodoh, tetapi itulah yang berlaku. Setiap imej JPEG dimampatkan dengan kod khusus untuknya. Kamus kod disimpan dalam pengepala. Teknik ini dipanggil kod Huffman dan perbendaharaan kata dipanggil jadual Huffman. Dalam pengepala, jadual ditandakan dengan dua bait - 255 dan kemudian 196. Setiap komponen warna boleh mempunyai jadual sendiri.

Perubahan pada jadual akan menjejaskan mana-mana imej secara radikal. Contoh yang baik ialah menukar baris ke-15 kepada 1.

Bagaimana format JPEG berfungsi

Ini berlaku kerana jadual menentukan cara bit individu harus dibaca. Setakat ini kami hanya bekerja dengan nombor binari dalam bentuk perpuluhan. Tetapi ini menyembunyikan daripada kami fakta bahawa jika anda ingin menyimpan nombor 1 dalam bait, ia akan kelihatan seperti 00000001, kerana setiap bait mesti mempunyai tepat lapan bit, walaupun hanya satu daripadanya diperlukan.

Ini berpotensi membazir ruang yang besar jika anda mempunyai banyak nombor kecil. Kod Huffman ialah teknik yang membolehkan kita melonggarkan keperluan ini bahawa setiap nombor mesti menduduki lapan bit. Ini bermakna jika anda melihat dua bait:

234 115

Kemudian, bergantung pada jadual Huffman, ini boleh menjadi tiga nombor. Untuk mengekstraknya, anda perlu terlebih dahulu memecahkannya kepada bit individu:

11101010 01110011

Kemudian kita melihat jadual untuk memikirkan cara mengumpulkannya. Sebagai contoh, ini boleh menjadi enam bit pertama, (111010), atau 58 dalam perpuluhan, diikuti oleh lima bit (10011), atau 19, dan akhirnya empat bit terakhir (0011), atau 3.

Oleh itu, sangat sukar untuk memahami bait pada peringkat pemampatan ini. Bait tidak mewakili apa yang kelihatan. Saya tidak akan pergi ke butiran bekerja dengan jadual dalam artikel ini, tetapi bahan-bahan mengenai isu ini dalam talian cukup.

Satu helah menarik yang boleh anda lakukan dengan pengetahuan ini ialah memisahkan pengepala daripada JPEG dan menyimpannya secara berasingan. Malah, ternyata hanya anda sahaja yang boleh membaca fail tersebut. Facebook melakukan ini untuk menjadikan fail lebih kecil.

Apa lagi yang boleh dilakukan ialah menukar sedikit jadual Huffman. Bagi yang lain ia akan kelihatan seperti gambar yang rosak. Dan hanya anda yang akan tahu cara ajaib untuk memperbaikinya.

Mari kita ringkaskan: jadi apa yang diperlukan untuk menyahkod JPEG? Perlu:

  1. Ekstrak jadual Huffman daripada pengepala dan nyahkod bit.
  2. Ekstrak pekali transformasi kosinus diskret untuk setiap komponen warna dan kecerahan bagi setiap blok 8x8, melakukan transformasi pengekodan delta panjang larian songsang.
  3. Gabungkan kosinus berdasarkan pekali untuk mendapatkan nilai piksel bagi setiap blok 8x8.
  4. Skala komponen warna jika subsampling dilakukan (maklumat ini dalam pengepala).
  5. Tukarkan nilai YCbCr yang terhasil untuk setiap piksel kepada RGB.
  6. Paparkan imej pada skrin!

Kerja serius untuk hanya melihat foto dengan kucing! Walau bagaimanapun, apa yang saya suka mengenainya ialah ia menunjukkan bagaimana teknologi JPEG berpusatkan manusia. Ia berdasarkan keanehan persepsi kami, membolehkan kami mencapai pemampatan yang jauh lebih baik daripada teknologi konvensional. Dan sekarang setelah kami memahami cara JPEG berfungsi, kami boleh bayangkan bagaimana teknologi ini boleh dipindahkan ke kawasan lain. Contohnya, pengekodan delta dalam video boleh memberikan pengurangan ketara dalam saiz fail, kerana selalunya terdapat keseluruhan kawasan yang tidak berubah dari bingkai ke bingkai (contohnya, latar belakang).

Kod yang digunakan dalam artikel, terbuka dan mengandungi arahan tentang cara menggantikan gambar dengan gambar anda sendiri.

Sumber: www.habr.com

Tambah komen