Los ingenieros de software siempre han desarrollado nuevas formas de encajar una gran cantidad de datos en un espacio pequeño. Esto era cierto cuando nuestros discos duros eran pequeños y la llegada de Internet lo hizo más crítico. La compresión de archivos juega un papel importante en nuestra conexión, lo que nos permite enviar menos datos a lo largo de la línea para que podamos tener descargas más rápidas y ajustar más conexiones en redes ocupadas.
¿Entonces, cómo funciona?
Responder a esta pregunta implicaría explicar algunas matemáticas muy complicadas, ciertamente más de lo que podemos cubrir en este artículo, pero no es necesario comprender con precisión cómo funciona matemáticamente para comprender los conceptos básicos.
Las bibliotecas más populares para la compresión de texto se basan en dos algoritmos de compresión, que utilizan ambos al mismo tiempo para lograr tasas de compresión muy altas. Estos dos algoritmos son «LZ77» y «codificación Huffman». La codificación de Huffman es bastante complicada, y no entraremos en detalles sobre eso aquí. Principalmente, utiliza matemáticas sofisticadas para asignar códigos binarios más cortos a letras individuales, reduciendo así el tamaño de los archivos. Si quieres saber más, echa un vistazo Este artículo sobre cómo funciona el código, o esto explicativo de Computerphile.
LZ77, por otro lado, es relativamente sencillo y de eso vamos a hablar aquí. Busca eliminar palabras duplicadas y reemplazarlas con una «clave» más pequeña que representa la palabra.
Tomemos, por ejemplo, este breve texto:
El algoritmo LZ77 examinaría este texto, encontraría que repite «howtogeek» tres veces y lo cambiaría a esto:
Luego, cuando quiera volver a leer el texto, reemplazará cada instancia de (h) con «howtogeek», devolviéndonos a la oración original.
A una compresión como esta la llamamos «sin pérdidas»: los datos que ingresa son los mismos que los que obtiene. No se pierde nada.
En realidad, LZ77 no usa una lista de claves, sino que reemplaza la segunda y tercera ocurrencia con un vínculo de retroceso en la memoria:
Así que ahora, cuando llegue a (h), volverá a «howtogeek» y lo leerá en su lugar.
Si está interesado en una explicación más detallada, este video de Computerphile es bastante útil.
Ahora bien, este es un ejemplo idealizado. En realidad, la mayoría de los textos están comprimidos con claves de tan solo unos pocos caracteres. Por ejemplo, la palabra «el» se comprimirá incluso cuando aparezca en palabras como «allí», «su» y «entonces». Con texto repetido puede obtener tasas de compresión increíbles. Tome este archivo de texto con la palabra «howtogeek» repetida 100 veces. El archivo de texto original tiene un tamaño de tres kilobytes. Sin embargo, cuando se comprime, solo ocupa 158 bytes. Es casi un 95% de compresión.
Ahora, obviamente, este es un ejemplo bastante extremo, ya que simplemente repetimos la misma palabra una y otra vez. En la práctica general, probablemente obtendrá alrededor del 30-40% de compresión usando un formato de compresión como ZIP en un archivo que es principalmente texto.
Por cierto, este algoritmo LZ77 se aplica a todos los datos binarios, no solo al texto, aunque el texto generalmente es más fácil de comprimir debido a la cantidad de palabras repetidas que utilizan la mayoría de los idiomas. Un idioma como el chino puede ser un poco más difícil de comprimir que el inglés, por ejemplo.
¿Cómo funciona la compresión de imágenes y videos?
La compresión de video y audio funcionan de manera muy diferente. A diferencia del texto donde puede tener una compresión sin pérdida y no se pierden datos, con las imágenes tenemos lo que se llama «compresión con pérdida» donde se pierden datos. Y cuanto más comprime, más datos pierde.
Esto es lo que lleva a esas horribles imágenes JPEG que la gente ha subido, compartido y capturado una y otra vez. Cada vez que se comprime la imagen, pierde datos.
Aquí un ejemplo. Esta es una captura de pantalla que tomé y que no estaba comprimida en absoluto.
Luego tomé esta captura de pantalla y la ejecuté varias veces en Photoshop, exportándola como JPEG de baja calidad cada vez. Aquí está el resultado.
Suena bien, ¿no?
Bueno, este es solo el peor de los casos, exportando cada vez con una calidad jpeg del 0%. A modo de comparación, aquí hay un JPEG de 50% de calidad, que es casi indistinguible de la imagen PNG de origen a menos que lo amplíe y lo observe de cerca.
El PNG de esta imagen era de 200 KB, pero este JPEG de 50% de calidad tiene solo 28 KB.
Entonces, ¿cómo ahorra tanto espacio? Bueno, el algoritmo JPEG es una hazaña de ingeniería. La mayoría de las imágenes almacenan una lista de números, cada número representa un solo píxel.
JPEG no hace ninguna de estas cosas. En cambio, almacena imágenes usando algo llamado Transformada de coseno discreta, que es una colección de ondas sinusoidales sumadas a diferentes intensidades. Utiliza 64 ecuaciones diferentes, pero la mayoría de ellas no se utilizan. Esto es lo que hace el control deslizante Calidad para JPEG en Photoshop y otras aplicaciones de imágenes: elija el número de ecuaciones que se utilizarán. Luego, las aplicaciones usan la codificación Huffman para reducir aún más el tamaño del archivo.
Esto le da a los archivos JPEG una tasa de compresión increíblemente alta, que puede reducir un archivo de varios megabytes a unos pocos kilobytes, dependiendo de la calidad. Por supuesto, si lo usas demasiado obtienes esto:
Esta imagen es horrible. Pero pequeñas cantidades de compresión JPEG pueden tener un impacto significativo en el tamaño del archivo, lo que hace que JPEG sea muy útil para comprimir imágenes en sitios web. La mayoría de las imágenes que ve en línea están comprimidas para ahorrar tiempo de descarga, especialmente para usuarios móviles con conexiones de datos deficientes. De hecho, todas las imágenes de How-To Geek se han comprimido para que las páginas se carguen más rápido, y probablemente nunca te hayas dado cuenta.
Compresión de video
El video funciona de manera un poco diferente a las imágenes. Uno pensaría que simplemente comprimirían cada fotograma del video usando JPEG, y seguro que lo hacen, pero hay un método mejor para el video.
Usamos algo llamado «compresión entre cuadros», que calcula los cambios entre cada cuadro y almacena solo esos. Entonces, por ejemplo, si tiene una toma relativamente fija que toma varios segundos en un video, se ahorra mucho espacio porque el algoritmo de compresión no necesita almacenar todos los elementos en la escena que no cambian. La compresión entre cuadros es la razón principal por la que tenemos televisión digital y video web. Sin él, los videos serían cientos de gigabytes, más que el tamaño promedio del disco duro en 2005 cuando se lanzó YouTube.
Además, dado que la compresión entre cuadros funciona mejor con la mayoría de los videos fijos, es por eso que confeti arruina la calidad del video.
Nota: GIF no hace esto, por lo que los GIF animados suelen ser muy cortos y pequeños, pero aún así tienen un tamaño de archivo bastante grande.
Otra cosa a tener en cuenta sobre el video es su tasa de bits, la cantidad de datos permitidos por segundo. Si su tasa de bits es de 200 kbps, por ejemplo, su video será bastante malo. La calidad aumenta a medida que aumenta el rendimiento, pero después de unos pocos megabytes por segundo, obtiene rendimientos decrecientes.
Esta es una imagen ampliada tomada de un video de una medusa. El de la izquierda está a 3 Mb / s y el de la derecha a 100 Mb / s.
Un aumento de 30 veces en el tamaño del archivo, pero no mucho aumento en la calidad. Por lo general, los videos de YouTube tienen alrededor de 2 a 10 MB / s, dependiendo de su conexión, ya que probablemente no se notará nada más.
Esta demostración funciona mejor con el video real, por lo que si desea verlo usted mismo, puede descargar el mismo. videos de prueba de flujo utilizado aquí.
Compresión de audio
La compresión de audio funciona de manera muy similar a la compresión de texto e imágenes. Cuando JPEG elimina detalles de una imagen que no verá, la compresión de audio hace lo mismo con los sonidos. Es posible que no necesite escuchar el crujido de la púa en la cuerda si la guitarra real es mucho, mucho más fuerte.
MP3 también usa una tasa de bits, que va desde el extremo bajo de 48 y 96 kbps (el extremo bajo) hasta 128 y 240 kbps (bastante bueno) hasta 320 kbps (audio de alto nivel), y probablemente no escuche la diferencia. sólo con auriculares (y oídos) excepcionalmente buenos.
También hay códecs de compresión sin pérdidas para audio, el principal es FLAC, que utiliza la codificación LZ77 para proporcionar audio sin pérdidas. Algunas personas confían en la calidad de audio perfecta de FLAC, pero con la prevalencia de MP3, parece que la mayoría de las personas no pueden notar la diferencia o no les importa.