Come funziona la compressione dei file?

  • Anthony Heddings

    @anthonyheddings

  • Agosto 14, 2018, 6:40am EDT

Gli ingegneri informatici hanno sempre sviluppato nuovi modi per inserire molti dati in uno spazio ridotto. Era vero quando i nostri hard disk erano minuscoli, e l’avvento di internet ha solo reso la cosa più critica. La compressione dei file gioca un ruolo importante nel connetterci, permettendoci di inviare meno dati lungo la linea in modo da poter avere download più veloci e inserire più connessioni in reti occupate.

Come funziona?

Rispondere a questa domanda implicherebbe spiegare della matematica molto complicata, certamente più di quanto possiamo coprire in questo articolo, ma non c’è bisogno di capire esattamente come funziona matematicamente per capire le basi.

Le librerie più popolari per la compressione del testo si basano su due algoritmi di compressione, usandoli entrambi allo stesso tempo per ottenere rapporti di compressione molto alti. Questi due algoritmi sono “LZ77” e “Huffman coding”. La codifica Huffman è abbastanza complicata, e non ne parleremo in dettaglio qui. Principalmente, usa un po’ di matematica sofisticata per assegnare codici binari più brevi alle singole lettere, riducendo le dimensioni dei file nel processo. Se vuoi saperne di più, guarda questo articolo su come funziona il codice, o questa spiegazione di Computerphile.

Pubblicità

LZ77, d’altra parte, è relativamente semplice ed è quello di cui parleremo qui. Cerca di rimuovere le parole duplicate e sostituirle con una “chiave” più piccola che rappresenta la parola.

Prendiamo questo breve pezzo di testo per esempio:

L’algoritmo LZ77 guarderebbe questo testo, capirebbe che ripete “howtogeek” tre volte, e lo cambierebbe in questo:

Quindi, quando vuole rileggere il testo, sostituirebbe ogni istanza di (h) con “howtogeek”, riportandoci alla frase originale.

Chiamiamo la compressione come questa “senza perdita” – i dati che metti dentro sono gli stessi di quelli che ottieni fuori. Non si perde nulla.

Pubblicità

In realtà, LZ77 non usa una lista di chiavi, ma sostituisce la seconda e la terza occorrenza con un collegamento indietro nella memoria:

Così ora, quando arriva a (h), guarda indietro a “howtogeek” e legge invece quello.

Se vi interessa una spiegazione più dettagliata, questo video di Computerphile è piuttosto utile.

Ora, questo è un esempio idealizzato. In realtà, la maggior parte del testo è compresso con chiavi piccole come pochi caratteri. Per esempio, la parola “the” sarebbe compressa anche quando appare in parole come “there,” “their,” e “then. Con il testo ripetuto, si possono ottenere dei rapporti di compressione pazzeschi. Prendete questo file di testo con la parola “howtogeek” ripetuta 100 volte. Il file di testo originale è grande tre kilobyte. Una volta compresso, però, occupa solo 158 byte. Questo è quasi il 95% di compressione.

Pubblicità

Ovviamente, questo è un esempio abbastanza estremo dato che abbiamo solo la stessa parola ripetuta più e più volte. Nella pratica generale, probabilmente otterrai circa il 30-40% di compressione usando un formato di compressione come ZIP su un file che è principalmente testo.

Questo algoritmo LZ77 si applica a tutti i dati binari, a proposito, e non solo al testo, anche se il testo generalmente è più facile da comprimere a causa di quante parole ripetute usa la maggior parte delle lingue. Una lingua come il cinese potrebbe essere un po’ più difficile da comprimere dell’inglese, per esempio.

Come funziona la compressione di immagini e video?

La compressione video e audio funziona in modo molto diverso. A differenza del testo, dove si può avere una compressione senza perdite e non si perdono dati, con le immagini abbiamo la cosiddetta “compressione lossy”, dove si perdono alcuni dati. E più si comprime, più dati si perdono.

Questo è ciò che porta a quei JPEG dall’aspetto orribile che la gente ha caricato, condiviso e screenshottato più volte. Ogni volta che l’immagine viene compressa, perde alcuni dati.

Pubblicità

Ecco un esempio. Questo è uno screenshot che ho fatto e che non è stato affatto compresso.

Ho poi preso quello screenshot e l’ho passato in Photoshop più volte, esportandolo ogni volta come JPEG di bassa qualità. Ecco il risultato.

Sembra piuttosto brutto, vero?

Beh, questo è solo uno scenario peggiore, esportando ogni volta a qualità JPEG 0%. Per confronto, ecco un JPEG al 50% di qualità, che è quasi indistinguibile dall’immagine PNG di partenza, a meno che non la si ingrandisca e la si guardi da vicino.

Il PNG di questa immagine era grande 200 KB, ma questo JPEG al 50% è solo 28 KB.

Pubblicità

