Como é que a compressão de ficheiros funciona?

    Anthony Heddings

    @anthonyheddings

    br>Agosto 14, 2018, 6:40am EDT

p> engenheiros de software sempre desenvolveram novas formas de encaixar muitos dados num espaço pequeno. Era verdade quando os nossos discos rígidos eram minúsculos, e o advento da Internet acabou de o tornar mais crítico. A compressão de ficheiros desempenha um grande papel na nossa ligação, permitindo-nos enviar menos dados pela linha abaixo para que possamos ter downloads mais rápidos e encaixar mais ligações em redes ocupadas.

Então, como é que funciona?

Para responder a essa pergunta, seria necessário explicar alguma matemática muito complicada, certamente mais do que podemos cobrir neste artigo, mas não é necessário compreender exactamente como funciona matematicamente para compreender o básico.

As bibliotecas mais populares para a compressão de texto dependem de dois algoritmos de compressão, usando ambos ao mesmo tempo para atingir taxas de compressão muito elevadas. Estes dois algoritmos são “LZ77” e “Huffman coding”. A codificação Huffman é bastante complicada, e não vamos entrar em detalhes sobre isso aqui. Em primeiro lugar, utiliza alguma matemática sofisticada para atribuir códigos binários mais curtos a letras individuais, diminuindo o tamanho dos ficheiros no processo. Se quiser saber mais sobre isto, consulte este artigo sobre como o código funciona, ou este explicador por Computerphile.

Publicidade

LZ77, por outro lado, é relativamente simples e é disso que vamos falar aqui. Procura remover palavras duplicadas e substituí-las por uma “chave” mais pequena que representa a palavra.

Toma este pequeno pedaço de texto por exemplo:

O algoritmo LZ77 olharia para este texto, perceberia que repete “howtogeek” três vezes, e mudá-lo-ia para este:

Então, quando quisesse ler o texto de volta, substituiria cada instância de (h) por “howtogeek”, trazendo-nos de volta à frase original.

Chamamos compressão como esta “sem perdas” – os dados que se introduzem são os mesmos que se retiram. Nada se perde.

Publicidade

Na realidade, LZ77 não usa uma lista de chaves, mas em vez disso substitui a segunda e terceira ocorrência por um link de volta à memória:

Assim, agora, quando chegar a (h), olhará para “howtogeek” e lerá isso em vez disso.

Se estiver interessado numa explicação mais detalhada, este vídeo da Computerphile é bastante útil.

Agora, este é um exemplo idealizado. Na realidade, a maior parte do texto é comprimido com teclas tão pequenas como alguns caracteres. Por exemplo, a palavra “o” seria comprimida mesmo quando aparece em palavras como “lá”, “deles”, e “então”. Com texto repetido, é possível obter alguns rácios de compressão malucos. Pegue neste ficheiro de texto com a palavra “howtogeek” repetida 100 vezes. O ficheiro de texto original é de três kilobytes de tamanho. Quando comprimido, porém, ocupa apenas 158 bytes. Isso é quase 95% de compressão.

Anúncio

Agora obviamente, esse é um exemplo bastante extremo, uma vez que acabámos de ter a mesma palavra repetida uma e outra vez. Na prática geral, provavelmente terá cerca de 30-40% de compressão usando um formato de compressão como ZIP num ficheiro que é maioritariamente texto.

Este algoritmo LZ77 aplica-se a todos os dados binários, a propósito, e não apenas texto, embora o texto seja geralmente mais fácil de comprimir devido ao número de palavras repetidas que a maioria das línguas usa. Uma língua como o chinês pode ser um pouco mais difícil de comprimir do que o inglês, por exemplo.

Como funciona a compressão de imagem e vídeo?

Vídeo e compressão de áudio funcionam de forma muito diferente. Ao contrário do texto onde se pode ter compressão sem perdas, e não se perdem dados, com imagens temos o que se chama “Compressão com perdas” onde se perdem alguns dados. E quanto mais comprimimos, mais dados perdemos.

Isto é o que leva àqueles JPEGs de aspecto horrível que as pessoas carregaram, partilharam e captaram várias vezes no ecrã. Cada vez que a imagem é comprimida, perde alguns dados.

Publicidade

Aqui está um exemplo. Este é um screenshot que tirei que não foi de todo comprimido.

P>P>Peguei então nesse screenshot e executei-o no Photoshop várias vezes, exportando-o cada vez como um JPEG de baixa qualidade. Aqui está o resultado.

Parece bastante mau, certo?

p>Bem, este é apenas o pior cenário, exportando com 0% de qualidade JPEG de cada vez. Para comparação, aqui está um JPEG de 50% de qualidade, que é quase indistinguível da imagem PNG de origem, a menos que a rebente e dê uma olhada de perto.

p> O PNG para esta imagem era de 200 KB de tamanho, mas este JPEG de 50% de qualidade é apenas 28 KB.

