O menor GIF transparente tem 43 bytes.
Isto é tudo. Escolha qualquer byte para ver o que ele faz e depois copie o arquivo, baixe, faça hotlink ou sirva a partir do seu próprio código.

O que cada byte faz
Um GIF é uma sequência de blocos. Este tem sete, e cada cor desta página pertence a um deles. Selecione um byte ou um bloco para ler a descrição. Os números são armazenados em little-endian: o byte menos significativo vem primeiro, então 01 00 significa 1.
| Bytes | Campo | Significado |
|---|---|---|
| Cabeçalho Informa ao decodificador que isto é um GIF e qual versão do formato esperar. | ||
| 47 49 46 | Assinatura | As letras ASCII “GIF”. Todo arquivo GIF começa com elas. |
| 38 39 61 | Versão | “89a”. A versão 89a é necessária para a transparência; a 87a não tem extensão de controle gráfico. |
| Descritor de tela lógica O tamanho do canvas e como a tabela de cores dele está configurada. | ||
| 01 00 | Largura do canvas | 1 px. |
| 01 00 | Altura do canvas | 1 px. |
| 80 | Flags compactadas | Quatro configurações espremidas em um byte. O bit mais alto indica que uma tabela de cores global vem a seguir; os três últimos bits dão o tamanho dela. |
| 00 | Índice da cor de fundo | Entrada 0 da paleta. Os navegadores ignoram esse valor e mostram o que está atrás da imagem. |
| 00 | Proporção do pixel | 0 significa pixels quadrados, sem correção. |
| Tabela de cores global A paleta. Os pixels guardam um índice desta lista em vez de uma cor. | ||
| FF FF FF | Entrada da paleta | Vermelho, verde e azul, um byte cada: #ffffff. Duas entradas é a menor tabela que um GIF pode ter. |
| 00 00 00 | Entrada da paleta | Vermelho, verde e azul, um byte cada: #000000. Duas entradas é a menor tabela que um GIF pode ter. |
| Extensão de controle gráfico Bloco opcional adicionado no GIF89a. Aqui ele torna transparente a entrada 0 da paleta. | ||
| 21 | Introdutor de extensão | 0x21 (“!”) anuncia um bloco de extensão. |
| F9 | Rótulo de controle gráfico | 0xF9 indica que esta extensão é uma extensão de controle gráfico. |
| 04 | Tamanho do bloco | Seguem 4 bytes de configurações. |
| 01 | Flags compactadas | O bit mais baixo é a flag de transparência. Ela está ligada, então o índice transparente abaixo é usado. |
| 00 00 | Atraso | 0 centésimos de segundo. Só importa em animações. |
| 00 | Índice da cor transparente | A entrada 0 da paleta é desenhada totalmente transparente. |
| 00 | Terminador de bloco | Um sub-bloco de comprimento zero que fecha o bloco. |
| Descritor de imagem Onde a imagem fica no canvas e qual é o tamanho dela. | ||
| 2C | Separador de imagem | 0x2C (“,”) inicia uma imagem. |
| 00 00 | Esquerda | A imagem começa a 0 px da borda esquerda do canvas. |
| 00 00 | Topo | A imagem começa a 0 px da borda superior do canvas. |
| 01 00 | Largura da imagem | 1 px. |
| 01 00 | Altura da imagem | 1 px. |
| 00 | Flags compactadas | Sem tabela de cores local, sem entrelaçamento. A imagem usa a paleta global. |
| Dados da imagem Os pixels, comprimidos com LZW e divididos em sub-blocos de até 255 bytes. | ||
| 02 | Tamanho mínimo de código LZW | 2, então os códigos comprimidos começam com 3 bits de largura. |
| 02 | Tamanho do sub-bloco | Seguem 2 bytes de dados comprimidos. |
| 44 01 | Pixels comprimidos | Códigos LZW empacotados a partir do bit mais baixo. Veja abaixo como eles são decodificados. |
| 00 | Terminador de bloco | Um sub-bloco de comprimento zero que fecha o bloco. |
| Marcador de fim Um byte que marca o fim do arquivo. | ||
| 3B | Marcador de fim | 0x3B (“;”) encerra o arquivo. |
Dentro dos bytes compactados
Cada um destes três bytes guarda várias configurações pequenas. O bit 7 é o mais à esquerda.
0x800x010x00Como dois bytes guardam um pixel
Com tamanho mínimo de código 2, o decodificador lê códigos de 3 bits. O código 4 limpa a tabela, o código 5 encerra a imagem e os códigos 0 a 3 são entradas da paleta. Os bytes 44 01 são lidos a partir do bit mais baixo:
0x44 010001000x01 00000001
- 001100 = 4Limpar: começar com uma tabela nova
- 000000 = 0Pixel: entrada 0 da paleta
- 101101 = 5Fim da imagem
- 0000000 Bits de preenchimento não usados
Imagens maiores usam o mesmo truque: cada código novo representa uma sequência um pixel mais longa que a anterior, então um GIF transparente de 1000×1000 ocupa só 1.743 bytes.
Dá para ser menor?
Sim, se você remover partes cuja falta os decodificadores toleram. Passamos cada variante por três motores de navegador e pelo Pillow e registramos o que eles desenharam.
| Tamanho | Variante | Chromium | Firefox | WebKit | Pillow |
|---|---|---|---|---|---|
| 43 | O arquivo padrão desta página. | Transparente | Transparente | Transparente | Transparente |
| 42 | Sem byte final. Os decodificadores param no fim dos dados de qualquer forma. | Transparente | Transparente | Transparente | Transparente |
| 37 | Sem paleta nenhuma. Ainda é válido: a especificação permite que os decodificadores usem a própria paleta, e o índice 0 é transparente de qualquer forma. | Transparente | Transparente | Transparente | Transparente |
| 36 | Sem paleta e sem byte final. | Transparente | Transparente | Transparente | Transparente |
| 35 | Sem bloco de transparência: o pixel é desenhado com a cor 0 da paleta, branco. | Branco | Branco | Branco | Branco |
| 35 | O formato de 1987. Ele não tem como marcar uma cor como transparente. | Branco | Branco | Branco | Branco |
| 34 | Bloco de transparência, mas sem pixels comprimidos. | Transparente | Transparente | Transparente | Erro |
| 33 | O mesmo, sem o byte final. | Transparente | Transparente | Transparente | Erro |
| 29 | Sem paleta e sem transparência. Cada motor escolhe a própria cor. | Preto | Branco | Transparente | Preto |
| 26 | Uma imagem sem nenhum dado comprimido. | Transparente | Transparente | Transparente | Erro |
| 14 | Só cabeçalho, tamanho do canvas e byte final. Não há nenhuma imagem nele. | Transparente | Erro | Transparente | Erro |
Use os 43 bytes quando precisar funcionar em todo lugar. O de 37 bytes ainda é um GIF válido e ficou transparente em todos os motores que testamos. Abaixo disso, você depende da tolerância do decodificador, e o arquivo de 29 bytes mostra como os motores divergem.
Verificado em 23 de setembro de 2026 com Chromium 153.0.8010.12, Firefox 155.0, WebKit 26.6, Pillow 12.2.0.
Gere um de qualquer tamanho
Transparente ou de cor sólida, de 1×1 até 65535×65535. É gerado no seu navegador; nada é enviado.
Faça hotlink
Aponte direto para estes arquivos a partir de qualquer site, e-mail ou app. Eles são servidos pela edge da Cloudflare com cache de longa duração, e o CORS é liberado para todos.
- O arquivo de 43 bytes
https://emptygif.com/1x1.gif - Qualquer tamanho, transparente
https://emptygif.com/px/300x250.gif - Qualquer tamanho, cor sólida
https://emptygif.com/px/300x250/ff5a1f.gif - API JSON: tamanho, base64 e data URI
https://emptygif.com/api/gif?w=300&h=250 - Todos os snippets em JSON
https://emptygif.com/snippets.json - Resumo para agentes de IA
https://emptygif.com/llms.txt
Cabeçalhos de resposta
HTTP/2 200
content-type: image/gif
content-length: 43
cache-control: public, max-age=31536000, immutable
access-control-allow-origin: *
cross-origin-resource-policy: cross-origin
timing-allow-origin: *Exemplo
<img src="https://emptygif.com/1x1.gif" width="1" height="1" alt="">
Os tamanhos gerados vão até 4096 px por lado. Se você tiver muito tráfego, baixe o arquivo e hospede você mesmo.
Sirva a partir da sua stack
173 snippets prontos para rodar. Escolha o seu: cada um responde no caminho que você escolher com uma resposta image/gif. Se você mudou o tamanho ou a cor acima, os snippets usam esse GIF.
JavaScript & TypeScript
Edge & serverless
- Cloudflare Workers
- Cloudflare Workers (Rust, workers-rs)
- Cloudflare Pages Functions
- Deno Deploy (deno serve)
- Vercel Functions
- Netlify Functions
- Netlify Edge Functions
- AWS Lambda (Node.js)
- AWS Lambda (Python)
- AWS Lambda (Go)
- AWS Lambda (Rust, lambda_http)
- AWS Lambda@Edge (CloudFront)
- Google Cloud Run functions (Node.js)
- Google Cloud Run functions (Python)
- Firebase Cloud Functions + Hosting
- Azure Functions (Node.js v4 model)
- Fastly Compute (JavaScript)
Python
JVM
PHP
Elixir, Erlang & Gleam
Functional languages
C, C++ & systems languages
Swift, Dart & other languages
Web servers & proxies
Command line & one-liners
Express JavaScript
import express from 'express';
const GIF = Buffer.from('R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==', 'base64');
const app = express();
app.get('/pixel.gif', (req, res) => {
res.set('Cache-Control', 'no-store');
res.type('gif').send(GIF);
});
app.listen(8080);
Executamos este snippet e comparamos os bytes que ele retornou. Abrir página
Para que serve
- Pixels de rastreamento e beacons: o servidor registra a requisição e responde com a menor imagem válida.
- Placeholders para imagens com lazy loading, para que a tag
imgseja válida antes de a fonte real chegar. - Espaçadores de tamanho fixo em e-mails HTML, onde o suporte a CSS é irregular.
- Testes e mocks que precisam de uma imagem real sem incluir uma.
Pixels de rastreamento são menos confiáveis do que parecem
O Apple Mail pré-carrega imagens remotas por meio de um proxy quando a Proteção de Privacidade do Mail está ativada, então uma “abertura” pode nunca ter sido uma pessoa. O Gmail também busca as imagens pelo próprio proxy e as armazena em cache. Muitos clientes bloqueiam imagens remotas por padrão. Para analytics de páginas, navigator.sendBeacon() ou uma resposta 204 No Content costuma ser uma opção melhor que uma imagem.
Perguntas frequentes
- Por que se chama vazio se tem um pixel?
- Um GIF precisa ter pelo menos um pixel. Este tem 1×1 e a única cor dele está marcada como transparente, então nada aparece.
- O arquivo de 43 bytes é válido?
- Sim. Ele segue exatamente a especificação GIF89a, e todos os motores da tabela acima o desenham transparente.
- Por que GIF e não PNG ou WebP?
- É menor que um PNG transparente mínimo, e qualquer navegador, cliente de e-mail ou biblioteca de imagens dos últimos 35 anos consegue lê-lo.
- Devo usar um data URI ou um arquivo?
- Um data URI economiza uma requisição e serve bem para placeholders e CSS. Um arquivo ou endpoint é necessário quando a própria requisição é o objetivo, como nos pixels de rastreamento.
- Qual Content-Type devo enviar?
image/gif. AdicioneCache-Control: no-storese toda requisição precisar chegar ao seu servidor.