WikiMini

Composição alfa

Uma imagem de espectro de cores com um canal alfa que diminui para zero em sua base, onde é mesclada com a cor de fundo.

Na computação gráfica, a composição alfa ou mesclagem alfa é o processo de combinar uma imagem com um fundo para criar a aparência de transparência [en] parcial ou total.[1] É frequentemente útil renderizar elementos de imagem (pixels) em passagens ou camadas separadas e, em seguida, combinar as imagens 2D resultantes em uma única imagem final chamada composição [en]. A composição é amplamente utilizada em cinema ao combinar elementos de imagens geradas por computador com filmagem ao vivo (também conhecida e chamada de "live-action"). A mesclagem alfa também é usada em gráficos 2D por computador para posicionar elementos de primeiro plano rasterizados sobre um fundo.

Para combinar corretamente os elementos das imagens, é necessário manter uma matte [en] associada para cada elemento, além de sua cor. Essa camada matte contém informações de cobertura — a forma da geometria desenhada — permitindo distinguir entre partes da imagem onde algo foi desenhado e partes que estão vazias.

Embora a operação mais básica de combinar duas imagens seja sobrepor uma à outra, há várias operações, ou modos de mesclagem [en], que são utilizadas.

O conceito de canal alfa foi introduzido por Alvy Ray Smith e Ed Catmull no final dos anos 1970 no New York Institute of Technology Computer Graphics Lab [en]. Bruce A. Wallace derivou o mesmo operador sobreposição baseado em um modelo físico de reflectância/transmitância em 1981.[2] Um artigo de 1984 por Thomas Porter [en] e Tom Duff [en] apresentou o alfa premultiplicado usando uma abordagem geométrica.[3]

O uso do termo alfa é explicado por Smith da seguinte forma:

"Nós o chamamos assim por causa da fórmula clássica de interpolação linear que usa a letra grega (alfa) para controlar a quantidade de interpolação entre, neste caso, duas imagens A e B".[4]

Ou seja, ao compor a imagem A sobre a imagem B, o valor de na fórmula é obtido diretamente do canal alfa de A.

Em uma imagem 2D, uma combinação de cores é armazenada para cada pixel, geralmente uma combinação de vermelho, verde e azul (RGB). Quando a composição alfa é utilizada, cada pixel tem um valor numérico adicional armazenado em seu canal alfa, com um valor variando de 0 a 1. Um valor de 0 significa que o pixel é completamente transparente e a cor do pixel subjacente será exibida. Um valor de 1 indica que o pixel é totalmente opaco.

Com a existência de um canal alfa, é possível expressar operações de composição de imagens usando uma álgebra de composição. Por exemplo, dadas duas imagens A e B, a operação de composição mais comum é combinar as imagens de modo que A apareça em primeiro plano e B no fundo. Isso pode ser expresso como A sobre B. Além de sobre, Porter e Duff[3] definiram os operadores de composição dentro, excluído por (a expressão refere-se a mattes de exclusão [en] e é geralmente abreviada como fora), acima, e xor (e os operadores reversos rsobre, rdentro, rfora, e racima) a partir de uma consideração de escolhas na mesclagem das cores de dois pixels quando sua cobertura é, conceitualmente, sobreposta ortogonalmente:

Como exemplo, o operador sobre pode ser realizado aplicando a seguinte fórmula a cada pixel:[2]

Aqui, , e representam os componentes de cor dos pixels no resultado da operação "sobre", imagem A e imagem B, respectivamente, aplicados a cada canal de cor (vermelho/verde/azul) individualmente, enquanto , e são os valores alfa dos respectivos pixels.

O operador sobre é, na prática, a operação de pintura normal (veja algoritmo do pintor). Os operadores dentro e fora são equivalentes à recorte [en] na composição alfa. Esses dois utilizam apenas o canal alfa da segunda imagem e ignoram os componentes de cor. Além disso, o operador mais define a mesclagem aditiva.[3]

Alfa direto versus premultiplicado

[editar | editar código fonte]

Se um canal alfa é usado em uma imagem, há duas representações comuns disponíveis: alfa direto (não associado) e alfa premultiplicado (associado).

  • Com alfa direto, os componentes RGB representam a cor do objeto ou pixel, desconsiderando sua opacidade. Este é o método implícito pelo operador sobre na seção anterior.
  • Com alfa premultiplicado, os componentes RGB representam a emissão do objeto ou pixel, e o alfa representa a oclusão. O operador sobre então se torna:[3]

