Desenvolvimento

Vale a pena usar imagens em Base64? Em geral, só as minúsculas

Embutir economiza uma requisição e custa 33% mais bytes, cache próprio e lazy loading. O limite fica perto de um kilobyte.

Para qualquer coisa maior que um ícone, não. Embutir uma imagem como data URI em Base64 economiza uma requisição de rede e custa 33% mais bytes, o cache próprio, o lazy loading e a negociação de formato. Abaixo de mais ou menos um kilobyte essa troca é justa: um ícone de marcador, um padrão de fundo, um spinner. Acima de alguns kilobytes, a requisição que você evitou era muito mais barata do que tudo o que você entregou em troca.

Quanto o Base64 aumenta o tamanho de uma imagem?

Um terço maior, por aí. O Base64 gasta quatro caracteres a cada três bytes, então o aumento é fixo em 33%, mais o prefixo data:image/png;base64, e até dois caracteres = de padding. Um PNG de 12 KB vira cerca de 16 KB de texto. Isso é aritmética, não uma fraqueza de algum encoder, e nenhuma ferramenta vai ficar abaixo disso. O que é Base64 de verdade tem a versão em nível de bits, se você quiser.

A compressão em trânsito devolve uma parte. Gzip e Brotli encontram alguma redundância em uma string Base64, então o tamanho transferido não chega aos 133% inteiros. Mas também nunca volta ao original, e em um PNG, JPEG ou WebP os bytes originais já vinham comprimidos, ou seja, não sobrava muito para espremer desde o começo. Conte com esse custo extra em vez de supor que a codificação de transferência o apaga.

O que você perde ao embutir uma imagem?

Uma imagem com URL própria é baixada uma vez e reaproveitada em todo lugar. Dê a ela um nome de arquivo com hash e um header de cache longo e o visitante que volta nunca mais a baixa, em página nenhuma.

A mesma imagem embutida em uma folha de estilos passa a fazer parte dessa folha de estilos. Mude uma cor que não tem nada a ver, publique um hash novo, e cada visitante baixa a imagem de novo junto. Se em vez disso você embutir no HTML, ela é baixada a cada visualização de página, porque o HTML normalmente não é cacheado de jeito nenhum.

O resto vai junto:

Embutir ainda economiza tempo em HTTP/2?

Bem menos do que antes. O argumento clássico era a quantidade de requisições: no HTTP/1.1 o navegador mantinha cerca de seis conexões abertas por host e todo o resto ficava na fila, e é por isso que sprite sheets e data URIs eram o conselho padrão. O HTTP/2, padronizado em 2015 e com suporte em todos os navegadores atuais, multiplexa muitas requisições em uma única conexão. Um arquivo pequeno a mais não é de graça — ele ainda carrega seus próprios headers e trabalho no servidor — mas não bloqueia mais nada.

O que sobrevive é a latência no primeiríssimo carregamento. Uma requisição ainda precisa de uma ida e volta, e numa conexão móvel lenta isso é mensurável. É por isso que o único uso honesto que resta para embutir são assets minúsculos necessários na primeira pintura: não fotografias, não imagens de capa, nada que você chamaria de conteúdo.

Quando embutir ainda é a escolha certa?

Repare no que não está nessa lista: fotografias, logos de mais de um ou dois kilobytes, qualquer coisa que apareça em uma única página e qualquer coisa que um usuário envie.

Que tamanho é grande demais para embutir?

Codifique o arquivo e olhe o comprimento da string. Essa é a decisão inteira. Jogar a imagem no conversor para data URI deste site coloca lado a lado os bytes originais, os bytes codificados e o custo extra: o número codificado conta a string inteira, prefixo incluído, então fica um pouco acima de 33% em vez de exatamente nisso. Ele avisa sem rodeios assim que a string passa de 100 KB, mas trate isso como o ponto em que embutir é indefensável, não o ponto em que deixa de ser sensato. A tabela é o julgamento que a ferramenta não faz por você. Nada é enviado, o que aqui importa mais que de costume: um data URI é uma cópia completa do arquivo em texto puro.

Comprimento codificadoO que fazer
Menos de 1 KBEmbuta. A requisição custa mais que os bytes.
1–4 KBEmbuta só se for necessária para a primeira pintura e usada na maioria das páginas.
4–10 KBEm geral deixe como arquivo. Deixe um limite do build decidir, não você.
Mais de 10 KBDeixe como arquivo. Você está trocando cache por uma única ida e volta.

Se o número te surpreende, o problema é a imagem e não a codificação. Um ícone de 90 KB não é um ícone. Redimensionar e comprimir antes de codificar qualquer coisa muitas vezes responde à pergunta sozinho, e de onde vem de verdade o peso de uma imagem explica por que as dimensões importam mais que o controle deslizante de qualidade.

