Homepage » come » Come funziona la compressione dei file?

    Come funziona la compressione dei file?

    Gli ingegneri del software hanno sempre sviluppato nuovi modi di inserire molti dati in uno spazio ristretto. Era vero quando i nostri dischi rigidi erano minuscoli e l'avvento di Internet lo rendeva ancora più critico. La compressione dei file gioca un ruolo importante nel collegarci, permettendoci di inviare meno dati lungo la linea in modo che possiamo avere download più veloci e installare più connessioni su reti occupate.

    Quindi, come funziona?

    Rispondere a questa domanda implicherebbe la spiegazione di alcuni calcoli matematici molto complicati, sicuramente più di quelli che possiamo coprire in questo articolo, ma non è necessario capire esattamente come funzioni matematicamente per capire le basi.

    Le librerie più popolari per la compressione del testo si basano su due algoritmi di compressione, utilizzando entrambi allo stesso tempo per ottenere rapporti di compressione molto elevati. Questi due algoritmi sono "LZ77" e "Huffman coding". La codifica di Huffman è piuttosto complicata, e non entreremo nei dettagli su quello qui. Principalmente, utilizza una matematica elaborata da assegnare più breve codici binari a singole lettere, riducendo le dimensioni dei file nel processo. Se vuoi saperne di più, guarda questo articolo su come funziona il codice, o questo spiegatore di Computerphile.

    LZ77, d'altra parte, è relativamente semplice ed è ciò di cui parleremo qui. Cerca di rimuovere parole duplicate e sostituirle con una "chiave" più piccola che rappresenta la parola.

    Prendi questo breve pezzo di testo per esempio:

    L'algoritmo LZ77 guarderebbe questo testo, realizzerà che ripete "howtogeek" tre volte e lo cambia in questo:

    Quindi, quando vuole leggere il testo indietro, sostituisce ogni istanza di (h) con "howtogeek", riportandoci alla frase originale.

    Chiamiamo la compressione come "senza perdita": i dati inseriti sono uguali ai dati che si ottengono. Niente è perso.

    In realtà, LZ77 non utilizza un elenco di chiavi, ma sostituisce la seconda e la terza occorrenza con un link in memoria:

    Così ora, quando arriverà a (h), tornerà a "howtogeek" e leggerà quello invece.

    Se sei interessato a una spiegazione più dettagliata, questo video di Computerphile è piuttosto utile.

    Ora, questo è un esempio idealizzato. In realtà, la maggior parte del testo è compressa con tasti piccoli come pochi caratteri. Ad esempio, la parola "the" verrebbe compresso anche quando appare in parole come "there", "loro" e "then". Con testo ripetuto, puoi ottenere alcuni pazzi rapporti di compressione. Prendi questo file di testo con la parola "howtogeek" ripetuta 100 volte. Il file di testo originale ha una dimensione di tre kilobyte. Quando compresso, però, occupa solo 158 byte. È quasi il 95% di compressione.

    Ora ovviamente, questo è un esempio piuttosto estremo dato che abbiamo ripetuto più volte la stessa parola. Nella pratica generale, probabilmente otterrai una compressione del 30-40% circa 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 del numero di parole ripetute utilizzate dalla maggior parte delle lingue. Un linguaggio come il cinese potrebbe essere un po 'più difficile da comprimere rispetto all'inglese, per esempio.

    Come funziona la compressione di immagini e video?

    La compressione audio e video funziona in modo molto diverso. A differenza del testo in cui è possibile avere una compressione senza perdita di dati e nessun dato viene perso, con le immagini abbiamo la cosiddetta "compressione con perdita" in cui si perdono alcuni dati. E più comprimi, più dati perdi.

    Questo è ciò che porta a quei JPEG orribili che le persone hanno caricato, condiviso e schermato più volte. Ogni volta che l'immagine viene compressa, perde alcuni dati.

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

    Ho quindi preso lo screenshot e l'ho eseguito più volte tramite Photoshop, ogni volta esportandolo come JPEG di bassa qualità. Ecco il risultato.

    Sembra piuttosto male, giusto?

    Bene, questo è solo lo scenario peggiore, esportando ogni volta con una qualità JPEG dello 0%. Per fare un confronto, ecco un JPEG di qualità del 50%, che è quasi indistinguibile dall'immagine PNG sorgente a meno che non lo faccia saltare in aria e guardi attentamente.

    Il PNG per questa immagine aveva una dimensione di 200 KB, ma questo JPEG di qualità 50% è solo 28 KB.

    Quindi, come fa risparmiare così tanto spazio? Bene, l'algoritmo JPEG è un'impresa ingegneristica. La maggior parte delle immagini memorizza un elenco di numeri, con ciascun numero che rappresenta un singolo pixel.

    JPEG non fa nulla di questo. Invece, memorizza le immagini usando qualcosa chiamato Discrete Cosine Transform, che è una raccolta di onde sinusoidali aggiunte insieme a intensità diverse. Usa 64 equazioni diverse, ma la maggior parte di queste non viene utilizzata. Questo è ciò che fa lo slider di qualità per JPEG in Photoshop e altre app di immagini: scegli quante equazioni usare. Le app utilizzano quindi la codifica Huffman per ridurre ulteriormente le dimensioni del file.

    Ciò fornisce ai JPEG un rapporto di compressione incredibilmente alto, che può ridurre un file che sarebbe più di un megabyte fino a un paio di kilobyte, a seconda della qualità. Certo, se lo usi troppo, finisci con questo:

    Quell'immagine è orribile. Ma piccole quantità di compressione JPEG possono avere un impatto significativo sulle dimensioni del file, e questo rende il 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, soprattutto per gli utenti mobili con scarse connessioni dati. In effetti, tutte le immagini su How-To Geek sono state compresse per rendere più veloce il caricamento della pagina, e probabilmente non l'avrai mai notato.

    Compressione video

    Il video funziona un po 'diversamente dalle immagini. Penseresti che avrebbero semplicemente compresso ogni fotogramma di video usando JPEG, e sicuramente lo fanno, ma c'è un metodo migliore per i video.

    Usiamo qualcosa chiamato "compressione interframe", che calcola le modifiche tra ogni frame e memorizza solo quelle. Quindi, ad esempio, se si dispone di uno scatto relativamente fermo che occupa diversi secondi in un video, viene salvato un sacco di spazio perché l'algoritmo di compressione non ha bisogno di memorizzare tutte le cose nella scena che non cambiano. La compressione interframe è la ragione principale per cui abbiamo TV digitale e web video. Senza di esso, i video sarebbero centinaia di gigabyte, più della dimensione media del disco rigido nel 2005, quando YouTube ha lanciato.

    Inoltre, poiché la compressione interframe funziona meglio con video per lo più fissi, questo è il motivo per cui i coriandoli rovinano la qualità del video.

    Nota: GIF non lo fa, motivo per cui le GIF animate sono spesso molto brevi e piccole, ma hanno comunque una dimensione di file abbastanza grande.

    Un'altra cosa da tenere a mente sul video è il suo bitrate: la quantità di dati consentiti in ogni secondo. Ad esempio, se il tuo bitrate è di 200 kb / s, il tuo video sembrerà piuttosto scadente. La qualità aumenta quando il bitrate sale, ma dopo un paio di megabyte al secondo, si ottengono rendimenti decrescenti.

    Questa è una cornice ingrandita presa da un video di una medusa. Quello a sinistra è a 3 Mb / s, e quello a destra è 100 Mb / s.

    Un aumento di 30 volte delle dimensioni del file, ma non un notevole aumento della qualità. Generalmente, i video di YouTube si aggirano intorno a 2-10 Mb / s in base alla tua connessione, in quanto probabilmente non si noterà nulla di più.

    Questa demo funziona meglio con il video reale, quindi se vuoi provarlo tu stesso, puoi scaricare gli stessi video di prova del bitrate qui usati.

    Compressione audio

    La compressione audio funziona in modo molto simile alla compressione di testo e immagine. Dove JPEG rimuove i dettagli da un'immagine che non vedrai, la compressione audio fa lo stesso per i suoni. Potrebbe non essere necessario sentire il cigolio del plettro sulla corda se la chitarra reale è molto, molto più forte.

    L'MP3 usa anche il bitrate, che va dalla fascia bassa del 48 e 96 kbps (quella bassa) a 128 e 240kbps (piuttosto buono) a 320kbps (audio high-end), e probabilmente ascolterai solo le cuffie eccezionalmente buone ( e orecchie).

    Esistono anche codec di compressione lossless per l'audio, il principale dei quali è FLAC, che utilizza la codifica LZ77 per fornire audio completamente privo di perdite. Alcune persone giurano per la perfetta qualità audio di FLAC, ma con la prevalenza di MP3, sembra che la maggior parte delle persone non sia in grado di dire o non si preoccupi della differenza.