Skip to content
Back to Blog

Imagem para Base64: Data URIs do Jeito Certo

Uma data URI base64 permite incorporar uma imagem diretamente em HTML ou CSS sem requisição HTTP extra. Este guia mostra a sintaxe exata data:image, a penalidade de 33% no tamanho a considerar e quando inline é a escolha errada.

SZ
Founder, Molixa
12 min read
Compartilhar
Imagem para Base64: Data URIs do Jeito Certo
Table of contents10 sections

Converter uma imagem para base64 transforma um arquivo binário em uma longa string ASCII que você pode colar diretamente em HTML, CSS, JSON ou uma coluna de banco de dados. Essa string se torna uma URI de dados como data:image/png;base64,iVBORw0KGgo..., e o navegador a renderiza como se tivesse carregado um arquivo de imagem real. O detalhe que a maioria das páginas de conversão nunca menciona: o base64 torna cada imagem cerca de 33% maior, então incorporar é uma ferramenta que você usa em casos específicos, não como padrão.

Este guia mostra a sintaxe exata, o prefixo MIME correto para cada formato, como codificar uma imagem no navegador e no código, e a matemática de cache que decide se incorporar uma determinada imagem é uma jogada inteligente ou um erro.

O que é um Data URI de Imagem Base64?#

Um data URI é uma forma de incorporar o conteúdo de um arquivo diretamente em um documento, em vez de fazer referência a um arquivo externo. Para imagens, o formato é fixo e previsível:

data:[<tipo MIME>][;base64],<dados codificados>

Um exemplo real de PNG se parece com isto (truncado):

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJ...

Três partes são importantes:

  • data: informa ao navegador que são dados inline, não uma URL para buscar.
  • image/png;base64 é o tipo MIME mais o sinalizador de codificação. Esta é a parte que as pessoas erram.
  • Tudo após a vírgula são os bytes codificados em base64 da imagem real.

Como a imagem inteira está dentro da string, o navegador não faz uma requisição de rede separada para ela. Essa única propriedade é a razão pela qual os data URIs existem e a fonte de todas as compensações neste artigo.

Modelo mental rápido: base64 não é compressão. É o oposto. É uma forma de representar dados binários usando apenas caracteres de texto seguros, e essa representação é sempre maior que a original.

O prefixo MIME por formato de imagem#

Usar o tipo MIME errado é o principal motivo pelo qual uma imagem incorporada é exibida como um ícone quebrado. O prefixo deve corresponder aos bytes reais do arquivo, não à extensão que você acha que ele tem.

Formato de imagemPrefixo correto do data URI
PNGdata:image/png;base64,
JPEGdata:image/jpeg;base64,
GIFdata:image/gif;base64,
WebPdata:image/webp;base64,
SVGdata:image/svg+xml;base64,
ICO (favicon)data:image/x-icon;base64,

Observe que JPEG é image/jpeg, nunca image/jpg, mesmo que a extensão do arquivo seja geralmente .jpg. SVG é um caso especial porque é texto, não binário, então você pode frequentemente pular o base64 e usar codificação URL (mais sobre isso abaixo).

Como Converter uma Imagem para Base64#

Você tem três caminhos práticos dependendo se quer uma string única, uma conversão no navegador no seu próprio aplicativo ou uma saída em etapa de build. Aqui está a rota mais rápida primeiro, depois o código.

Passo 1: Obter a string com um conversor sem instalação#

Para uma conversão rápida e única, você não precisa escrever código. Arraste o arquivo para um codificador e decodificador base64 ou use o conversor de imagem para base64 quando quiser o prefixo completo data:image/... gerado para você. Você cola ou envia, copia a saída e pronto. Essa é a escolha certa quando você precisa da string apenas uma vez para uma regra CSS ou um template de e-mail.

A conversão ocorre no seu navegador, então a imagem nunca sai da sua máquina. Isso é importante quando a imagem é um ativo privado, um logotipo de cliente ou qualquer coisa que você não colaria em uma ferramenta online aleatória.

Passo 2: Codificar no navegador com FileReader#

Quando você precisa converter imagens dentro do seu próprio aplicativo web (por exemplo, um usuário envia um avatar e você quer visualizá-lo antes de enviar), a API FileReader fornece uma URI de dados diretamente:

function fileToDataURL(file) {
  return new Promise((resolve, reject) => {
    const reader = new FileReader();
    reader.onload = () => resolve(reader.result); // já é uma URI data: completa
    reader.onerror = reject;
    reader.readAsDataURL(file);
  });
}

// uso
const input = document.querySelector('input[type="file"]');
input.addEventListener('change', async () => {
  const dataURL = await fileToDataURL(input.files[0]);
  document.querySelector('img').src = dataURL; // renderiza instantaneamente
});

readAsDataURL retorna a string completa data:image/png;base64,..., incluindo o prefixo, então você pode atribuí-la diretamente a um src de img ou a um background-image. Não é necessária detecção manual de MIME.

Passo 3: Codificar no servidor ou em tempo de build#

No Node.js, você lê o arquivo como um buffer e chama toString('base64'), depois monta o prefixo manualmente:

import { readFileSync } from 'node:fs';

const bytes = readFileSync('logo.png');
const base64 = bytes.toString('base64');
const dataURI = `data:image/png;base64,${base64}`;

Em Python é quase idêntico:

import base64

with open("logo.png", "rb") as f:
    encoded = base64.b64encode(f.read()).decode("ascii")

data_uri = f"data:image/png;base64,{encoded}"

Ferramentas de build como webpack e Vite automatizam isso. O Vite, por exemplo, incorpora qualquer ativo abaixo de um limite de tamanho (4KB por padrão) como uma URI de dados base64 automaticamente e deixa arquivos maiores como URLs normais. Esse limite padrão existe justamente por causa do cálculo de tamanho na próxima seção.

Onde Você Realmente Usa Imagens Base64#

A string é inútil até que você a coloque em algum lugar. Os três locais comuns:

Em HTML, como fonte de img:

<img src="data:image/png;base64,iVBORw0KGgo..." alt="Logotipo inline" />

Em CSS, como fundo:

.icon {
  background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxu...");
}

Em JSON ou payload de API, onde você não pode enviar binário bruto, então a imagem viaja como um campo de string:

{ "avatar": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQ..." }

Esse caso de JSON é um dos usos legítimos mais fortes. Quando uma API é apenas JSON e você precisa transportar uma imagem inline, o base64 é a resposta padrão.

A penalidade de 33% no tamanho que ninguém menciona#

Aqui está a parte que as páginas conversoras ignoram completamente. O Base64 codifica 3 bytes de dados binários em 4 caracteres ASCII. Essa proporção é fixa: 4/3, o que representa um aumento de aproximadamente 33% antes mesmo de considerar o preenchimento. Um PNG de 90KB se torna cerca de 120KB de texto Base64.

Essa sobrecarga não desaparece. Ela vai parar no seu arquivo HTML ou CSS, o que significa:

  • Maior tamanho de payload HTML ou CSS. Os bytes codificados agora fazem parte do documento que o navegador precisa baixar e analisar.
  • Sem streaming ou renderização progressiva. Uma imagem vinculada pode ser renderizada conforme chega. Uma imagem embutida só aparece depois que toda a string foi baixada como parte do arquivo pai.
  • Gzip ajuda, mas não o suficiente. A compressão recupera parte da perda porque o texto Base64 é repetitivo, mas raramente se volta ao tamanho binário original, e o custo de CPU para decodificar a string é real em dispositivos de baixo desempenho.

Aviso: embutir uma imagem grande de herói ou foto quase sempre é um erro. Uma foto de 500KB se torna aproximadamente 665KB de Base64 inserido no seu HTML, bloqueando a conclusão da análise da página enquanto é baixada. Mantenha-a como um arquivo vinculado.

Se seu objetivo é uma imagem menor em vez de uma embutida, a codificação é a alavanca errada. Reduza o arquivo primeiro com um compressor de imagens gratuito, depois decida se o ativo agora menor vale a pena ser embutido.

Quando incorporar vs quando vincular#

A decisão se resume a uma pergunta: evitar uma solicitação HTTP economiza mais do que os 33% de inchaço que você paga? Use isso como regra geral.

Incorporar como base64 quandoVincular como arquivo normal quando
Ativos pequenos: ícones pequenos, espaçadores de 1px, SVGs simplesFotos, imagens de destaque, qualquer coisa acima de ~5KB
A imagem é crítica e você quer zero solicitações extrasA imagem pode ser carregada de forma preguiçosa ou aparece abaixo da dobra
Você está enviando uma imagem dentro de JSON ou corpo de e-mailA imagem é reutilizada em muitas páginas (cache vence)
O ativo é de uso único e exclusivo de uma páginaO ativo se beneficia de uma CDN ou cache do navegador

O ponto do cache é o que os desenvolvedores mais esquecem. Uma imagem vinculada é armazenada em cache uma vez e reutilizada em todas as páginas e em cada nova visita. Uma imagem incorporada é baixada novamente dentro do documento toda vez, em todas as páginas, sem benefício próprio de cache. Para um logotipo que aparece em todo o site, vincular vence decisivamente. Para um ícone único em uma única página de destino, incorporar pode economizar uma solicitação com custo insignificante.

Nas conexões modernas HTTP/2 e HTTP/3, a justificativa original para incorporar (evitar o custo de muitas solicitações paralelas) é muito mais fraca do que na era HTTP/1.1. O multiplexação de solicitações tornou a busca de arquivos pequenos barata. Essa é outra razão para incorporar com moderação hoje.

SVG: O Formato Onde Você Muitas Vezes Pula o Base64#

SVG é texto XML, não binário, então base64 geralmente é a escolha errada para ele. Você pode colocar um SVG codificado por URL no CSS e pular totalmente a sobrecarga de codificação:

.checkmark {
  background-image: url('data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg"...%3E');
}

Codificar um SVG por URL o mantém legível e evita a penalidade de 33% do base64, porque você está escapando apenas os poucos caracteres que quebram dentro de um url() do CSS. Reserve base64 para formatos binários (PNG, JPEG, WebP) onde não há alternativa legível.

Decodificando uma Imagem Base64 de Volta para um Arquivo#

O caminho inverso é igualmente comum. Se você tem uma URI de dados e precisa do arquivo original, remova o prefixo e decodifique o restante. No navegador:

function dataURLtoBlob(dataURL) {
  const [meta, b64] = dataURL.split(',');
  const mime = meta.match(/data:(.*?);base64/)[1];
  const binary = atob(b64);
  const bytes = new Uint8Array(binary.length);
  for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);
  return new Blob([bytes], { type: mime });
}