Come fa a risparmiare così tanto spazio? Beh, l’algoritmo JPEG è una prodezza dell’ingegneria. La maggior parte delle immagini memorizza una lista di numeri, con ogni numero che rappresenta un singolo pixel.

JPEG non fa nulla di tutto ciò. Invece, memorizza le immagini usando qualcosa chiamato Discrete Cosine Transform, che è un insieme di onde sinusoidali sommate insieme a diverse intensità. Usa 64 equazioni diverse, ma la maggior parte di queste non viene usata. Questo è ciò che fa il cursore di qualità per JPEG in Photoshop e altre applicazioni per le immagini: scegliere quante equazioni usare. Le applicazioni usano poi la codifica Huffman per ridurre ulteriormente le dimensioni del file.

Questo dà ai JPEG un rapporto di compressione incredibilmente alto, che può ridurre un file che sarebbe di molti megabyte a un paio di kilobyte, a seconda della qualità. Naturalmente, se lo usi troppo, ti ritrovi con questo:

Questa immagine è orribile. Ma piccole quantità di compressione JPEG possono avere un impatto significativo sulla dimensione del file, e questo rende JPEG molto utile per la compressione delle immagini sui siti web. La maggior parte delle immagini che vedi online sono compresse per risparmiare sui tempi di download, specialmente per gli utenti di telefonia mobile con scarse connessioni dati. Infatti, tutte le immagini su How-To Geek sono state compresse per rendere il caricamento delle pagine più veloce, e probabilmente non te ne sei mai accorto.

Compressione video

I video funzionano un po’ diversamente dalle immagini. Si potrebbe pensare che comprimano semplicemente ogni fotogramma del video usando il JPEG, e certamente lo fanno, ma c’è un metodo migliore per il video.

Pubblicità

Usiamo qualcosa chiamato “compressione interframe”, che calcola i cambiamenti tra ogni fotogramma e memorizza solo quelli. Così, per esempio, se hai un’inquadratura relativamente ferma che occupa diversi secondi in un video, un sacco di spazio viene risparmiato perché l’algoritmo di compressione non ha bisogno di memorizzare tutto il materiale nella scena che non cambia. La compressione interframe è la ragione principale per cui abbiamo la TV digitale e i video sul web. Senza di essa, i video sarebbero centinaia di gigabyte, più della dimensione media dell’hard disk nel 2005, quando YouTube è stato lanciato.

Inoltre, dato che la compressione interframe funziona meglio con video per lo più fermi, ecco perché i coriandoli rovinano la qualità del video.

Nota: le GIF non lo fanno, ed è per questo che le GIF animate sono spesso molto corte e piccole, ma hanno ancora una dimensione di file piuttosto grande.

Pubblicità

Un’altra cosa da tenere a mente sul video è il suo bitrate: la quantità di dati consentita in ogni secondo. Se il tuo bitrate è di 200 kb/s, per esempio, il tuo video sarà piuttosto brutto. La qualità sale con l’aumentare del bitrate, ma dopo un paio di megabyte al secondo, si ottengono rendimenti decrescenti.

Questo è un fotogramma zoomato preso da un video di una medusa. Quello a sinistra è a 3Mb/s, e quello a destra è a 100Mb/s.

Un aumento di 30 volte della dimensione del file, ma non molto della qualità. Generalmente, i video di YouTube si aggirano intorno ai 2-10Mb/s a seconda della vostra connessione, e qualsiasi cosa in più probabilmente non verrebbe notata.

Questa demo funziona meglio con i video reali, quindi se volete controllare da soli, potete scaricare gli stessi video di test del bitrate usati qui.

Compressione audio

La compressione audio funziona in modo molto simile alla compressione di testo e immagini. Dove JPEG rimuove i dettagli da un’immagine che non vedrete, la compressione audio fa lo stesso per i suoni. Potresti non aver bisogno di sentire lo scricchiolio del plettro sulla corda se la chitarra reale è molto, molto più forte.

Pubblicità

MP3 usa anche il bitrate, che va dalla fascia bassa di 48 e 96 kbps (la fascia bassa) a 128 e 240kbps (abbastanza buona) a 320kbps (audio di fascia alta), e probabilmente sentirai la differenza solo con cuffie (e orecchie) eccezionalmente buone.

Ci sono anche codec di compressione lossless per l’audio – il principale è FLAC – che usa la codifica LZ77 per fornire un audio interamente lossless. Alcune persone giurano sulla perfetta qualità audio di FLAC, ma con la prevalenza di MP3, sembra che la maggior parte delle persone non possa dire o non badi alla differenza.

Anthony Heddings
Anthony Heddings è l’ingegnere cloud residente per LifeSavvy Media, uno scrittore tecnico, un programmatore e un esperto della piattaforma AWS di Amazon. Ha scritto centinaia di articoli per How-To Geek e CloudSavvy IT che sono stati letti milioni di volte.Read Full Bio ”