HTML para Imagem: Guia do Desenvolvedor (2026)
Como converter HTML, CSS e nós do DOM em imagens PNG/JPG. Casos de uso, bibliotecas, APIs do navegador, geração de imagens OG, marcas d'água e como fazer tudo isso sem enviar código a um servidor.
Converter HTML em imagem, pegar uma marcação arbitrária e renderizá-la como PNG ou JPG estático, é uma daquelas operações que parecem simples e acabam surpreendentemente cheias de nuances. Fontes da web, CORS, conteúdo dinâmico, recursos modernos de CSS, fundos transparentes, renderização retina… cada item adiciona uma nova camada de complexidade.
Este guia cobre o que você precisa saber em 2026 para escolher a abordagem certa para o seu caso de uso: de capturas pontuais até a geração dinâmica de imagens Open Graph em escala.
Casos de uso, quando você precisa de HTML para Imagem
1. Imagens dinâmicas de Open Graph
Cada post de blog, página de produto ou perfil de usuário recebe um cartão social único. Em vez de desenhar cada um à mão no Figma, você monta um template HTML/CSS e renderiza para PNG no momento da build (ou sob demanda). É isso que o @vercel/og da Vercel, os Cloudflare Workers e os próprios cards OG por página do DuneTools (veja /og/ neste site) fazem por baixo dos panos.
2. Capturas de telas de componentes
Mostrar uma biblioteca de gráficos, um componente de UI, um dashboard de admin, capturar um nó específico do DOM permite incorporar uma imagem sem ferramentas complexas de screenshot. Útil para documentação, sites de marketing e páginas de status.
3. Imagens compatíveis com e-mail
Clientes de e-mail (em especial o Outlook) têm suporte péssimo a HTML/CSS. Uma fatura dinâmica, um gráfico, um selo de status, renderize no servidor para PNG e incorpore como <img> para garantir renderização idêntica em todo lugar.
4. Recibos, faturas, certificados
Saída estática e não editável em PDF/PNG de dados HTML estruturados. Ferramentas como recibos do Stripe, geradores de certificados e impressoras de ingressos fazem isso.
5. Marca d’água e visuais assinados
Renderize texto/código dinâmico sobre uma imagem base como um único PNG composto, para proteção, atribuição ou compartilhamento.
6. Código em imagem (a alternativa moderna às capturas de tela)
Ferramentas como Carbon, Ray.so e Polacode renderizam código com sintaxe destacada como imagens lindas e com identidade visual. Por baixo: HTML/CSS renderizado para PNG.
Abordagens e trade-offs
A) Lado do servidor: Puppeteer / Playwright
Roda uma instância real do Chromium no servidor, navega até uma URL ou define o conteúdo HTML, captura.
Prós: fidelidade pixel a pixel (é um navegador de verdade), suporte total a CSS/JS/fontes, lida com qualquer URL com cookies/autenticação.
Contras: pesado (mais de 200 MB de binário do Chromium), demora para iniciar (cerca de 1 a 3 segundos no cold start), caro em serverless. Cold starts no AWS Lambda são notoriamente dolorosos.
Melhor para: necessidades de baixo volume e alta fidelidade (relatórios em PDF, capturas de página inteira, conteúdo dinâmico complexo).
import puppeteer from 'puppeteer';
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.setContent(htmlString);
const buffer = await page.screenshot({ type: 'png' });
await browser.close();
B) satori + resvg (a abordagem da Vercel)
Renderiza marcação no estilo JSX/HTML para SVG com satori (um motor de renderização customizado) e depois rasteriza para PNG com resvg. Usado pelo @vercel/og, geração de OG do Next.js e o script build-og.mjs do DuneTools.
Prós: muito rápido (cerca de 50 a 200 ms), dependência minúscula (cerca de 10 MB), funciona em runtimes Edge (Cloudflare Workers, Vercel Edge Functions, AWS Lambda@Edge).
Contras: subconjunto de CSS (sem z-index, Grid limitado, sem execução de JS). Você desenha dentro das limitações, mas elas cobrem 90% dos casos de uso de imagens OG.
Melhor para: geração de imagens OG em alto volume, Edge Functions, renderização em build time.
C) html2canvas / dom-to-image (lado do cliente)
Bibliotecas JavaScript puras que percorrem o DOM, serializam para SVG foreignObject e rasterizam via HTML5 Canvas. Roda totalmente no navegador do usuário.
Prós: zero servidor, grátis, sem problemas de CORS para conteúdo de mesma origem, retorno instantâneo.
Contras: pequenas diferenças de renderização em relação ao navegador real (alguns recursos de CSS são aproximados, carregamento de fontes da web exige cuidado), recursos externos bloqueados por CORS precisam de proxy.
Melhor para: captura no lado do cliente de componentes que os usuários estão vendo, recursos de captura para área de transferência, ferramentas internas.
D) HTML para Imagem do DuneTools
Uma combinação da abordagem C com renderização acelerada por WebAssembly, projetada para conversões pontuais. Cole HTML/CSS, receba PNG/JPG sem montar infraestrutura ou aprender uma biblioteca.
Prós: zero instalação, zero servidor, funciona offline depois de carregar a página, lida com CSS moderno através do motor real do navegador.
Contras: não é para uso programático em alto volume (use B ou A para isso).
Melhor para: desenvolvedores que precisam de conversões pontuais de HTML para imagem sem subir infraestrutura.
Armadilhas comuns
Carregamento de fontes da web
Se o seu HTML usa uma Google Font, o renderizador precisa da fonte carregada antes da captura. Soluções:
- Embutir a fonte como data URI base64 no CSS (funciona em todo lugar).
- Aguardar a Promise
document.fonts.readyantes da captura (lado do cliente). - No lado do servidor (Puppeteer): aguardar
networkidle0antes do screenshot.
Imagens restringidas por CORS
Imagens de domínios externos marcadas com crossOrigin="anonymous" podem ser desenhadas no canvas. Sem a marcação (padrão), desenhar gera um “tainted canvas” e o seu PNG de saída não pode ser exportado.
Correção: garanta <img crossorigin="anonymous"> e que o servidor de origem retorne Access-Control-Allow-Origin. Os seus próprios assets sempre funcionam.
Cor de fundo
Saída em PNG transparente é ótima para alguns casos (componentes de UI, selos), mas desastrosa para outros (a prévia social fica invisível contra o tema escuro do Twitter). Sempre defina explicitamente o fundo, a menos que a transparência seja desejada.
Resolução / DPI
Uma captura na proporção 1x1 de um nó do DOM com 1200px de largura tem 1200xY, ok para telas comuns, mas borrada em retina. Multiplique por 2 (use scale: 2 no html2canvas, ou 2x a largura no Puppeteer) para uma saída nítida em retina.
Animação / conteúdo dinâmico
A captura congela o frame atual. Se o seu DOM tem spinners de carregamento, imagens com lazy load ou animações CSS, eles serão capturados no meio da animação. Soluções: aguardar as animações se acomodarem (setTimeout após requestAnimationFrame), forçar o estado final via classe ou pausar as animações programaticamente antes da captura.
Privacidade: quando o local importa
Serviços de screenshot baseados em servidor (URL2PNG, Browserless, ScreenshotAPI, etc.) executam o seu HTML na infraestrutura deles. O HTML, a imagem renderizada e até parâmetros de URL podem ser registrados.
Para HTML que contém UI sensível (dashboards de admin com dados reais, ferramentas internas, informações de cliente), isso é um veto absoluto. A correção é a renderização no lado do cliente: o HTML fica no navegador do usuário, é renderizado lá e nunca sai.
O HTML para Imagem do DuneTools faz isso: cole o seu HTML, receba o PNG, nada é registrado em lugar nenhum.
Referência rápida: qual ferramenta para cada necessidade
| Necessidade | Ferramenta |
|---|---|
| Conversão pontual, sem infraestrutura | HTML para Imagem do DuneTools |
| Captura de componente no seu próprio app | html2canvas / dom-to-image |
| Imagens OG em build time | satori + resvg |
| Imagens OG dinâmicas no Edge em tempo de requisição | @vercel/og |
| Alta fidelidade no servidor (páginas inteiras, PDFs) | Puppeteer / Playwright |
| Conversão programática em lote | satori (lado do cliente) ou Puppeteer (servidor) |
Exemplos do mundo real
Imagens OG de blog estático: cada post recebe um PNG único de 1200x630 gerado em build time usando satori, com o título do post, autor e cor de destaque.
PDFs de recibos de SaaS: renderize um template HTML de fatura no servidor com Puppeteer, salve como PDF e anexe ao e-mail.
Ferramenta interna de screenshot: o dashboard do desenvolvedor tem um botão “Compartilhar estado” que captura o estado atual da página via html2canvas e envia para o S3, para relatórios de bug, a equipe pode colar uma captura precisa de qualquer visão.
Gerador de código em imagem: editor de código com sintaxe destacada, quando o usuário clica em “Exportar”, roda html2canvas no bloco de código renderizado e baixa o PNG.
Automação de marketing: imagens dinâmicas de anúncios para campanhas pagas, em vez de desenhar 200 variações no Figma, monte um template HTML, parametrize por URL e renderize para PNG em tempo de requisição.
Resumo
HTML para imagem é um problema resolvido com várias boas ferramentas, escolha pelo caso de uso:
- Precisa de um PNG pontual de HTML arbitrário? HTML para Imagem do DuneTools, zero infraestrutura, instantâneo.
- Construindo um app que precisa capturar conteúdo do usuário? html2canvas no lado do cliente.
- Gerando imagens OG em escala? satori + resvg, em build time ou no Edge.
- Precisa de fidelidade pixel a pixel no servidor? Puppeteer.
Privacidade importa: para HTML sensível (UIs de admin, dashboards, ferramentas internas), sempre escolha uma opção do lado do cliente que não transmita a sua marcação.