A principal vantagem do alfa premultiplicado é que ele permite mesclagem, interpolação e filtragem [en] corretas. A interpolação comum sem alfa premultiplicado leva a vazamentos de informações RGB de regiões totalmente transparentes (A=0), embora essas informações RGB sejam idealmente invisíveis. Ao interpolar ou filtrar imagens com bordas abruptas entre regiões transparentes e opacas, isso pode resultar em bordas de cores que não eram visíveis na imagem original. Erros também ocorrem em áreas de semitransparência porque os componentes RGB não são corretamente ponderados, dando um peso incorretamente alto à cor dos pixels mais transparentes (com menor alfa).[5]

O alfa premultiplicado também pode ser usado para permitir regiões de mesclagem alfa regular (por exemplo, fumaça) e regiões com modo de mesclagem aditivo [en] (por exemplo, efeitos de chama e brilho) codificados na mesma imagem.[6][7] Isso é representado por uma tupla RGBA que expressa emissão sem oclusão, como (0.4, 0.3, 0.2, 0.0).

Outra vantagem do alfa premultiplicado é o desempenho; em certas situações, ele pode reduzir o número de operações de multiplicação (por exemplo, se a imagem for usada várias vezes durante a composição posterior). As operações de Porter-Duff têm uma forma simples apenas em alfa premultiplicado.[3] Algumas pipelines de renderização expõem uma superfície de API de "alfa direto", mas as convertem em alfa premultiplicado para desempenho.[8]

Uma desvantagem do alfa premultiplicado é que ele pode reduzir a precisão relativa disponível nos valores RGB ao usar representação inteira ou de ponto fixo para os componentes de cor. Isso pode causar uma perda perceptível de qualidade se as informações de cor forem posteriormente clareadas ou se o canal alfa for removido. Na prática, isso geralmente não é perceptível porque, durante operações de composição típicas, como sobre, a influência das informações de cor de baixa precisão em áreas de baixo alfa na imagem final (após a composição) é correspondentemente reduzida. Essa perda de precisão também torna as imagens premultiplicadas mais fáceis de comprimir usando certos esquemas de compressão, pois não registram as variações de cor escondidas em regiões transparentes e podem alocar menos bits para codificar áreas de baixo alfa. As mesmas "limitações" de profundidades de bits de quantização mais baixas, como 8 bits por canal, também estão presentes em imagens sem alfa, e esse argumento é problemático como resultado.

Assumindo que a cor do pixel é expressa usando tuplas RGBA diretas (não premultiplicadas), um valor de pixel de (0, 0.7, 0, 0.5) implica um pixel com 70% da intensidade máxima de verde e 50% de opacidade. Se a cor fosse totalmente verde, sua RGBA seria (0, 1, 0, 0.5). No entanto, se esse pixel usar alfa premultiplicado, todos os valores RGB (0, 0.7, 0) são multiplicados, ou escalonados para oclusão, pelo valor alfa 0.5, que é anexado para produzir (0, 0.35, 0, 0.5). Nesse caso, o valor 0.35 para o canal G indica realmente 70% da intensidade de emissão verde (com 50% de oclusão). Uma emissão verde pura seria codificada como (0, 0.5, 0, 0.5). Saber se um arquivo usa alfa direto ou premultiplicado é essencial para processá-lo ou compô-lo corretamente, pois é necessário um cálculo diferente.

Emissão sem oclusão não pode ser representada em alfa direto. Não há conversão disponível nesse caso.

Formatos de imagem que suportam canais alfa

[editar | editar código fonte]

Os formatos de imagem mais populares que suportam o canal alfa são PNG e TIFF. O GIF suporta canais alfa, mas é considerado ineficiente em termos de tamanho de arquivo. O suporte a canais alfa está presente em alguns codecs de vídeo, como Animation e Apple ProRes 4444 do formato QuickTime, ou no codec multifuncional Techsmith.

O formato de arquivo BMP geralmente não suporta esse canal; no entanto, em formatos diferentes, como 32-bit (888–8) ou 16-bit (444–4), é possível salvar o canal alfa, embora nem todos os sistemas ou programas consigam lê-lo: ele é explorado principalmente em alguns jogos[9] ou aplicações específicas;[10] programas específicos também foram criados para a criação desses BMPs.

