Capa do Ebook gratuito Performance Front-End: Otimizando Core Web Vitals sem Mistério

Performance Front-End: Otimizando Core Web Vitals sem Mistério

Novo curso

19 páginas

Imagens eficientes: formatos modernos, dimensionamento e compressão orientada a qualidade

Capítulo 6

Tempo estimado de leitura: 14 minutos

+ Exercício

Por que imagens ainda são um dos maiores custos de performance

Em páginas reais, imagens frequentemente representam a maior parte do peso transferido e também influenciam diretamente o tempo de renderização do conteúdo. Mesmo quando você já tem um bom HTML/CSS e JavaScript sob controle, imagens mal escolhidas (formato antigo, dimensões erradas, compressão agressiva ou inexistente) podem aumentar o tempo de download, atrasar a decodificação e elevar o uso de memória. O resultado costuma aparecer como carregamento “pesado”, rolagem menos fluida em dispositivos modestos e, em alguns casos, instabilidade visual quando dimensões não são reservadas corretamente.

O objetivo aqui é tornar imagens “eficientes”: entregar o menor número de bytes possível, com qualidade visual adequada, no tamanho correto para cada contexto e dispositivo, usando formatos modernos e um pipeline de compressão orientado a qualidade (não apenas “reduzir KB a qualquer custo”).

Conceitos essenciais: formato, dimensão, compressão e qualidade percebida

Formato: como os bytes são representados

O formato define como a imagem é codificada. Formatos modernos conseguem manter qualidade semelhante com menos bytes, além de oferecer recursos como transparência e animação de forma mais eficiente. Em termos práticos, a escolha do formato é uma das alavancas mais fortes para reduzir peso sem perder qualidade.

  • JPEG: bom para fotos, mas menos eficiente que formatos modernos; não suporta transparência; compressão com perdas.
  • PNG: bom para gráficos com poucas cores e transparência; geralmente pesado para fotos; compressão sem perdas.
  • WebP: bom “coringa” moderno; suporta transparência e animação; costuma ser menor que JPEG/PNG.
  • AVIF: excelente compressão para fotos e imagens complexas; frequentemente menor que WebP; pode ser mais pesado para codificar/decodificar em alguns cenários.
  • SVG: ideal para ícones e ilustrações vetoriais; escalável; pode ficar pesado se o SVG for complexo ou mal otimizado.

Dimensionamento: entregar a imagem no tamanho em que ela é exibida

Um erro comum é servir uma imagem de 2400px de largura para um componente que exibe 600px. Mesmo que o navegador redimensione visualmente, você ainda pagou o custo de baixar e decodificar uma imagem maior. Dimensionamento eficiente significa gerar variantes (múltiplas larguras) e deixar o navegador escolher a melhor para cada viewport e densidade de pixels.

Compressão orientada a qualidade: reduzir bytes preservando o que o usuário percebe

Compressão com perdas (JPEG/WebP/AVIF) permite reduzir bastante o peso, mas existe um ponto em que artefatos ficam visíveis. A abordagem orientada a qualidade busca um equilíbrio: manter nitidez e detalhes onde importam (rostos, texto em imagem, produtos) e aceitar pequenas perdas em áreas menos sensíveis (fundos, gradientes suaves) para economizar bytes.

Continue em nosso aplicativo

Você poderá ouvir o audiobook com a tela desligada, ganhar gratuitamente o certificado deste curso e ainda ter acesso a outros 5.000 cursos online gratuitos.

ou continue lendo abaixo...
Download App

Baixar o aplicativo

Dois conceitos ajudam a pensar nisso:

  • Qualidade (Q): parâmetro de compressão (ex.: 60, 70, 80). Nem sempre “80” em um formato equivale visualmente a “80” em outro.
  • Qualidade percebida: o usuário nota mais borrões em bordas e texto do que em ruído leve em áreas homogêneas. Ajustar compressão com base em inspeção visual e métricas de qualidade (quando possível) é mais confiável do que escolher um número fixo.

Formatos modernos na prática: quando usar AVIF, WebP, JPEG, PNG e SVG

Fotos e imagens ricas (produtos, pessoas, cenários)

Priorize AVIF quando houver suporte e quando o ganho de tamanho for relevante. Em muitos casos, AVIF reduz significativamente o peso mantendo boa qualidade. Use WebP como fallback moderno e JPEG como fallback universal.

Regra prática: se você está servindo JPEG hoje, quase sempre há ganho em migrar para AVIF/WebP, desde que você mantenha fallback e teste qualidade visual.

Imagens com transparência