Anúncio

Então como é que poupa tanto espaço? Bem, o algoritmo JPEG é um feito de engenharia. A maioria das imagens armazenam uma lista de números, com cada número representando um único pixel.

JPEG não faz nada disto. Em vez disso, armazena imagens usando algo chamado Transformada Cosina Discreta, que é uma colecção de ondas sinusoidais somadas a intensidades variáveis. Utiliza 64 equações diferentes, mas a maioria destas não é utilizada. É isto que o selector de qualidade para JPEG no Photoshop e outras aplicações de imagem faz – escolher quantas equações usar. As aplicações usam então a codificação Huffman para reduzir ainda mais o tamanho do ficheiro.

Isto dá aos JPEGs uma taxa de compressão insanamente elevada, o que pode reduzir um ficheiro que seria de vários megabytes para um par de kilobytes, dependendo da qualidade. Claro que, se o utilizarmos demasiado, acabamos com isto:

Essa imagem é horrível. Mas pequenas quantidades de compressão JPEG podem ter um impacto significativo no tamanho do ficheiro, e isto torna o JPEG muito útil para a compressão de imagens em websites. A maioria das imagens que vê online são comprimidas para poupar no tempo de descarga, especialmente para utilizadores móveis com fracas ligações de dados. De facto, todas as imagens em How-To Geek foram comprimidas para tornar o carregamento da página mais rápido, e provavelmente nunca reparou.

Video Compression

Video funciona de forma um pouco diferente das imagens. Seria de pensar que eles apenas comprimiriam cada frame de vídeo usando JPEG, e certamente fazem isso, mas existe um método melhor para vídeo.

Publicidade

Usamos algo chamado “compressão interframe”, que calcula as alterações entre cada frame e apenas as armazena. Assim, por exemplo, se tiver uma imagem relativamente imóvel que ocupa vários segundos num vídeo, muito espaço é guardado porque o algoritmo de compressão não precisa de armazenar todas as coisas na cena que não mudam. A compressão entre quadros é a principal razão pela qual temos televisão digital e vídeo web. Sem ela, os vídeos seriam centenas de gigabytes, mais do que o tamanho médio do disco rígido em 2005 quando o YouTube foi lançado.

Também, uma vez que a compressão inter-quadro funciona melhor com vídeo maioritariamente estacionário, é por isso que os confetti arruínam a qualidade do vídeo.

Nota: GIF não faz isto, e é por isso que os GIF animados são frequentemente muito curtos e pequenos, mas ainda têm um tamanho de ficheiro bastante grande.

Publicidade

Outra coisa a ter em mente em relação ao vídeo é a sua taxa de bits – a quantidade de dados permitida em cada segundo. Se a sua taxa de bits for 200 kb/s, por exemplo, o seu vídeo terá um aspecto bastante mau. A qualidade sobe à medida que a taxa de bits aumenta, mas após um par de megabytes por segundo, obtém rendimentos decrescentes.

Este é um quadro com zoom retirado de um vídeo de uma alforreca. O da esquerda está a 3Mb/s, e o da direita a 100Mb/s.

Um aumento de 30x no tamanho do ficheiro, mas não muito aumento na qualidade. Geralmente, os vídeos do YouTube situam-se em torno dos 2-10Mb/s dependendo da sua ligação, pois qualquer coisa mais provavelmente não seria notada.

Esta demonstração funciona melhor com vídeo real, por isso, se quiser verificar por si próprio, pode descarregar os mesmos vídeos de teste de taxa de bits utilizados aqui.

Compressão de áudio

Compressão de áudio funciona de forma muito semelhante à compressão de texto e imagem. Onde o JPEG remove o detalhe de uma imagem que não se vê, a compressão de áudio faz o mesmo para os sons. Poderá não precisar de ouvir o ranger da guitarra a tocar se a guitarra real for muito, muito mais alta.

Anúncio

MP3 também usa bitrate, variando desde o extremo baixo de 48 e 96 kbps (o extremo baixo) a 128 e 240kbps (muito bom) a 320kbps (áudio de alta qualidade), e provavelmente só ouvirá a diferença com auscultadores (e ouvidos) excepcionalmente bons.

Existem também codecs de compressão sem perdas para áudio – sendo o principal o FLAC – que utiliza a codificação LZ77 para fornecer áudio totalmente sem perdas. Algumas pessoas juram pela qualidade de áudio perfeita do FLAC, mas com a prevalência do MP3, parece que a maioria das pessoas ou não consegue distinguir ou não se importa com a diferença.

Anthony Heddings
Anthony Heddings é o engenheiro nebuloso residente da LifeSavvy Media, um escritor técnico, programador, e um perito na plataforma AWS da Amazon. Escreveu centenas de artigos para How-To Geek e CloudSavvy IT que já foram lidos milhões de vezes. Leia Full Bio ”