Formato de Arquivo/Codec[11] Profundidade Máxima Tipo Suporte em Navegadores Tipo de Mídia Notas
Apple ProRes 4444 16-bit Nenhum Vídeo (.mov) ProRes é o sucessor do Apple Intermediate Codec [en][12]
HEVC / h.265 10-bit Limitado a Safari Vídeo (.hevc) Sucessor planejado do H.264[13][14][15]
WebM (codec de vídeo VP8, VP9, ou AV1) 12-bit Todos os navegadores modernos Vídeo (.webm) Enquanto VP8/VP9 têm amplo suporte em navegadores modernos, AV1 ainda tem suporte limitado.[16] Apenas navegadores baseados em Chromium exibem camadas alfa.
OpenEXR [en] 32-bit Nenhum Imagem (.exr) Possui a maior gama HDR.
PNG 16-bit direto Todos os navegadores modernos Imagem (.png)
APNG 24-bit direto Suporte moderado Imagem (.apng) Suporta animação.[17]
TIFF 32-bit ambos Nenhum Imagem (.tiff)
GIF 8-bit Todos os navegadores modernos Imagem (.gif) Navegadores geralmente não suportam camadas alfa de GIF.
SVG 32-bit direto Todos os navegadores modernos Imagem (.svg) Baseado em cores CSS.[18]
JPEG XL [en] 32-bit ambos Suporte moderado Imagem (.jxl) Permite compressão com perdas e HDR.[19]

Correção de gama

[editar | editar código fonte]
Mesclagem alfa, sem considerar a correção de gama
Mesclagem alfa, considerando
a correção de gama

Os valores RGB de imagens digitais típicas não correspondem diretamente às intensidades de luz física, mas são comprimidos por uma função de correção de gama [en]:

Essa transformação utiliza melhor o número limitado de bits na imagem codificada, escolhendo que corresponde melhor à percepção humana não linear de luminância.

Assim, programas de computador que lidam com tais imagens devem decodificar os valores RGB para um espaço linear (desfazendo a compressão de gama), mesclar as intensidades de luz linear e reaplicar a compressão de gama ao resultado:[20][21]

Quando combinado com alfa premultiplicado, a premultiplicação é feita no espaço linear, antes da compressão de gama.[22] Isso resulta na seguinte fórmula:

Note que o canal alfa pode ou não passar por correção de gama, mesmo quando os canais de cor passam.

Outros métodos de transparência

[editar | editar código fonte]

Embora usados para propósitos semelhantes, cores transparentes e máscaras de imagem não permitem a mesclagem suave dos pixels da imagem sobreposta com os do fundo (apenas pixels inteiros da imagem ou do fundo são permitidos).

Um efeito semelhante pode ser alcançado com um canal alfa de 1 bit, como encontrado no modo de Highcolor RGBA de 16 bits do formato de arquivo de imagem Truevision TGA e nos modos gráficos de alta cor dos adaptadores de exibição TARGA e AT-Vista/NU-Vista. Esse modo dedica 5 bits para cada cor primária RGB (RGB de 15 bits [en]) mais um bit restante como o "canal alfa".

Pontilhamento pode ser usado para simular oclusão parcial onde apenas alfa de 1 bit está disponível.

Para algumas aplicações, um único canal alfa não é suficiente: uma janela de vitral, por exemplo, requer um canal de transparência separado para cada canal RGB para modelar a transparência de vermelho, verde e azul separadamente. Mais canais alfa podem ser adicionados para aplicações de filtragem espectral de cores precisas.