Se precisa de transparência, evite PNG para fotos e composições complexas quando possível. Prefira WebP ou AVIF com alpha. Para gráficos simples (poucas cores, bordas duras), PNG ainda pode ser aceitável, mas compare o tamanho com WebP/AVIF.

Ícones e ilustrações

Use SVG para ícones e ilustrações vetoriais. Ele escala bem e pode ser muito leve. Otimize o SVG removendo metadados e atributos desnecessários. Se a ilustração for muito complexa (muitos pontos, filtros, sombras), um raster (WebP/AVIF) pode acabar menor e mais rápido de renderizar.

Evite “formato único para tudo”

Um pipeline eficiente normalmente produz: AVIF e WebP para a maioria das imagens raster, JPEG como fallback, PNG apenas quando realmente necessário, SVG para vetores. Essa combinação cobre qualidade, compatibilidade e tamanho.

Dimensionamento responsivo: srcset, sizes e densidade de pixels

Para evitar baixar imagens maiores do que o necessário, você deve fornecer variantes. O navegador escolhe a melhor com base no layout (largura real de exibição) e na densidade de pixels do dispositivo.

Abordagem recomendada: descritores de largura (w)

Você gera arquivos em larguras diferentes (por exemplo: 320, 480, 640, 800, 1024, 1280, 1600). Depois usa srcset com descritores w e define sizes para informar ao navegador qual será a largura aproximada da imagem no layout.

<img> <!-- exemplo didático -->
<img src="/img/produto-800.jpg" alt="Tênis modelo X" width="800" height="600" loading="lazy" decoding="async" srcset="/img/produto-320.jpg 320w, /img/produto-480.jpg 480w, /img/produto-640.jpg 640w, /img/produto-800.jpg 800w, /img/produto-1024.jpg 1024w, /img/produto-1280.jpg 1280w" sizes="(max-width: 600px) 92vw, (max-width: 1024px) 50vw, 600px">

Como ler o exemplo:

  • srcset lista as variantes e suas larguras reais.
  • sizes descreve quanto espaço a imagem ocupa no layout em diferentes breakpoints. Ex.: em telas até 600px, a imagem ocupa ~92% da largura da viewport; até 1024px, ~50%; acima disso, 600px.
  • O navegador combina sizes + densidade do dispositivo para escolher a variante mais adequada.

Quando usar descritores de densidade (x)

Descritores 1x, 2x, 3x funcionam bem quando a imagem sempre é exibida com tamanho fixo (por exemplo, um avatar de 48px). Para layouts fluidos, w + sizes costuma ser mais eficiente.

<img src="/img/avatar-48.jpg" alt="Foto do usuário" width="48" height="48" srcset="/img/avatar-48.jpg 1x, /img/avatar-96.jpg 2x">

Reserve espaço: width/height e estabilidade visual

Mesmo que o foco aqui seja eficiência de bytes, dimensionamento também envolve reservar espaço para evitar mudanças de layout. Defina width e height (ou use CSS com aspect-ratio) para que o navegador calcule a proporção antes de a imagem carregar.

<img src="/img/banner-800.webp" alt="Banner" width="1200" height="500" style="max-width:100%; height:auto;">

Mesmo que a imagem seja responsiva, os atributos ajudam a manter a proporção correta e evitam “pulos” na página.

Servindo formatos modernos com fallback: picture e type

Para entregar AVIF/WebP quando suportado e cair para JPEG/PNG quando não, use <picture> com <source type>. Isso permite que o navegador escolha o primeiro formato que ele entende.

<picture> <source type="image/avif" srcset="/img/produto-640.avif 640w, /img/produto-1024.avif 1024w" sizes="(max-width: 600px) 92vw, 600px"> <source type="image/webp" srcset="/img/produto-640.webp 640w, /img/produto-1024.webp 1024w" sizes="(max-width: 600px) 92vw, 600px"> <img src="/img/produto-1024.jpg" alt="Tênis modelo X" width="1024" height="768" loading="lazy" decoding="async"> </picture>

Dica prática: mantenha o img final como fallback universal e inclua width/height. Se você já usa srcset no img, pode manter também, mas evite duplicar lógica desnecessária; o mais comum é colocar srcset nos source e deixar o img com um arquivo “seguro”.

Compressão orientada a qualidade: como escolher parâmetros sem “chutar”

O que costuma dar errado

  • Qualidade alta demais: arquivos grandes com ganho visual mínimo.
  • Qualidade baixa demais: halos, blocos, banding em gradientes, perda de nitidez em detalhes importantes.
  • Aplicar o mesmo Q para tudo: fotos, prints, imagens com texto e ilustrações têm sensibilidades diferentes.

