Discussão do artigo "Estudando a Classe CCanvas. Como Desenhar Objetos Transparentes" - página 6

 
Nikolai Semko:

Isso, Peter, é muito fácil.

Aqui está uma tarefa para você dominar e consolidar a essência da pergunta:

- como misturar duas cores ARGB(a1,r1,g1,b1) e ARGB(a2,r2,g2,b2) em uma camada, cada uma com sua própria transparência a1 e a2?

Sem essa mistura, é impossível sobrepor corretamente objetos com suavização de serrilhado uns sobre os outros.

Em uma rápida olhada: Na cor da camada inicial, sobrepomos a primeira cor ARGB (a1,r1,g1,b1) usando o método descrito no artigo. Em seguida, em cima da primeira cor, aplicamos a segunda, fazendo cálculos ARGB de acordo com a mesma fórmula. Só que, desta vez, a cor inferior será a primeira, que colocamos sobre a cor da camada original.

Posso estar errado, Nikolai, mas por que isso não funcionaria?

ZY: Ainda não fiz experimentos, mas a primeira opção pode não funcionar porque a transparência final das duas camadas superiores é calculada incorretamente. Nesse caso, você precisa misturar a camada do meio com a camada superior e, depois de obter a cor comum delas, sobrepô-la à camada original.

 
Реter Konow:

Em uma rápida olhada: Na cor da camada inicial, sobrepomos o primeiro ARGB (a1,r1,g1,b1) usando o método descrito no artigo. Em seguida, sobre a primeira cor, aplicamos a segunda, fazendo cálculos ARGB de acordo com a mesma fórmula. Só que, desta vez, a cor inferior será a primeira, que colocamos sobre a cor da camada inicial.

Talvez eu esteja errado, Nikolai, mas por que isso não funcionaria?

ZY: Ainda não experimentei, mas a primeira opção pode não funcionar porque a transparência final das duas camadas superiores é calculada incorretamente. Nesse caso, você precisa misturar a camada do meio com a camada superior e, depois de obter a cor comum delas, sobrepô-la à camada original.

Na verdade, essa não é uma tarefa fácil.
Mas quem conseguir resolvê-la por conta própria pode ser considerado um guru das cores.
Este artigo está longe de ser acadêmico justamente por causa da ausência dessa fórmula.
 
Nikolai Semko:
Na verdade, é um desafio, e não um desafio fácil.
Mas quem conseguir resolvê-lo sozinho pode ser considerado, com razão, um guru das cores.

Como? Você mesmo já fez experiências com isso? Provavelmente a cor superior como um filtro a ser usado, calcule cada componente (rgb) da camada inferior em proporção ao nível do componente correspondente da camada superior e à transparência (é determinado quanto do que passará da camada inferior para a superior). Em seguida, recalcule os níveis dos componentes da camada superior de acordo com a opacidade (é determinado quanto permanece da camada superior). No final, calcule a média de cada componente das camadas inferior e superior (não a inferior e a superior originais, mas as recalculadas, conforme escrito). Não tentei fazer isso.

Bem, ou simplesmente some os componentes em proporção à transparência.

Terei que fazer experiências... tarefa interessante.

 
Dmitry Fedoseev:

Como? Você mesmo já fez experiências com isso?

Resolvi esse problema há quatro anos, mas com muito brainstorming.
Publicarei a solução se houver muita atividade cerebral e ninguém encontrar a solução.
 

Uffff... Tudo acabou sendo muito mais simples, não há necessidade de filtrar antes de empilhar. Os componentes são simplesmente adicionados em proporção à transparência e à opacidade:

r=lr*(255-Alpha)/255+ur*Alpha/255;
g=lg*(255-Alpha)/255+ug*Alpha/255;
b=lb*(255-Alpha)/255+ub*Alpha/255;

Alpha: 255 - a camada superior é opaca, 0 - totalmente transparente.

lr, lg, lb - componentes da camada inferior.

ur, ug, ub - componentes da camada superior.

Aqui no terminal, fundo preto, quadrado vermelho opaco, azul com 50% de transparência e, em seguida, amarelo com 50% de transparência.

Aqui está a mesma coisa no photoshop:


 
Dmitry Fedoseev:

Uffff... Tudo acabou sendo muito mais simples, não há necessidade de filtrar antes de empilhar. Os componentes são simplesmente adicionados em proporção à transparência e à opacidade:

Alpha: 255 - a camada superior é opaca, 0 - totalmente transparente.

lr, lg, lb - componentes da camada inferior.

ur, ug, ub - componentes da camada superior.

Quando chegar ao meu computador, tentarei misturar duas imagens transparentes usando essa fórmula e verei o que acontece. :))
 
Nikolai Semko:
Vou acessar meu computador, tentarei misturar duas imagens transparentes usando essa fórmula e verei o que acontece. :))

Como você mistura duas imagens transparentes? A primeira é sobreposta ao plano de fundo e, em seguida, a segunda é sobreposta ao resultado.

Em geral, você também pode dobrar duas imagens transparentes de alguma forma e, em seguida, sobrepô-las ao plano de fundo, mas agora não se trata disso.

***

O que seria particularmente interessante é aprender todos os métodos de sobreposição de camadas como no Photoshop.

 
Dmitry Fedoseev:

Uffff... Tudo acabou sendo muito mais simples, não há necessidade de filtrar antes de empilhar. Os componentes são simplesmente adicionados em proporção à transparência e à opacidade:

r=lr*(255-Alpha)/255+ur*Alpha/255;
g=lg*(255-Alpha)/255+ug*Alpha/255;
b=lb*(255-Alpha)/255+ub*Alpha/255;

Alpha: 255 - a camada superior é opaca, 0 - totalmente transparente.

lr, lg, lb - componentes da camada inferior.

ur, ug, ub - componentes da camada superior.

Aqui no terminal, fundo preto, quadrado vermelho opaco, azul com 50% de transparência e amarelo com 50% de transparência.

Aqui está a mesma coisa no Photoshop:

não é isso ...

A questão é que existe o Alpha1 e o Alpha2.

Portanto, você precisa calcular não apenas as cores de mistura da nova formação, mas também a transparência da nova formação.

Basicamente, você repetiu a fórmula do autor do artigo, misturando a cor transparente com o plano de fundo:

result=backgraund*(1-alpha)+foreground

e assim o fez:

result=backgraund*(1-alpha)+foreground*alpha

Sua variante está correta, mas o autor do artigo cometeu um erro em uma fórmula simples, e é engraçado que Peter o agradeça por essa fórmula :))))

Afinal, você pode ver a olho nu que o estouro de uchar ocorre facilmente na fórmula do autor. É estranho que ninguém tenha visto esse erro grosseiro por 4 anos.

 

É aqui que o algoritmo de mistura de outras cores transparentes é aplicado:


 
Por que misturar duas camadas transparentes e depois aplicá-las? Aplique uma camada primeiro e depois a outra.