Para uma decodificação manual rápida sem código, cole a string (com ou sem o prefixo) na mesma ferramenta de codec base64 e baixe a imagem reconstruída. Se você quiser um guia mais detalhado sobre o processo de ida e volta de imagens através de base64 e URIs de dados, o artigo sobre codificação e decodificação de imagens base64 e URIs de dados cobre o ciclo completo com exemplos.

Erros Comuns Que Quebram Imagens Inline#

Alguns erros são responsáveis por quase todas as situações de ícone quebrado:

  • Tipo MIME errado. Marcar um JPEG como image/png confunde alguns renderizadores. Combine o prefixo com os bytes reais.
  • Incluir quebras de linha. Algumas ferramentas quebram a saída base64 a cada 76 caracteres. Em um atributo HTML ou regra CSS, essas quebras de linha podem quebrar a string. Use uma única linha contínua.
  • Esquecer ;base64. Sem essa flag, o navegador trata os dados como texto simples ou conteúdo codificado em URL, não como binário codificado.
  • Inserir imagens gigantescas. Tecnicamente válido, mas na prática é um problema de desempenho. Cuidado com o tamanho do documento.
  • Colar imagens privadas em codificadores online não confiáveis. Prefira um conversor que rode no lado do cliente para que o arquivo nunca seja enviado.

Convertendo uma Imagem para Base64, na Prática#

Para recapitular o fluxo de trabalho correto para ir de imagem para base64: escolha o prefixo MIME correto para o formato, codifique com uma ferramenta do lado do cliente ou FileReader, e considere o aumento de aproximadamente 33% no tamanho. Incorpore inline apenas ativos pequenos, de uso único e críticos para renderização, e mantenha fotos e imagens reutilizadas como arquivos vinculados para que o cache do navegador faça seu trabalho. SVGs geralmente preferem codificação URL, não base64.

Quando você precisa apenas da string de forma rápida e segura, o codificador e decodificador base64 lida com ambas as direções no seu navegador, e o conversor dedicado de imagem para base64 constrói a URI de dados data:image/... completa para que você possa colá-la diretamente no seu markup.

Perguntas Frequentes#

Como converter uma imagem para base64? Faça upload ou cole o arquivo em um codificador do lado do cliente, ou use código: no navegador, chame FileReader.readAsDataURL(file), e no Node.js, leia o arquivo como buffer e chame buffer.toString('base64'). Em seguida, adicione o prefixo correto, como data:image/png;base64,, para obter uma URI de dados utilizável.

Por que minha imagem base64 é maior que o arquivo original? O base64 representa 3 bytes de dados binários como 4 caracteres de texto, o que aumenta o tamanho em cerca de 33% antes do preenchimento. É uma codificação, não um formato de compressão, então a versão codificada é sempre maior. Se você precisa de um ativo menor, comprima a imagem primeiro e depois decida se deve incorporá-la.

Qual é o prefixo correto da URI de dados para JPEG? É data:image/jpeg;base64,, usando image/jpeg e nunca image/jpg. A extensão do arquivo no disco geralmente é .jpg, mas o tipo MIME na URI de dados deve ser jpeg. Um prefixo incorreto é o motivo mais comum para uma imagem inline aparecer como um ícone quebrado.

Devo incorporar imagens como base64 para melhor desempenho? Apenas para ativos pequenos, de uso único e críticos para renderização, como ícones pequenos. Incorporar evita uma requisição HTTP, mas adiciona 33% de aumento ao seu HTML ou CSS, impede que o navegador armazene em cache a imagem separadamente e a baixa novamente em cada página. Com HTTP/2 e HTTP/3, o benefício de economizar requisições é menor do que costumava ser, então prefira vincular fotos e imagens reutilizadas.

Preciso de base64 para imagens SVG? Geralmente não. SVG é texto, então você pode codificá-lo em URL dentro de um url() do CSS e evitar completamente a sobrecarga de 33% do base64, mantendo o markup legível. Reserve base64 para formatos binários como PNG, JPEG e WebP, onde não há alternativa baseada em texto.

É seguro usar um conversor online de imagem para base64? Depende se a ferramenta processa o arquivo no seu navegador ou o envia para um servidor. Para ativos privados, como logotipos de clientes, use um conversor que execute no lado do cliente para que a imagem nunca saia da sua máquina. As ferramentas base64 e imagem para base64 da Molixa codificam localmente no navegador exatamente por esse motivo.

More from Molixa

Try Molixa Tools

50+ free AI tools for content creation, SEO, coding, and more. No signup, no watermark.

Explore all tools