Heurísticas práticas por tipo de imagem

  • Fotos: AVIF/WebP com qualidade moderada geralmente mantém boa aparência com grande redução de bytes. Comece testando uma faixa intermediária e ajuste por inspeção visual em 100% de zoom em áreas críticas (rostos, texturas, logos).
  • Imagens com texto embutido (ex.: banners com tipografia dentro da imagem): use qualidade mais alta ou considere não rasterizar texto (prefira HTML/CSS). Se precisar ser imagem, teste cuidadosamente para evitar borrões.
  • Gráficos simples: tente SVG; se raster, WebP lossless ou PNG otimizado pode ser melhor que JPEG.

Passo a passo: definindo um “padrão de qualidade” para o projeto

Um processo simples e repetível evita decisões arbitrárias:

  • 1) Separe um conjunto de amostras: escolha 10 a 20 imagens representativas (fotos claras, escuras, com detalhes, com gradientes, com texto).
  • 2) Gere versões em AVIF e WebP: use pelo menos 2 ou 3 níveis de qualidade por formato (ex.: baixa, média, alta).
  • 3) Compare visualmente: abra lado a lado e avalie em 100% de zoom e também no tamanho real de exibição no site.
  • 4) Compare tamanho em KB: registre o ganho percentual.
  • 5) Defina padrões: por exemplo, “fotos: AVIF qualidade média; fallback WebP qualidade média; JPEG apenas para fallback”.
  • 6) Crie exceções documentadas: imagens com texto, screenshots e logos podem ter regras próprias.

Esse passo a passo cria consistência e evita retrabalho, porque você passa a ter um “contrato” de qualidade para o time.

Pipeline prático: gerando variantes e comprimindo com ferramentas comuns

Você pode implementar um pipeline local (scripts) ou no build/CI. A ideia é automatizar: redimensionar, converter formatos e aplicar compressão com parâmetros padronizados.

Passo a passo com ImageMagick (redimensionar e exportar)

O ImageMagick é útil para redimensionar e preparar imagens antes de codificar em AVIF/WebP com ferramentas específicas. Exemplo: gerar variantes em JPEG (como base) em múltiplas larguras mantendo proporção.

# gera variantes em larguras específicas (exemplo: 320, 640, 1024) a partir de um original grande
magick input.jpg -resize 320x -strip output-320.jpg magick input.jpg -resize 640x -strip output-640.jpg magick input.jpg -resize 1024x -strip output-1024.jpg

Notas:

  • -strip remove metadados (EXIF, etc.) que muitas vezes não são necessários e aumentam o tamanho.
  • Use originais de boa qualidade para evitar “compressão em cascata” (recomprimir várias vezes piora artefatos).

Passo a passo com cwebp (WebP)

# qualidade com perdas (ajuste o -q conforme seu padrão) cwebp -q 75 output-1024.jpg -o output-1024.webp
# WebP lossless (útil para alguns gráficos) cwebp -lossless output-1024.png -o output-1024.webp

Passo a passo com avifenc (AVIF)

# AVIF com qualidade controlada (parâmetros variam por encoder; use como base e ajuste) avifenc -q 35 output-1024.jpg output-1024.avif

Em AVIF, o “q” não é diretamente comparável ao “q” do WebP/JPEG. Por isso, o processo de amostras e comparação visual é importante para calibrar.

Otimizando PNG e SVG quando necessário

  • PNG: use ferramentas de otimização para reduzir tamanho sem mudar pixels (ou com perdas controladas, dependendo da ferramenta). O objetivo é remover redundâncias e melhorar compressão.
  • SVG: remova metadados, comentários, IDs desnecessários e simplifique paths quando possível. SVGs podem ficar enormes se exportados direto de ferramentas de design sem limpeza.

Lazy loading, prioridade e decodificação: garantindo que bytes cheguem quando importam

Imagens eficientes não são só “menor arquivo”; é também carregar no momento certo. Para imagens fora da área inicial, use loading="lazy". Para imagens importantes (como a principal de um card acima da dobra), evite lazy e considere sinalizar prioridade.

Lazy loading com cuidado

loading="lazy" é simples e efetivo para listas longas, galerias e conteúdo abaixo da dobra. Mas não aplique indiscriminadamente em imagens que precisam aparecer imediatamente, pois isso pode atrasar a renderização perceptível.

<img src="/img/galeria-800.webp" alt="Foto da galeria" width="800" height="600" loading="lazy" decoding="async">

Decoding async

decoding="async" sugere ao navegador que ele pode decodificar a imagem de forma assíncrona, ajudando a reduzir bloqueios na thread principal em alguns cenários. Não é uma garantia, mas é uma dica útil e de baixo risco.

