Alfa pré-multiplicado
Em computação gráfica, existem duas maneiras diferentes de representar a opacidade de um valor de cor. O Win2D usa os dois métodos. Este artigo explica a diferença e qual é usado onde.
Alfa direto
Ao usar alfa reto, também conhecido como linear:
- Os valores RGB especificam a cor da coisa que está sendo desenhada
- O valor alfa especifica o quão sólido ele é
Neste mundo, RGB e alfa são independentes. Você pode alterar um sem afetar o outro. Para fazer um objeto desaparecer, você reduziria gradualmente seu valor alfa, deixando o RGB inalterado.
Para executar uma mesclagem de origem entre duas cores que usam o formato alfa direto:
result = (source.RGB * source.A) + (dest.RGB * (1 - source.A))
Alfa pré-multiplicado
Ao usar alfa pré-multiplicado:
- RGB especifica quanta cor a coisa que está sendo desenhada contribui para a saída
- O valor alfa especifica o quanto ele obscurece o que está por trás dele
Neste mundo, RGB e alfa estão ligados. Para tornar um objeto transparente, você deve reduzir seu RGB (para contribuir com menos cor) e também seu alfa (para obscurecer menos o que está por trás dele). Objetos totalmente transparentes não têm mais nenhuma cor, portanto, há apenas um valor que representa 100% de transparência: RGB e alfa todos zero.
Para executar uma mesclagem de origem entre duas cores que usam o formato alfa pré-multiplicado:
result = source.RGB + (dest.RGB * (1 - source.A))
O alfa pré-multiplicado é usado na renderização de gráficos porque fornece melhores resultados do que o alfa direto ao filtrar imagens ou compor diferentes camadas. Para obter mais informações, consulte estas postagens do blog:
Alfa em Win2D
O Win2D usa alfa direto em sua superfície de API, mas alfa pré-multiplicado para operações de renderização internas.
Windows.UI.Color
Os valores usam alfa direto. Sempre que você passa uma cor para um Draw*
método or Fill*
, define a cor de um pincel ou limpa para um valor de cor, essa cor é especificada usando alfa direto.
Os valores de pixel armazenados em um bitmap ou rendertarget e as operações de desenho ou mesclagem que operam nessas superfícies usam alfa pré-multiplicado. Quando os bitmaps são carregados de um arquivo, seu conteúdo é convertido automaticamente em formato pré-multiplicado. Quando você chama um método de desenho Win2D, seu parâmetro de cor é convertido de direto para pré-multiplicado antes que o desenho real ocorra.
Os efeitos de imagem Win2D usam uma mistura de alfa direto e pré-multiplicado. Alguns efeitos operam em um formato, outros no outro, e alguns fornecem uma propriedade para escolher. A documentação de cada tipo de efeito descreve qual modo alfa ele usa. Os dados de entrada do efeito são sempre considerados pré-multiplicados, portanto, quando um efeito precisa funcionar com alfa direto, ele primeiro aplica uma transformação não pré-multiplicada, calcula o efeito e, em seguida, re-pré-multiplica a saída.
As APIs GetPixelBytes
de bitmap , SetPixelBytes
, GetPixelColors
e SetPixelColors
, não executam nenhuma conversão de formato alfa. Eles apenas transferem valores de bits diretamente de ou para a textura subjacente da GPU. Isso permite que você observe qual formato alfa o Win2D está usando internamente:
- Criar uma sessão de desenho em um rendertarget
- Chama
drawingSession.Clear(Colors.Tranparent)
Colors.Tranparent
é definido como R = 255, G = 255, B = 255, A = 0- O Win2D converterá esse valor para o formato pré-multiplicado, gerando R = 0, G = 0, B = 0, A = 0
- Use
GetPixelColors
para ler o conteúdo do rendertarget - Observe que ele contém o formato pré-multiplicado RGB = 0, não RGB = 255 como o valor alfa
Colors.Tranparent
direto original
Conversão entre formatos alfa
Para converter um valor de cor alfa direto para o formato pré-multiplicado, multiplique seus valores R, G e B por A. Para converter pré-multiplicado em reto, divida R, G e B por A.
Observe que as informações de cor geralmente são representadas como valores de bytes que variam de 0 a 255 (por exemplo, a Windows.UI.Color
estrutura consiste em 4 bytes). Essa representação é ampliada por um fator de 255, portanto, um valor de byte de 255 na verdade significa 1, enquanto 128 é metade da intensidade. Esse fator de escala deve ser levado em consideração durante as conversões de formato, portanto, para converter um Windows.UI.Color
de direto para pré-multiplicado:
premultiplied.R = (byte)(straight.R * straight.A / 255);
premultiplied.G = (byte)(straight.G * straight.A / 255);
premultiplied.B = (byte)(straight.B * straight.A / 255);
premultiplied.A = straight.A;
Se você tiver dados de imagem que estão usando o formato PremultiplyEffect
alfa errado ou UnPremultiplyEffect
podem ser usados para convertê-los.
Windows developer