Discusión sobre el artículo "Estudiamos la clase CCanvas. Implementación de la transparencia de los objetos gráficos" - página 6

 
Nikolai Semko:

Eso, Peter, es demasiado fácil.

Aquí tienes una tarea para que domines y consolides la esencia de la pregunta:

- ¿cómo mezclar dos colores ARGB(a1,r1,g1,b1) y ARGB(a2,r2,g2,b2) dentro de una capa, cada uno de los cuales tiene su propia transparencia a1 y a2?

Sin esta mezcla, es imposible superponer correctamente objetos suavizados.

De un vistazo rápido: Sobre el color de la capa inicial superponemos el primer ARGB(a1,r1,g1,b1) utilizando el método descrito en el artículo. A continuación, sobre el primer color aplicamos el segundo, realizando los cálculos ARGB según la misma fórmula. Sólo que esta vez, el color inferior será el primero, que ponemos sobre el color original de la capa.

Puede que me equivoque, Nikolai, pero ¿por qué no iba a funcionar?

ZY. Aún no he experimentado, pero es posible que la primera opción no funcione porque la transparencia final de las dos capas superiores se calcula incorrectamente. En este caso, tienes que mezclar la capa del medio con la capa superior, y habiendo obtenido su color común, superponerla sobre la capa original.

 
Реter Konow:

De forma rápida: Sobre el color de la capa inicial superponemos el primer ARGB(a1,r1,g1,b1) siguiendo el método descrito en el artículo. A continuación, sobre el primer color aplicamos el segundo, realizando los cálculos ARGB según la misma fórmula. Sólo que esta vez, el color inferior será el primero, que ponemos sobre el color de la capa inicial.

Quizá me equivoque, Nikolai, pero ¿por qué no iba a funcionar?

ZY. Aún no he experimentado, pero es posible que la primera opción no funcione porque la transparencia final de las dos capas superiores se calcula incorrectamente. En este caso, tienes que mezclar la capa del medio con la capa superior, y una vez obtenido su color común, superponerla sobre la capa original.

En realidad, no es una tarea fácil.
Pero quien sea capaz de resolverla por sí mismo, puede considerarse con razón un gurú del color.
Este artículo está lejos de ser académico precisamente por la ausencia de esta fórmula.
 
Nikolai Semko:
en realidad es un reto, no es fácil.
Pero quien sea capaz de resolverlo por sí mismo, puede ser considerado con razón un gurú del color.

¿Cómo? ¿Has experimentado tú mismo? Probablemente el color superior como un filtro a utilizar, calcular cada componente (rgb) de la capa inferior en proporción al nivel del componente correspondiente de la capa superior y la transparencia (se determina cuánto de lo que pasará de la parte inferior a través de la parte superior). A continuación, volver a calcular los niveles de los componentes de la parte superior de acuerdo con la opacidad (se determina cuánto queda de la parte superior). Al final, calcula la media de cada componente de las capas inferior y superior (no las originales inferior y superior, sino las recalculadas, como está escrito). No lo he probado.

Bueno, o simplemente sumar los componentes en proporción a la transparencia.

Tendré que experimentar... interesante tarea.

 
Dmitry Fedoseev:

¿Cómo? ¿Ha experimentado con ello usted mismo?

Resolví este problema hace cuatro años, pero con mucha lluvia de ideas.
Publicaré la solución si veo mucha actividad cerebral y nadie encuentra la solución.
 

Uffff... Todo resultó ser mucho más sencillo, sin necesidad de filtrar antes de apilar. Los componentes se añaden simplemente en proporción a la transparencia y la opacidad:

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

Alfa: 255 - la capa superior es opaca, 0 - totalmente transparente.

lr, lg, lb - componentes de la capa inferior.

ur, ug, ub - componentes de la capa superior.

Aquí en el terminal, fondo negro, cuadrado rojo opaco, sobre él azul con 50% de transparencia y luego amarillo con 50% de transparencia.

Aquí es lo mismo en photoshop:


 
Dmitry Fedoseev:

Uffff... Todo resultó ser mucho más sencillo, sin necesidad de filtrar antes de apilar. Los componentes se añaden simplemente en proporción a la transparencia y la opacidad:

Alfa: 255 - la capa superior es opaca, 0 - totalmente transparente.

lr, lg, lb - componentes de la capa inferior.

ur, ug, ub - componentes de la capa superior.

Cuando llegue a mi ordenador, voy a tratar de mezclar dos imágenes transparentes utilizando este flrmula y ver qué pasa. :))
 
Nikolai Semko:
Voy a llegar a mi ordenador, voy a tratar de mezclar dos imágenes transparentes utilizando este flrmula y ver qué pasa. :))

¿Cómo se mezclan dos transparentes? La primera se superpone al fondo, luego la segunda se superpone al resultado.

En general, también se puede doblar dos transparentes de alguna manera, y luego se superpone sobre el fondo, pero ahora no se trata de eso.

***

Lo que sería particularmente interesante es aprender todos los métodos de superposición de capas como en Photoshop.

 
Dmitry Fedoseev:

Uffff... Todo resultó ser mucho más sencillo, sin necesidad de filtrar antes de apilar. Los componentes se añaden simplemente en proporción a la transparencia y la opacidad:

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

Alfa: 255 - la capa superior es opaca, 0 - totalmente transparente.

lr, lg, lb - componentes de la capa inferior.

ur, ug, ub - componentes de la capa superior.

Aquí en la terminal, fondo negro, cuadrado rojo opaco, sobre él azul con 50% de transparencia y luego amarillo con 50% de transparencia.

Aquí lo mismo en photoshop:

no es que ...

el punto es que hay Alpha1 y Alpha2.

por lo que necesita para calcular no sólo los colores de mezcla de nueva formación, sino también la transparencia de nueva formación.

Esencialmente has repetido la fórmula del autor del artículo mezclando color transparente con fondo:

result=backgraund*(1-alpha)+foreground

y lo has hecho:

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

Tu variante es correcta, pero el autor del artículo se equivocó en una simple fórmula, y tiene gracia que Peter le agradezca esta fórmula :))))

Al fin y al cabo, se puede ver a simple vista que el desbordamiento de uchar se produce fácilmente en la fórmula del autor. Es extraño que nadie haya visto este craso error durante 4 años.

 

aquí es donde se aplica el algoritmo de mezcla de otros colores transparentes:


 
¿Por qué mezclar dos capas transparentes y luego aplicarlas? Aplique primero una capa y luego la otra.