«Comprimir esta imagem» são quatro operações distintas disfarçadas de um só botão. Saber qual delas te custa qualidade torna as definições muito menos misteriosas.
Passo um: descodificação
O ficheiro comprimido é convertido outra vez numa grelha de píxeis. Os navegadores fazem-no em código nativo, com aceleração por hardware sempre que a plataforma a oferece, e tratam de JPEG, PNG, WebP e AVIF — mais HEIC nas plataformas da Apple, porque o sistema operativo já traz esse descodificador.
A descodificação é sem perdas em relação ao ficheiro: recebes exatamente os píxeis que o ficheiro descreve. A perda já tinha acontecido antes, quando o que quer que tenha produzido o ficheiro o codificou.
Passo dois: orientação
As câmaras dos telemóveis guardam a orientação em bruto do sensor mais uma etiqueta EXIF separada a dizer como rodá-la. O software que ignora essa etiqueta produz fotografias deitadas de lado. Aplicá-la significa rodar a própria grelha de píxeis antes de mais alguma coisa lhe tocar — e a partir daí a etiqueta deixa de ser necessária, o que é parte da razão pela qual recodificar deita fora os metadados.
Passo três: reamostragem
Se o tamanho alvo não puder ser atingido na resolução original, a imagem é reduzida. É aqui que se ganha ou se perde, em silêncio, boa parte da qualidade percecionada. Um filtro de caixa barato faz a média dos píxeis vizinhos e suaviza tudo; um filtro Lanczos pondera uma vizinhança mais larga e mantém as arestas nítidas.
A reamostragem é genuinamente destrutiva — os píxeis descartados não voltam —, mas é muitas vezes a forma menos destrutiva de chegar a um alvo pequeno, porque retira detalhe que, de outro modo, o codificador gastaria o orçamento inteiro a tentar descrever sem conseguir.
Passo quatro: codificação
A parte com perdas. O JPEG converte a imagem para uma representação de luminosidade mais cor, descarta parte da resolução de cor (o olho quase não dá por isso), divide a imagem em blocos de 8×8, transforma cada um em componentes de frequência e depois quantiza — arredondando até desaparecer o detalhe de alta frequência. O parâmetro de qualidade é a grosseria desse arredondamento. Tudo o que vem a seguir é codificação entrópica sem perdas, e é por isso que uma tabela de Huffman otimizada ou uma varredura progressiva poupam bytes de graça.
Onde entra o WebAssembly
O codificador integrado no navegador é uma caixa preta: podes pedir um número de qualidade e mais nada. Sem tabelas entrópicas otimizadas, sem escolher entre baseline e progressivo, sem controlo sobre o filtro de reamostragem e sem forma de saber quantos bytes uma definição vai produzir sem a experimentar.
Um codec compilado para WebAssembly devolve tudo isso, ao custo dos bytes que gastas a descarregá-lo. O ToolZool corre a cadeia inteira assim — a descodificação, a orientação, a reamostragem e a codificação são todas Rust compilado para WebAssembly, num worker em segundo plano — em vez de entregar a descodificação ao navegador. Por três razões, todas elas práticas:
- A procura precisa de muitas codificações. Chegar a um tamanho exato implica codificar a mesma imagem cinco ou seis vezes. Ser dono do codificador é o que torna isso barato e repetível.
- Um descodificador tem de conseguir dizer que não. Um ficheiro que declara 60 000 × 60 000 píxeis tem de ser recusado antes de alocar memória, e um ficheiro truncado tem de falhar em vez de devolver meia imagem. O descodificador do navegador toma as suas próprias decisões nesse ponto; o nosso declara os limites e impõe-nos.
- A mesma entrada tem de dar a mesma saída. Os descodificadores dos navegadores diferem no tratamento da cor e na forma como lidam com ficheiros malformados. Uma cadeia que é dona das duas pontas produz os mesmos bytes em todos os dispositivos, e é isso que torna um resultado verificável.
O custo é assumido: esse motor é um descarregamento. Só é obtido depois de escolheres um ficheiro, por isso ler uma página como esta nunca o paga.
Porque é que a procura conta mais do que o codec
Dado um tamanho de ficheiro alvo, a diferença entre um bom codificador e um excelente codificador é de uns pontos percentuais. A diferença entre adivinhar num cursor de qualidade e procurar o valor certo é muito maior, porque um palpite que fica nos 60% da tua margem deitou fora um terço da qualidade a que tinhas direito. É essa a ideia por trás de comprimir para um tamanho exato, e ficar abaixo de um limite de 50 KB mostra o que a procura te dá no extremo mais difícil da escala.