Fetchpriority (quando suportado)

Para imagens críticas, você pode usar fetchpriority para indicar maior prioridade de download. Use com parcimônia; aumentar prioridade de muitas imagens pode piorar a competição por rede.

<img src="/img/hero-1280.avif" alt="Produto em destaque" width="1280" height="720" fetchpriority="high" decoding="async">

Checklist prático: como auditar e corrigir imagens de uma página

1) Identifique imagens superdimensionadas

Procure casos em que a imagem baixada é muito maior do que a área de exibição. Um sinal típico é ver arquivos com largura 2000px sendo exibidos em 400–600px. A correção é gerar variantes e usar srcset/sizes.

2) Verifique formato e transparência

Se houver muitos PNGs fotográficos, é um candidato forte para migração para WebP/AVIF. Se houver JPEGs com necessidade de transparência (normalmente resolvido com fundo “falso”), considere WebP/AVIF com alpha.

3) Ajuste compressão com base em amostras

Escolha um padrão de qualidade por tipo de imagem e aplique no pipeline. Evite “otimizar manualmente” imagem por imagem sem critério; isso não escala.

4) Garanta dimensões reservadas

Confirme que width/height (ou aspect-ratio) estão presentes. Além de estabilidade visual, isso ajuda o navegador a planejar layout e pintura.

5) Aplique lazy loading onde faz sentido

Imagens em carrosséis longos, rodapé, seções abaixo da dobra e listas extensas devem ser lazy. Imagens imediatamente visíveis não devem ser lazy por padrão.

Exemplo completo: card de produto responsivo com AVIF/WebP e tamanhos corretos

Este exemplo reúne formato moderno, fallback, dimensionamento responsivo e reserva de espaço.

<article class="card"> <picture> <source type="image/avif" srcset="/img/tenis-320.avif 320w, /img/tenis-480.avif 480w, /img/tenis-640.avif 640w, /img/tenis-800.avif 800w" sizes="(max-width: 600px) 90vw, (max-width: 1024px) 33vw, 320px"> <source type="image/webp" srcset="/img/tenis-320.webp 320w, /img/tenis-480.webp 480w, /img/tenis-640.webp 640w, /img/tenis-800.webp 800w" sizes="(max-width: 600px) 90vw, (max-width: 1024px) 33vw, 320px"> <img src="/img/tenis-800.jpg" alt="Tênis modelo X, cor preta" width="800" height="800" decoding="async" loading="lazy"> </picture> <h3>Tênis modelo X</h3> <p>Leve, respirável e ideal para corrida.</p> </article>

Observe que o width/height do img define a proporção (quadrada). O CSS pode limitar o tamanho final, mas o navegador já sabe o espaço necessário antes do download terminar. O sizes reflete o layout: em mobile ocupa quase a tela toda; em tablet ~1/3; em desktop fixa em 320px.

Armadilhas comuns e como evitar

Recomprimir imagens já comprimidas

Evite pegar um JPEG já otimizado e recomprimir repetidamente em múltiplos passos. Prefira manter um original “fonte” (por exemplo, PNG sem perdas ou JPEG de alta qualidade) e gerar todas as variantes a partir dele em um único pipeline.

Usar qualidade máxima “por segurança”

Qualidade muito alta costuma desperdiçar bytes sem ganho perceptível. A segurança vem de um processo de amostras e revisão visual, não de “Q=95”.

Ignorar o custo de imagens pequenas em grande quantidade

Mesmo thumbnails podem somar muito em páginas com listas. Para esses casos, variantes menores e compressão agressiva (mas aceitável) fazem grande diferença. Também vale revisar se todas as imagens precisam carregar imediatamente ou se podem ser lazy.

SVGs gigantes e pesados

SVG não é automaticamente leve. Um SVG exportado sem otimização pode ser maior que um WebP equivalente. Sempre otimize SVGs e avalie custo de renderização se houver filtros e paths complexos.

Agora responda o exercício sobre o conteúdo:

Em um layout responsivo, qual abordagem reduz a chance de baixar imagens maiores do que o necessário em diferentes larguras de tela?

Você acertou! Parabéns, agora siga para a próxima página

Você errou! Tente novamente.

Variantes com srcset (w) e sizes permitem que o navegador selecione a imagem mais adequada ao espaço real no layout e à densidade de pixels, evitando download e decodificação de arquivos superdimensionados.

Próximo capitúlo

Carregamento de imagens: lazy loading, preload seletivo e prioridade de recursos

Arrow Right Icon
Baixe o app para ganhar Certificação grátis e ouvir os cursos em background, mesmo com a tela desligada.