Alguns métodos de transparência independente de ordem [en] substituem o operador sobre por uma aproximação comutativa.[23]

  1. «Definition of alpha blending». PCMAG (em inglês). Consultado em 7 de Agosto de 2021 
  2. a b Wallace, Bruce A. (1981). «Merging and transformation of raster images for cartoon animation». Proceedings of the 8th annual conference on Computer graphics and interactive techniques - SIGGRAPH '81. 15. New York City, New York: ACM Press. pp. 253–262. CiteSeerX 10.1.1.141.7875Acessível livremente. ISBN 0-89791-045-1. doi:10.1145/800224.806813Acessível livremente 
  3. a b c d e Porter, Thomas; Duff, Tom (Julho de 1984). «Compositing digital images» (PDF). Proceedings of the 11th annual conference on Computer graphics and interactive techniques - SIGGRAPH '84 (em inglês). 18. New York City, New York: ACM Press. pp. 253–259. ISBN 9780897911382. doi:10.1145/800031.808606. Consultado em 11 de Março de 2019. Cópia arquivada (PDF) em 29 de Abril de 2011 
  4. Alvy Ray Smith (15 de Agosto de 1995). «Alpha and the History of Digital Compositing» (PDF). alvyray.com. p. 6. Cópia arquivada (PDF) em 25 de Outubro de 2021 
  5. «Alpha Blending: To Pre or Not To Pre». NVIDIA Developer (em inglês). 31 de Janeiro de 2013. However, something interesting happens when we generate the next mipmap level... 
  6. «TomF's Tech Blog - It's only pretending to be a wiki». TomF's Tech Blog - It's only pretending to be a wiki. Consultado em 8 de Maio de 2018. Cópia arquivada em 12 de Dezembro de 2017 
  7. Trebilco, Damian. «To close to draw call (presentation on Pre-multiplied alpha)». GitHub. Ao alternar para o modo de mesclagem pré-multiplicado para todos os efeitos de partículas, toda a cena pode ser feita com uma única chamada de desenho (pressupondo atlasing/2D array para as texturas)... Outro truque interessante com o alfa pré-multiplicado é que, se você tiver texturas sobrepostas que estejam em posições conhecidas, poderá pré-processar todas elas em uma única textura. 
  8. «Premultiplied alpha». Win2D for WinUI3. Consultado em 30 de Junho de 2023. Win2D uses straight alpha in its API surface, but premultiplied alpha for internal rendering operations. 
  9. «Creating Textures». www.echos.ch. Consultado em 25 de Maio de 2023 
  10. «Extended Formats». 4 de Março de 2016. Consultado em 25 de Maio de 2023. Cópia arquivada em 4 de Março de 2016 
  11. Lambrecht, Jordan (31 de Dezembro de 2022). «List of Video/Image Formats Supporting Alpha Channels». Pixel Bakery Design Studio. Consultado em 25 de Maio de 2023 
  12. «Final Cut Pro 6 - Broad Format Support.». apple.com. Consultado em 13 de Agosto de 2024. Cópia arquivada em 8 de Junho de 2011 
  13. Jie Dong (19 de Junho de 2010). «The First JCT-VC Meeting, Dresden, DE». H265.net. Consultado em 13 de Agosto de 2024 
  14. Jie Dong (1 de Julho de 2008). «Current Status of H.265 (as at July 2008)». H265.net. Consultado em 13 de Agosto de 2024 
  15. Yu Liu (15 de Abril de 2009). «The Preliminary Requirements for NGVC». H265.net. Consultado em 13 de Agosto de 2024 
  16. «AV1 video format | Can I use... Support tables for HTML5, CSS3, etc». caniuse.com. Consultado em 25 de Maio de 2023 
  17. «Digital Audio Broadcasting (DAB); MOT SlideShow; User Application (pdf) Specification» (PDF). ETSI. Consultado em 13 de Agosto de 2024 
  18. «SVG specification, "Color"». World Wide Web Consortium. 14 de Janeiro de 2003. Consultado em 13 de Agosto de 2024. Cópia arquivada em 7 de Setembro de 2009 
  19. @chromium.org, de... (24 de Agosto de 2022). «JPEG XL decoding support (image/jxl) in blink (tracking bug)». bugs.chromium.org. Consultado em 13 de Agosto de 2024 
  20. Minute Physics (20 de Março de 2015). «Computer Color is Broken». YouTube. Cópia arquivada em 22 de Novembro de 2021 
  21. Novak, John (21 de Setembro de 2016). «What every coder should know about gamma» 
  22. «Gamma Correction vs. Premultiplied Pixels – Søren Sandmann Pedersen». ssp.impulsetrain.com 
  23. McGuire, Morgan; Bavoil, Louis (2013). «Weighted Blended Order-Independent Transparency». Journal of Computer Graphics Techniques. 2 (2): 122–141 

Ligações externas

[editar | editar código fonte]