Kako radi sažimanje datoteke?
Softverski inženjeri uvijek su razvili nove načine ugradnje velikog broja podataka u mali prostor. Bilo je istina kada su naši tvrdi diskovi bili maleni, a pojavom interneta upravo je to učinilo kritičnijim. Sažimanje datoteke igra veliku ulogu u povezivanju nas, dopuštajući nam da šaljemo manje podataka prema dolje kako bismo mogli brže preuzimati i prilagoditi više veza na prometne mreže.
Dakle, kako djeluje?
Da biste odgovorili na to pitanje, trebali biste objasniti neke vrlo komplicirane matematike, svakako više nego što možemo obuhvatiti u ovom članku, ali ne morate točno razumjeti kako to matematički funkcionira kako biste razumjeli osnove..
Najpopularnije biblioteke za komprimiranje teksta oslanjaju se na dva algoritma kompresije, koristeći istovremeno istovremeno visoke postotke kompresije. Ova dva algoritma su "LZ77" i "Huffmanovo kodiranje". Huffmanovo kodiranje je prilično komplicirano i nećemo ovdje ulaziti u detalje. Prvenstveno, koristi neku fensi matematiku za dodjelu kraćih binarni kodovi na pojedinačna slova, smanjujući veličine datoteka u procesu. Ako želite saznati više o tome, pogledajte ovaj članak o načinu funkcioniranja koda, ili o ovom objašnjivaču pomoću Computerfila.
LZ77 je, s druge strane, relativno jednostavan i o tome ćemo govoriti ovdje. On pokušava ukloniti duple riječi i zamijeniti ih manjim "ključem" koji predstavlja riječ.
Uzmite ovaj kratki dio teksta, na primjer:
Algoritam LZ77 bi pogledao ovaj tekst, shvatio da tri puta ponavlja "howtogeek" i mijenja ga u ovo:
Zatim, kada želi pročitati tekst natrag, zamijenit će svaku instancu (h) s "howtogeek", vraćajući nas na izvornu frazu.
Mi zovemo kompresiju kao što je ova "bez gubitaka" - podaci koje unesete su isti kao i podaci koje izvadite. Ništa nije izgubljeno.
U stvarnosti, LZ77 ne koristi popis ključeva, već zamjenjuje drugu i treću pojavu s vezom natrag u memoriji:
Tako sada, kada dođe do (h), on će se osvrnuti na "howtogeek" i pročitati to umjesto toga.
Ako ste zainteresirani za detaljnije objašnjenje, ovaj videozapis iz Computerphila je vrlo koristan.
Ovo je idealizirani primjer. U stvarnosti, većina teksta je komprimirana s ključevima od samo nekoliko znakova. Na primjer, riječ "bi" bi se komprimirala čak i kad bi se pojavila u riječima kao što su "tamo", "njihova" i "tada". S ponovljenim tekstom možete dobiti neke lude omjere kompresije. Uzmite ovu tekstualnu datoteku s riječju "howtogeek" koja se ponavlja 100 puta. Izvorna tekstualna datoteka je veličine tri kilobajta. Međutim, kada se komprimira, zauzima samo 158 bajtova. To je gotovo 95% kompresija.
Očigledno, to je prilično ekstreman primjer budući da smo istu riječ ponavljali iznova i iznova. U općoj praksi, vjerojatno ćete dobiti oko 30-40% kompresije koristeći format kompresije kao što je ZIP na datoteci koja je uglavnom tekstualna.
Ovaj LZ77 algoritam primjenjuje se na sve binarne podatke, usput, a ne samo na tekst, iako je tekst općenito lakši za komprimiranje zbog toga koliko riječi koje se ponavljaju koristi većinu jezika. Jezik poput kineskog možda je malo teže komprimirati od engleskog, na primjer.
Kako funkcionira kompresija slike i videozapisa?
Kompresija videozapisa i zvuka radi vrlo različito. Za razliku od teksta u kojem možete imati kompresiju bez gubitaka, a podaci se ne gube, sa slikama imamo ono što se zove "Lossy Compression" gdje gubite neke podatke. I što više komprimirate, više ćete izgubiti podatke.
To je ono što dovodi do tih strašnih JPEG-ova koje su ljudi više puta učitali, dijelili i snimili. Svaki put kada se slika komprimira, ona gubi neke podatke.
Evo primjera. Ovo je screenshot koji sam uzeo da uopće nije komprimiran.
Zatim sam uzeo taj screenshot i pokrenuo ga kroz Photoshop više puta, svaki put ga izvozeći kao JPEG niske kvalitete. Evo rezultata.
Izgleda prilično loše, točno?
Pa, ovo je samo najgori scenarij, svaki put se izvozi na 0% JPEG kvalitete. Za usporedbu, ovdje je 50% kvalitetan JPEG, koji se gotovo ne može razlikovati od izvorne PNG slike ako ga ne razotkrijete i pogledate izbliza.
PNG za ovu sliku je veličine 200 KB, ali taj JPEG kvalitete od 50% iznosi samo 28 KB.
Kako štedi toliko prostora? Pa, JPEG algoritam je inženjerski podvig. Većina slika pohranjuje popis brojeva, pri čemu svaki broj predstavlja jedan piksel.
JPEG ništa od toga ne radi. Umjesto toga, pohranjuje slike koristeći nešto što se naziva diskretna kosinusna transformacija, koja je skup sinusnih valova koji se zbrajaju u različitim intenzitetima. Koristi 64 različite jednadžbe, ali većina njih se ne koristi. To je ono što klizač kvalitete za JPEG u Photoshopu i drugim slikovnim aplikacijama odabire koliko jednadžbi koristiti. Aplikacije zatim upotrebljavaju Huffmanov kodiranje kako bi još više smanjile veličinu datoteke.
To JPEG-ovima daje iznimno visok stupanj kompresije, što može smanjiti datoteku koja će biti višestrukih megabajta do nekoliko kilobajta, ovisno o kvaliteti. Naravno, ako ga previše koristite, na kraju ćete dobiti sljedeće:
Ta je slika užasna. No male količine JPEG kompresije mogu imati značajan utjecaj na veličinu datoteke, a to čini JPEG vrlo korisnim za kompresiju slika na web-lokacijama. Većina slika koje vidite na mreži komprimirane su kako bi se uštedjela na vremenu preuzimanja, posebno za mobilne korisnike s lošim podatkovnim vezama. U stvari, sve slike na How-To Geek su komprimirane kako bi učitavanje stranica bilo brže, a vjerojatno niste ni primijetili.
Kompresija videozapisa
Video radi malo drugačije od slika. Pomislili biste da bi samo komprimirali svaki kadar videozapisa pomoću JPEG-a, i to sigurno rade, ali postoji bolja metoda za video.
Koristimo nešto što se naziva “interframe kompresija”, koja izračunava promjene između svakog okvira i pohranjuje ih samo. Tako, na primjer, ako imate relativno mirnu fotografiju koja traje nekoliko sekundi u videozapisu, puno prostora se sprema jer algoritam kompresije ne mora pohranjivati sve stvari u sceni koje se ne mijenjaju. Interframe kompresija je glavni razlog što uopće imamo digitalni TV i web video. Bez toga, videozapisi bi bili stotine gigabajta, što je više od prosječne veličine tvrdog diska 2005. godine kada je pokrenuta usluga YouTube.
Također, budući da interframe kompresija najbolje funkcionira s uglavnom stacionarnim videozapisima, konfeti uništavaju kvalitetu videozapisa.
Napomena: GIF to ne čini, zbog čega su animirani GIF-ovi često vrlo kratki i mali, ali još uvijek imaju veliku veličinu datoteke.
Još jedna stvar koju trebate imati na umu u vezi videozapisa jest njegov bitrate - količina podataka dopuštena u svakoj sekundi. Na primjer, ako je brzina prijenosa 200 kb / s, vaš će videozapis izgledati prilično loše. Kvaliteta raste kako se bitrate povećava, ali nakon nekoliko megabajta u sekundi dobivate sve manji prinos.
Ovo je zumirani okvir snimljen iz videozapisa meduze. Onaj s lijeve strane je na 3Mb / s, a onaj s desne strane je 100Mb / s.
Povećanje veličine datoteke od 30x, ali ne i povećanje kvalitete. Općenito, videozapisi na usluzi YouTube sjede oko 2-10Mb / s, ovisno o vašoj vezi, budući da se ništa više ne bi moglo primijetiti.
Ovaj demo radi bolje s stvarnim videozapisom, pa ako ga želite sami provjeriti, možete preuzeti iste testove za bitrate koji se koriste ovdje.
Kompresija zvuka
Kompresija zvuka radi vrlo slično kao kod kompresije teksta i slika. Tamo gdje JPEG uklanja detalje s slike koju nećete vidjeti, kompresija zvuka čini isto za zvukove. Možda nećete morati čuti škripanje gitare pokupiti na string, ako je stvarna gitara je mnogo, mnogo glasnije.
MP3 također koristi bitrate, u rasponu od niske razine od 48 i 96 kbps (niska razina) do 128 i 240 kbps (prilično dobra) do 320 kb / s (high-end audio), a vjerojatno ćete samo čuti razliku s iznimno dobrim slušalicama ( i uši).
Tu su i kodeci za kompresiju bez gubitaka za audio - glavni je FLAC-koji koristi LZ77 kodiranje za isporuku cjelovitog zvuka bez gubitaka. Neki se zaklinju u savršenu kvalitetu zvuka FLAC-a, ali s obzirom na prisutnost MP3-a, čini se da većina ljudi ne zna ili ne smeta razlici.