Inginerii de software au dezvoltat întotdeauna noi modalități de a monta o mulțime de date într-un spațiu mic. A fost adevărat când hard drive-urile noastre erau mici, iar apariția internetului tocmai a făcut-o mai critică. Comprimarea fișierelor joacă un rol important în conectarea noastră, permițându-ne să trimitem mai puține date pe linie, astfel încât să putem avea descărcări mai rapide și să potriviți mai multe conexiuni în rețelele ocupate.
Pentru a răspunde la această întrebare ar implica explicarea unor matematici foarte complicate, cu siguranță mai mult decât putem acoperi în acest articol, dar nu trebuie să înțelegeți cu exactitate cum funcționează matematic pentru a înțelege elementele de bază.
Bibliotecile cele mai populare pentru comprimarea textului se bazează pe doi algoritmi de compresie, folosindu-se ambele în același timp pentru a obține rate foarte ridicate de compresie. Acești doi algoritmi sunt codificări "LZ77" și "Huffman". Codificarea lui Huffman este destul de complicată și nu vom mai intra în detaliu despre acesta. În primul rând, folosește unele matematiciene fantezie pentru a atribui mai scurtecodurile binare la scrisori individuale, diminuarea dimensiunilor fișierelor în proces. Dacă doriți să aflați mai multe despre acest lucru, consultați acest articol cu privire la modul în care funcționează codul sau acest explicator prin Computerphile.
LZ77, pe de altă parte, este relativ simplu și despre care vom vorbi aici. Se caută să elimine cuvintele duplicate și să le înlocuiască cu o "cheie" mai mică care reprezintă cuvântul.
Luați această scurtă piesă de text, de exemplu:
Algoritmul LZ77 ar privi acest text, va da seama că repetă "howtogeek" de trei ori și schimba-l la acest lucru:
Apoi, când vrea să citească textul înapoi, ar înlocui fiecare instanță a (h) cu "howtogeek", care ne aduce înapoi la fraza originală.
Noi numim compresie ca aceasta "fără pierderi" - datele pe care le puneți sunt identice cu datele pe care le obțineți. Nimic nu este pierdut.
În realitate, LZ77 nu utilizează o listă de chei, ci înlocuiește a doua și a treia apariție cu o legătură înapoi în memorie:
Deci, acum, când ajunge la (h), va reveni la "howtogeek" și va citi în schimb.
Dacă sunteți interesat de o explicație mai detaliată, acest videoclip de la Computerphile este destul de util.
Acum, acesta este un exemplu ideal. În realitate, majoritatea textului este comprimat cu chei la fel de mici ca doar câteva caractere. De exemplu, cuvântul "a" ar fi comprimat chiar și atunci când apare cu cuvinte precum "acolo", "lor" și "atunci". Cu text repetat, puteți obține niște rapoarte de compresie nebunești. Luați acest fișier text cu cuvântul "howtogeek" repetat de 100 de ori. Fișierul original este de trei kilobyte. Când este comprimat, totuși, este nevoie doar de 158 de octeți. Aceasta este o comprimare de aproape 95%.
Acum, evident, este un exemplu destul de extrem, deoarece am avut mereu același cuvânt repetat. În practica generală, probabil veți obține aproximativ 30-40% compresie folosind un format de comprimare, cum ar fi ZIP, pe un fișier care este în mare parte text.
Acest algoritm LZ77 se aplică tuturor datelor binare, apropo, și nu doar textului, deși textul este, în general, mai ușor de comprimat din cauza numărului de cuvinte repetate pe care le folosesc cele mai multe limbi. O limbă ca chinezii ar putea fi un pic mai greu de comprimat decât engleza, de exemplu.
Compresia video și audio funcționează foarte diferit. Spre deosebire de textul în care puteți avea compresie fără pierderi și nu pierdeți date, cu imagini avem ceea ce se numește "Compensare în pierdere" unde pierdeți niște date. Și cu cât comprimați mai mult, cu atât veți pierde mai multe date.
Aceasta este ceea ce duce la acele JPEG-uri groaznice, pe care le-au încărcat, partajat și capturat de mai multe ori. De fiecare dată când imaginea devine comprimată, ea pierde unele date.
Iată un exemplu. Aceasta este o captură de ecran pe care am luat-o, care nu a fost comprimată deloc.
Apoi am luat acea captură de ecran și l-am fugit de Photoshop de mai multe ori, de fiecare dată când o exportam ca un JPEG de calitate scăzută. Iată rezultatul.
Se pare destul de rău, nu-i așa?
Ei bine, acesta este doar un scenariu cel mai prost, exportând de fiecare dată câte 0% calitate JPEG. Pentru comparație, iată un JPEG de 50% de calitate, care este aproape indistinguizabil față de imaginea PNG sursă, dacă nu o aruncați în aer și veți arunca o privire mai atentă.
PNG-ul pentru această imagine a fost de 200 KB, dar această calitate JPEG de 50% este de numai 28 KB.
Cum salvează atât de mult spațiu? Ei bine, algoritmul JPEG este o operă de inginerie. Majoritatea imaginilor stochează o listă de numere, fiecare număr reprezentând un singur pixel.
JPEG nu face nimic din toate astea. În schimb, stochează imagini utilizând ceva numit Transformare discretă a cosinusului, care este o colecție de unde sinusoidale adunate la diferite intensități. Foloseste 64 de ecuatii diferite, dar majoritatea nu se obisnuiesc. Acesta este ceea ce sliderul de calitate pentru JPEG în Photoshop și alte aplicații imagine nu - alege câte ecuații să le folosiți. Aplicațiile folosesc apoi codificarea Huffman pentru a reduce și mai mult dimensiunea fișierului.
Acest lucru oferă JPEG-urilor un raport de compresie insanely ridicat, care poate reduce un fișier care ar fi mai multe megabyte până la câteva kilobyte, în funcție de calitate. Desigur, dacă o folosiți prea mult, veți sfârși prin aceasta:
Această imagine este oribilă. Dar sumele minore de compresie JPEG pot avea un impact semnificativ asupra dimensiunii fișierului, ceea ce face JPEG foarte util pentru compresia imaginilor pe site-uri web. Majoritatea imaginilor pe care le vedeți online sunt comprimate pentru a salva timpul de descărcare, în special pentru utilizatorii de telefonie mobilă cu conexiuni slabe de date. De fapt, toate imaginile de pe How-To Geek au fost comprimate pentru a face încărcarea paginii mai rapidă și probabil că nu ați observat niciodată.
Video funcționează puțin diferit de imagini.Ați crede că vor comprima fiecare cadru video folosind JPEG, și cu siguranță o fac, dar există o metodă mai bună pentru video.
Folosim ceva numit "compresie interframe", care calculează schimbările dintre fiecare cadru și stochează numai acele. De exemplu, dacă aveți o fotografie relativ inadecvată care durează câteva secunde într-un videoclip, se salvează o mulțime de spațiu deoarece algoritmul de compresie nu are nevoie să stocheze toate lucrurile în scena care nu se schimbă. Interfața de comprimare este principalul motiv pentru care avem televiziune digitală și video web la toate. Fără aceasta, videoclipurile ar fi sute de gigaocteți, mai mult decât dimensiunea medie a unității hard disk în 2005, când YouTube a lansat.
De asemenea, deoarece compresia interframei funcționează cel mai bine cu cea mai mare parte video staționară, acesta este motivul pentru confetti ruinează calitatea video.
Notă: GIF nu face acest lucru, motiv pentru care animatele GIF-uri sunt adesea foarte scurte și mici, dar au încă o dimensiune destul de mare a fișierelor.
Un alt lucru care trebuie păstrat în minte în legătură cu videoclipul este bitrate-cantitatea de date permise în fiecare secundă. Dacă bitrate-ul dvs. este de 200 kb / s, de exemplu, videoclipul dvs. va arăta destul de rău. Calitatea creste pe masura ce bitrate-ul urca, dar dupa cateva megaocteti pe secunda, obtineti randamente scazute.
Acesta este un cadru mărit care este luat dintr-un videoclip al unei meduze. Cel din stânga este de 3Mb / s, iar cel din dreapta este de 100Mb / s.
O creștere de 30 de ori a dimensiunii fișierului, dar nu o creștere semnificativă a calității. În general, videoclipurile YouTube se situează în jurul valorii de 2-10Mb / s în funcție de conexiunea dvs., deoarece nu ar mai putea fi observat nimic altceva.
Acest demo funcționează mai bine cu videoclipul real, deci dacă doriți să îl verificați singur, puteți descărca aceleași videoclipuri de testare de biți utilizate aici.
Compresia audio funcționează foarte asemănător cu compresia textului și a imaginii. În cazul în care JPEG elimină detaliile dintr-o imagine pe care nu o veți vedea, compresia audio nu face același lucru pentru sunete. S-ar putea să nu fi nevoie să auziți scârțâitul chitarei de chitară dacă chitara reală este mult mai puternică.
MP3 folosește de asemenea bitrate, variind de la sfârșitul scăzut de 48 și 96 kbps (low end) la 128 și 240kbps (destul de bun) până la 320kbps (audio high-end), și probabil veți auzi doar diferența cu căști de excepție ( și urechile).
Există, de asemenea, codecuri de compresie fără pierderi pentru audio - cea mai importantă fiind FLAC - care utilizează codarea LZ77 pentru a furniza audio în întregime fără pierderi. Unii oameni jură pe calitatea audio excelentă a FLAC, dar cu prevalența de MP3-uri, se pare că majoritatea oamenilor nu pot să spună sau să nu-și piardă diferența.