O que acontece quando se comprime uma imagem?
Existem dois tipos de compressão, lossy e lossless.
Lossy significa que a informação é jogada fora, perdida para sempre, e que você nunca pode recuperar a imagem original exatamente.
Lossless significa que nada é jogado fora, e você pode descompactar a imagem e recuperar cada pedaço de informação.
Existem muitos algoritmos para compressão de imagens, mas o que todos eles fazem é olhar através da imagem para ver onde a repetição ocorre ou onde dados mais simples podem ficar para estruturas maiores.
Um método comum de compressão é o run-length-encoding (RLE).
Imagine que você tem uma imagem como esta:
Na memória do computador, ele está armazenando os valores vermelho, verde, azul e alfa para cada pixel. Isso é 4 bytes por pixel. A imagem tem 621 pixels de largura, e 414 pixels de altura. Portanto, precisa de 621*414*4 bytes para ser armazenada. Isso é cerca de 1 megabyte!
Mas olhe para todos aqueles pixels que são os mesmos. Se você olhar apenas para a primeira linha, é branco, branco, branco, branco... e assim por diante. Na verdade, são precisamente 621 pixels opacos brancos idênticos uns ao lado dos outros. Não seria muito mais eficiente apenas dizer "621,branco" para a fila inteira? Ao descomprimir, o computador pode ler o primeiro valor e fazer tantas cópias dos quatro valores seguintes. Se o valor 621 precisa de dois bytes, então no total podemos representar a primeira linha com 6 bytes, em vez de 2484 que seriam necessários se armazenássemos tudo. Isso é um salvamento incrível!
Linhas no meio da imagem podem ter algo como 96 branco,31 azul,42 branco,25 azul,14 vermelho... e assim por diante. Ainda é melhor que armazenar cada pixel.
O claro, na realidade, é mais complexo do que eu tenho retratado, mas essa é a ideia geral. Em disco, o arquivo PNG desse logotipo é de cerca de 23 kilobytes. Isso foi esmagado para pouco mais de 2% do tamanho original. Muito legal!
Embora um sistema de compressão tão simplista funcione bem para coisas como logotipos, que têm amplas áreas de cor plana, ele não funciona bem para imagens reais que têm muita variação de pequena escala de um pixel para o outro. Nesse caso, existem tipos de arquivo como JPEG, que divide a imagem em pequenos blocos, e vê se ele pode representar esse bloco por algum tipo de gradiente ou função matemática.