Skip to content

Armadilhas de Dev #1: Seu ICO parece bom — até você inspecionar os frames BMP

2026-06-03

Tags: Windows · Armadilhas de Dev


Esta não é uma história de terror sobre certificação na Store. É um tipo de armadilha mais silenciosa — na qual eu caí puramente por curiosidade.

Por anos, gerei arquivos .ico do mesmo jeito preguiçoso: pegava um PNG de 256×256, jogava em algum conversor online aleatório e baixava o resultado. Sempre parecia certo no Explorer, então nunca pensei duas vezes.

Até que um dia, enquanto desenvolvia uma ferramenta de extração de ICO e testava os arquivos ICO de outros produtos, encontrei algo feio.

O Que Encontrei

Um arquivo ICO é um contêiner. Ele pode armazenar várias imagens em diferentes tamanhos (16×16, 32×32, 48×48, 64×64, 128×128, 256×256) para que o Windows escolha a mais adequada para cada contexto — a barra de tarefas, a barra de título, Alt+Tab, o Explorer.

No meu arquivo ICO, cada frame parecia ok à primeira vista. Mas quando inspecionei mais de perto:

  • O frame de 256×256 (armazenado como PNG) — perfeito. Canal alpha adequado, bordas suaves, sem artefatos.
  • Todos os frames BMP menores — a transparência estava completamente estragada. O canal alpha estava ausente ou continha dados inválidos. Pixels semitransparentes viraram blocos sólidos com halos de cores estranhas.

Os menores pareciam um trabalho de chroma key ruim dos anos 90.

Por Que os Conversores Online Estragam Tudo

A maioria dos conversores gratuitos de PNG para ICO funciona assim:

  1. Pega seu PNG de 256×256 e reduz para cada tamanho necessário (16, 32, 48, etc.)
  2. Salva o frame de 256×256 como PNG
  3. Salva os frames menores como BMP de 32 bits

No entanto, o formato BMP dentro de arquivos ICO é especial. Ele não usa o sofisticado BITMAPV5HEADER — usa o BITMAPINFOHEADER padrão de 40 bytes, com biBitCount definido como 32. O 4.º byte de cada pixel é o canal alpha. E aqui está o detalhe: após os dados de pixels de cor (XOR mask), deve haver uma máscara de transparência monocromática de 1 bit (AND mask) para compatibilidade legada. Além disso, o biHeight no cabeçalho deve ser definido como o dobro da altura real da imagem para contemplar esse AND mask.

Muitos conversores online falham exatamente aqui:

  • Eles declaram cor de 32 bits mas preenchem o byte alpha (o 4.º byte) de cada pixel com 0x00 (totalmente transparente) ou dados lixo aleatórios
  • O AND mask que geram está completamente fora de sincronia com os dados do canal alpha

O resultado: um arquivo que parece válido — as entradas de diretório estão corretas, os tamanhos estão certos, o Explorer não reclama — mas quando o Windows tenta renderizar os frames menores, o GDI blending enlouquece. Você obtém halos misteriosos, pixels transparentes que não são realmente transparentes e outros artefatos de renderização.

Por Que Você Não Vai Perceber Até Que Seja Tarde

O Windows Explorer e a maioria dos aplicativos preferem o frame PNG de 256×256 para exibição. Como esse fica intacto, o ícone parece impecável em todas as visualizações normais — ícones grandes, diálogo de propriedades, até a prévia da barra de tarefas.

Os frames BMP quebrados só aparecem quando o Windows precisa reduzir para um tamanho menor específico. Por exemplo:

ContextoTamanho UsadoFrame Provável
Explorer (ícones extra grandes)256×256PNG ✓
Explorer (ícones grandes/médios)48×48BMP ✗
Barra de título / ícone pequeno16×16BMP ✗
Alternador Alt+Tab32×32BMP ✗

Ou seja, o ícone do seu aplicativo pode parecer perfeito na área de trabalho, mas desenvolver um misterioso "halo" ou transparência bagunçada na barra de título ou no alternador de tarefas. A maioria das pessoas culpa a renderização do Windows. Não — é o ICO.

Como Verificar Seus Arquivos ICO

Existem várias ferramentas gratuitas que listam todos os frames em um arquivo ICO. Procure por:

  • Formato do frame: O frame de 256px deve mostrar PNG. Os frames menores devem mostrar BMP. Usar PNG para todos os frames é tecnicamente válido pela especificação ICO, mas pode causar problemas de compatibilidade em versões antigas do Windows. Uma combinação de PNG (256px) + BMP (tamanhos menores) é a escolha mais segura.
  • Profundidade de bits do BMP: Deve ser 32 BPP para suporte real ao canal alpha (blending semitransparente). Se mostrar 24 BPP, os dados alpha por pixel foram perdidos — o frame ainda pode recorrer à AND mask de 1 bit legada do ICO para um recorte básico de fundo do tipo "tudo ou nada", mas todas as bordas suavizadas, gradientes semitransparentes e sombras serão quebradas, transformando-se em artefatos sólidos feios ou bordas pretas grossas em sistemas modernos.
  • Inspeção visual: Carregue cada frame individualmente. Os frames menores devem ter alpha suave e adequado, sem bordas serrilhadas ou fundos sólidos.

Como Corrigir

Opção 1: Use um editor de ícones adequado e teste seu conversor

Pegue seu PNG original e crie um ICO novo com um editor apropriado que lide corretamente com o canal alpha de BMP. Antes de confiar em qualquer conversor — seja online ou offline — faça um teste: gere um ICO a partir de um PNG com áreas semitransparentes conhecidas (sombras suaves, gradientes, etc.) e inspecione cada frame. Se algum frame BMP tiver alpha quebrado, esse conversor não é seguro para uso.

Opção 2: ICO só com PNG (quando possível)

Algumas ferramentas modernas aceitam arquivos ICO que usam compressão PNG para todos os frames, não apenas para o de 256×256. Isso evita completamente o problema de alpha em BMP. No entanto, isso não é suportado universalmente por todas as versões do Windows ou aplicativos — teste antes de contar com isso.

Principais Conclusões

  • Só porque um ICO parece ok no Explorer não significa que ele realmente está ok
  • O frame PNG de 256×256 geralmente está correto; todos os frames BMP menores podem estar quebrados
  • O alpha quebrado em BMP é invisível na maioria das visualizações — só aparece em barras de título, Alt+Tab e outros contextos de ícones pequenos
  • Teste seu conversor online com um PNG semitransparente conhecido antes de confiar nele
  • Use um editor de ícones adequado para qualquer coisa que você distribuir — vale os 5 minutos

Este artigo pertence à série Armadilhas de Dev.