Vale a pena codificar um SVG em Base64?

Não, e é o único caso em que a resposta não tem nada a ver com limites de tamanho.

Um SVG já é texto. Codificá-lo em Base64 soma um terço ao tamanho sem benefício nenhum e transforma algo legível em ruído. Fazer percent-encoding apenas dos caracteres que quebrariam um url() de CSS — #, <, >, as aspas — deixa tudo mais curto, mantém legível dentro da folha de estilos e comprime muito melhor, porque o gzip encontra repetição em XML e quase nenhuma em Base64. O conversor linkado acima troca sozinho para percent-encoding quando você dá um SVG a ele, e avisa que foi isso que ele fez.

Para um ícone dentro do HTML, melhor ainda: cole o próprio elemento <svg> em vez de qualquer tipo de URI. Aí currentColor funciona, o CSS consegue estilizar os paths e não há custo nenhum de codificação.

O que quebra quando você usa um data URI?

Seu bundler deveria decidir no seu lugar?

É colando data URIs no código-fonte na mão que um repositório acaba com arquivos impossíveis de revisar e imagens que ninguém encontra para atualizar. Mantenha a imagem como um arquivo normal e deixe o bundler embuti-la abaixo de um limite de tamanho: o Vite embute por padrão os assets com menos de 4.096 bytes, e os asset modules do webpack funcionam do mesmo jeito com um corte parecido de poucos kilobytes. Os dois deixam você mudar o número ou forçar qualquer um dos dois comportamentos arquivo por arquivo.

Você fica com código-fonte legível, continua ganhando a otimização dos arquivos pequenos e há um único número para mudar quando o ícone vira uma fotografia. Uma string colada na mão não te dá nada disso. E é também a versão que fica anos no repositório, porque ninguém consegue dizer o que é nem de onde veio.

Se você está avaliando um arquivo específico e não o caso geral, o conversor de imagem para Base64 te dá o número que decide: tamanho original, tamanho codificado e o custo extra, sem que o arquivo saia do seu navegador.

E quando um data URI vai parar dentro de uma configuração JSON ou da resposta de uma API, ele achata o payload em uma única linha que ninguém consegue ler nem revisar. Formatar JSON minificado é o jeito de devolver isso a algo que uma pessoa consiga conferir.

Perguntas frequentes

Vale a pena usar imagens em Base64?

Só para imagens com menos de um ou dois kilobytes, mais ou menos, que aparecem na maioria das páginas, como ícones pequenos e padrões de fundo. Acima disso, embutir custa mais que a requisição economizada, porque os bytes não podem mais ser cacheados separadamente, carregados com lazy loading nem servidos em um formato moderno. Qualquer coisa fotográfica e visível para o usuário deve continuar sendo um arquivo normal.

Imagens em Base64 carregam mais rápido?

Elas evitam uma requisição de rede, o que importava no HTTP/1.1 e importa muito menos com a multiplexação do HTTP/2. Em contrapartida, somam 33% ao tamanho, bloqueiam a primeira pintura quando estão dentro do CSS e são baixadas de novo toda vez que o arquivo que as contém muda. Para assets pequenos é um ganho; para os grandes é uma perda clara.

Quanto uma imagem em Base64 é maior que a original?

Cerca de 33% maior, mais um prefixo curto e até dois caracteres de padding. O Base64 codifica cada três bytes como quatro caracteres, então uma imagem de 12 KB vira cerca de 16 KB de texto. Gzip ou Brotli recuperam parte da diferença em trânsito, mas nunca toda.

Posso usar uma imagem em Base64 em um e-mail?

Em geral não. O Gmail e vários outros clientes de e-mail bloqueiam data URIs nas tags de imagem, então quem recebe vê uma imagem quebrada no lugar. Hospede o arquivo e aponte para ele com uma URL normal, mesmo que isso signifique que a imagem pode ficar bloqueada até o leitor carregar o conteúdo remoto.

Base64 é ruim para SEO?

Uma imagem embutida não tem URL, então um crawler não consegue buscá-la nem indexá-la e ela não vai aparecer na busca de imagens. Também soma peso ao HTML ou ao CSS que precisa chegar antes de a página renderizar, o que afeta as métricas de carregamento. Para um ícone decorativo de 500 bytes nenhum dos dois pontos importa; para a foto de um produto, os dois importam.

Vale a pena codificar um SVG em Base64?

Não. SVG já é texto, então o Base64 o deixa um terço maior, ilegível e mais difícil de comprimir. Em vez disso, faça percent-encoding dos poucos caracteres que quebram um url() de CSS, ou cole o elemento SVG direto no seu HTML para que o CSS ainda consiga estilizá-lo.

Última atualização 19 de setembro de 2026