Pular para o conteúdo
Imagens e mídia

Impeça o WordPress de Comprimir Suas Imagens em 82%

O WordPress recodifica todo JPEG que gera com qualidade 82 numa escala de 0 a 100. Esse padrão vive em WP_Image_Editor::get_default_quality() e se aplica a

Publicado

O WordPress recodifica todo JPEG que gera com qualidade 82 numa escala de 0 a 100. Esse padrão vive em WP_Image_Editor::get_default_quality() e se aplica a cada derivada que o WordPress corta a partir do seu upload — thumbnail, medium, medium_large, large e todos os tamanhos extras que seu tema registra. Para fotografias, 82 é um equilíbrio sensato entre tamanho de arquivo e artefatos. Para capturas de tela, prints de interface, gráficos, logos e qualquer coisa com texto nítido ou cor chapada, 82 é visivelmente destrutivo: você acaba com aquele ruído de mosquito rastejando ao redor de cada letra e faixas (banding) atravessando gradientes suaves.

Para mudar isso, adicione um filtro e regere suas miniaturas. Para resolver o problema das capturas de tela especificamente, a melhor resposta costuma ser parar de entregar um JPEG ao WordPress logo de cara.

De onde o número 82 realmente vem

O WordPress baixou seu padrão de JPEG de 90 para 82 lá na versão 4.5 (2016) como otimização de peso de página. O valor é retornado por get_default_quality() em wp-includes/class-wp-image-editor.php e é lido sempre que o editor ativo — WP_Image_Editor_Imagick se sua hospedagem tiver Imagick, caso contrário WP_Image_Editor_GD — grava um arquivo redimensionado.

O detalhe importante: 82 é aplicado por tamanho derivado, não uma única vez. Faça upload de uma imagem, e o WordPress a passa pelo codificador várias vezes, requantizando com qualidade 82 a cada passagem. O arquivo originalmente enviado em si fica intocado se estiver abaixo do limite de imagem grande (2560px na maior dimensão). Se ultrapassar esse limite, o WordPress produz um -scaled.jpg recodificado com qualidade 82 e serve esse como o tamanho “full”. Então “minha imagem em resolução total parece boa, mas a versão na página parece borrada” quase sempre é um srcset escolhendo um subtamanho de qualidade 82 ou o arquivo -scaled.

Como mudar a qualidade

Há um filtro para conectar. wp_editor_set_quality é o moderno e canônico — ele dispara para JPEG e WebP e recebe o tipo MIME para você poder ramificar:

add_filter( 'wp_editor_set_quality', function ( $quality, $mime_type ) {
    if ( 'image/jpeg' === $mime_type ) {
        return 92; // up from 82
    }
    return $quality;
}, 10, 2 );

Coloque isso num pequeno mu-plugin (wp-content/mu-plugins/) ou num plugin específico do site. functions.php também funciona, mas você perde a configuração no instante em que troca de tema.

Você também vai ver o antigo filtro jpeg_quality sendo recomendado. Ele ainda dispara (o WordPress o aplica logo após o wp_editor_set_quality, só para JPEG), mas não há motivo para conectar os dois — wp_editor_set_quality cobre tudo o que o antigo fazia e mais.

Uma coisa que todo mundo esquece: este filtro só afeta imagens codificadas depois que ele está ativo. Cada miniatura que já está em wp-content/uploads foi gravada com 82 e vai continuar com 82. Regere-as:

wp media regenerate --yes

Se você não usa WP-CLI, o plugin Regenerate Thumbnails faz a mesma coisa pelo painel administrativo.

Antes de decidir por um número, vale a pena ver o que uma dada qualidade realmente faz com a sua imagem em vez de chutar. Nossa ferramenta de qualidade JPEG do WordPress recodifica uma amostra no navegador em cada nível de qualidade para você acompanhar os artefatos aparecerem — ela deixa a diferença entre 82, 90 e 100 óbvia numa captura de tela de um jeito que um número num arquivo de configuração nunca vai deixar.

A solução melhor para capturas de tela e gráficos chapados

Aumentar o número do JPEG trata o sintoma. O problema real com capturas de tela é que JPEG é o codec errado para elas. A compressão DCT do JPEG é ajustada para gradientes fotográficos; ela desmorona nas bordas duras de preto sobre branco de texto e elementos de interface, que é exatamente por que a qualidade 82 fica tão pior numa captura de tela do que numa foto de uma praia.

Faça upload de um PNG em vez disso. O WordPress mantém os subtamanhos de PNG como PNG, e PNG é sem perdas (lossless) — o filtro de qualidade não o toca, então não há artefatos em nenhum tamanho, apenas reamostragem limpa. Para uma captura de tela, um PNG bem otimizado costuma ser menor que um JPEG de alta qualidade da mesma imagem de qualquer forma, porque cor chapada comprime bem em PNG e péssimo em JPEG.

Se você quer os arquivos menores de um formato com perdas sem o dano nas bordas do JPEG, o WebP é o meio-termo — mas você ainda controla a qualidade dele pelo mesmo filtro wp_editor_set_quality mostrado acima, ramificando em image/webp.

O que não fazer

Não defina a qualidade para 100 globalmente. Essa é a resposta mais votada em metade das threads de fórum, e está errada. JPEG com qualidade 100 não é sem perdas — ele ainda quantiza — mas infla toda fotografia do seu site por uma margem enorme sem ganho visível, arrastando para baixo o LCP e os Core Web Vitals. Aumente o número para o formato que precisa, ou mude o formato para gráficos; não detone a compressão do site inteiro.

Não edite class-wp-image-editor.php. Mudar o valor de retorno de get_default_quality() no core funciona até o próximo wp core update sobrescrever silenciosamente. Use o filtro.

Não desative os tamanhos de imagem para “evitar a compressão”. Desligar a geração de miniaturas não impede a recodificação — ela quebra o srcset responsivo, então os navegadores baixam sua imagem em tamanho total nos celulares. Problema diferente, resultado pior.

Não presuma que refazer o upload conserta as imagens existentes. Se você definir o filtro mas pular a etapa de regenerar, cada derivada antiga continua com qualidade 82. O filtro só olha para frente.

Não culpe o arquivo -scaled se suas imagens estão abaixo de 2560px — esse caminho nunca roda para elas. Se você está caindo nele e quer que o original intocado seja servido, isso é uma configuração à parte; veja como desativar imagens scaled.

Ainda travado?

Se um tamanho específico ainda parece errado depois de regenerar, confirme qual arquivo a página está de fato servindo — abra a imagem numa nova aba e veja se o nome do arquivo termina com um sufixo de dimensão (-1024x768.jpg) ou -scaled.jpg. O inspetor de tamanhos de imagem mostra cada derivada que o WordPress gera a partir de um upload, para você ver exatamente qual tamanho seu srcset está entregando ao navegador e parar de depurar o arquivo errado.