Veja, etapa por etapa, como uma imagem vira menos bytes. O JPEG descarta o que o olho quase não percebe; o PNG reorganiza os bytes para que a compressão sem perdas funcione melhor. Mude a qualidade e acompanhe os números.
O olho humano é muito mais sensível ao brilho (Y, luminância) do que à cor (Cb e Cr, crominância). Com a subamostragem 4:2:0, cada canal de cor fica com metade da largura e metade da altura: ¼ dos dados.
A imagem é dividida em blocos de 8×8 pixels. Subtraímos 128 de cada valor para centralizar em zero. Bloco escolhido: .
A transformada discreta do cosseno reescreve o bloco como a soma de 64 padrões, do liso (canto superior esquerdo, o DC) ao xadrez fino (canto inferior direito). Ela não perde nada: só muda a forma de representar. Repare que a energia se concentra no canto superior esquerdo.
Cada coeficiente é dividido pelo valor da tabela de quantização e arredondado. As altas frequências têm divisores maiores, então viram zero. A tabela é a da norma (ITU-T T.81, anexo K) escalada pela qualidade escolhida.
Lendo em zigue-zague, os zeros se acumulam no fim. A codificação por comprimento de sequência (RLE) guarda pares (zeros antes, tamanho em bits) seguidos do valor, e um EOB (fim de bloco) substitui todos os zeros finais.
Os símbolos do RLE são codificados com Huffman: símbolos frequentes recebem códigos curtos. Shannon mostrou que o mínimo médio é a entropia H = −Σ p·log₂p; usamos esse limite para estimar o tamanho. Na volta, o decodificador multiplica por Q e aplica a DCT inversa.
Antes de comprimir, o PNG troca cada byte pela diferença em relação a uma previsão feita com os vizinhos já lidos: a (esquerda), b (acima) e c (diagonal). Em regiões suaves a diferença é quase zero, e muitos bytes repetidos comprimem melhor. Nada se perde: o decodificador refaz a mesma previsão e soma a diferença.
Os bytes filtrados passam pelo DEFLATE, o mesmo algoritmo do ZIP. A tabela usa o compressor real do seu navegador. Compare a entropia (bits por byte) com o tamanho final: quanto menor a entropia, menor o arquivo.
O LZ77 troca trechos repetidos por uma referência <distância, comprimento> a algo que já apareceu. Edite o texto e veja as referências.