O que é um canal alfa?
Um canal alfa armazena a transparência de cada pixel separadamente dos canais de cor de uma imagem. Seus valores representam uma cobertura totalmente transparente, totalmente opaca ou parcialmente transparente.
Como funcionam os canais alfa
Um valor alfa registra o grau de opacidade de um pixel. Em PNG, zero significa totalmente transparente e o valor máximo de amostra significa totalmente opaco; valores intermediários indicam cobertura parcial, como ao longo de uma borda suave. Um compositor mistura cada pixel do primeiro plano com o que está atrás dele na proporção indicada pelo alfa. A cor junto ao alfa pode ser armazenada de duas maneiras. O alfa direto, também chamado de não pré-multiplicado ou não associado, mantém a cor integral junto ao seu valor alfa. O alfa pré-multiplicado, ou associado, armazena a cor já multiplicada pelo alfa, o que simplifica a fórmula de composição. No exemplo do Padrão HTML, o amarelo semitransparente é 255, 255, 0, 127 com alfa direto e 127, 127, 0, 127 com alfa pré-multiplicado. Arquivos PNG armazenam alfa direto, bitmaps de saída do canvas 2D do HTML usam alfa pré-multiplicado, e TIFF pode conter qualquer uma das formas, com uma tag que indica qual delas é usada. O software precisa saber qual forma está lendo, e a conversão entre as duas causa perdas em pixels que não são totalmente opacos.
Informações essenciais
- O que dá errado quando o alfa direto e o pré-multiplicado são confundidos? As bordas suaves mudam de cor. Dados pré-multiplicados compostos como alfa direto têm sua cor multiplicada pelo alfa uma segunda vez, fazendo as bordas parcialmente transparentes escurecerem. Dados de alfa direto tratados como pré-multiplicados são adicionados com intensidade total, fazendo as bordas parecerem claras demais. Pixels totalmente opacos são idênticos nas duas formas, por isso o erro aparece como um contorno ao redor dos recortes, e não nas áreas sólidas. Ferramentas que aceitam ambas as formas oferecem uma configuração: o filtro
overlaydo FFmpeg, por exemplo, tem uma opçãoalphacom os valoresstraight,premultipliedeauto. - Por que um recorte ganha um halo após o redimensionamento? Com alfa direto, um pixel totalmente transparente ainda armazena uma cor, e um filtro que calcula a média de cada canal separadamente mistura essa cor oculta aos pixels vizinhos da borda. A solução usual é pré-multiplicar, redimensionar e depois converter de volta. Nem toda ferramenta faz isso por você: a documentação do libvips informa que sua operação de redimensionamento não pré-multiplica o alfa e orienta quem a chama a fazer isso primeiro.
- Quais formatos de imagem estática preservam o alfa? PNG armazena um canal alfa completo nos tipos de cor verdadeira com alfa e de tons de cinza com alfa; nos demais casos, pode atribuir um valor alfa próprio a cada entrada da paleta ou marcar uma única cor como totalmente transparente. WebP pode armazenar alfa em arquivos tanto sem perdas quanto com perdas; no caso com perdas, é necessária a estrutura estendida do arquivo. GIF não tem canal alfa: um índice da paleta pode ser marcado como transparente, portanto cada pixel é desenhado ou ignorado. JPEG não tem canal alfa, e os conversores diferem na forma de substituir a transparência. Alguns compõem a imagem sobre uma cor de fundo. Outros apenas descartam o canal alfa, deixando a cor que os pixels transparentes armazenavam: a documentação do ImageMagick descreve sua saída JPEG como equivalente a
-alpha off, com fundos transparentes normalmente se tornando pretos. Para um resultado previsível, componha a imagem sobre um fundo escolhido por você antes da codificação. Os padrões dessa etapa também variam:flattendo sharp, por exemplo, usa preto por padrão. - A extensão de um arquivo de vídeo indica se ele tem alfa? Não. O alfa depende do codec e de seu perfil. Entre os codecs Apple ProRes, somente ProRes 4444 e ProRes 4444 XQ suportam um canal alfa, portanto dois arquivos com a mesma extensão podem diferir. VP8 e VP9 podem conter alfa, mas a MDN observa que o Safari não suporta transparência alfa em nenhum dos dois. Também pode ser necessário configurar o codificador para gravar o alfa: o codificador
prores_ksdo FFmpeg tem uma opçãoalpha_bitscujo valor 0 desativa o plano alfa.
Quando os canais alfa são importantes
Preserve o alfa ao compor logotipos, recortes, sobreposições ou animações transparentes sobre outros conteúdos. Um codec ou formato sem suporte a alfa descartará a transparência ou exigirá a escolha de um fundo.
Como a Transloadit ajuda com canais alfa
O Robot /image/resize da Transloadit altera o fundo de imagens transparentes para branco por padrão; sua documentação orienta definir background como none para preservar a transparência. O format de saída ainda precisa ser um formato capaz de armazenar alfa. O parâmetro alpha do Robot controla o canal diretamente, e solicitar has_transparency por meio de output_meta informa se uma imagem contém partes transparentes, o que ajuda a escolher um formato de saída para cada arquivo. O Robot /image/bgremove remove fundos e grava em PNG por padrão.
Essas duas páginas não informam se o redimensionamento usa alfa direto ou pré-multiplicado. Se a qualidade das bordas for importante, redimensione um recorte com bordas suaves, coloque-o sobre um fundo contrastante e inspecione o resultado antes de processar uma coleção inteira.
Fontes
- Especificação Portable Network Graphics (PNG), terceira edição: representação alfa e tRNS
- Composição e mesclagem do W3C de nível 1: composição alfa simples
- Padrão HTML: alfa pré-multiplicado e o contexto de renderização 2D
- API do libvips: vips_resize (o alfa não é pré-multiplicado)
- Documentação de filtros do FFmpeg: opção alpha de overlay
- Especificação do contêiner WebP: formatos de arquivo simples e estendido
- Especificação GIF89a: índice de transparência da extensão de controle gráfico
- MDN: guia de tipos e formatos de arquivos de imagem (suporte a alfa por formato)
- Exemplos do ImageMagick: formatos comuns de imagem (JPEG e transparência)
- API do sharp: flatten
- Suporte da Apple: sobre o Apple ProRes (suporte a canal alfa por codec)
- MDN: guia de codecs de vídeo para a web (alfa em VP8 e VP9, suporte no Safari)
- Documentação de codecs do FFmpeg: codificador ProRes alpha_bits