Discussion de l'article "Étudier la classe CCanvas. Comment dessiner des objets transparents" - page 6

 
Nikolai Semko:

C'est trop facile, Peter.

Voici une tâche qui vous permettra de maîtriser et de consolider l'essence de la question :

- comment mélanger deux couleurs ARGB(a1,r1,g1,b1) et ARGB(a2,r2,g2,b2) au sein d'un même calque, chacune ayant sa propre transparence a1 et a2 ?

Sans ce mélange, il est impossible de superposer correctement des objets anticrénelés.

D'un coup d'œil rapide : sur la couleur du calque initial, nous superposons la première couleur ARGB(a1,r1,g1,b1) en utilisant la méthode décrite dans l'article. Ensuite, par-dessus la première couleur, nous appliquons la seconde, en effectuant des calculs ARGB selon la même formule. Cette fois-ci, la couleur du bas sera la première, que nous appliquons sur la couleur du calque d'origine.

Je peux me tromper, Nikolaï, mais pourquoi cela ne fonctionnerait-il pas ?

ZY. Je n'ai pas encore expérimenté, mais la première option peut ne pas fonctionner parce que la transparence finale des deux couches supérieures est calculée de manière incorrecte. Dans ce cas, vous devez mélanger la couche intermédiaire avec la couche supérieure et, après avoir obtenu leur couleur commune, la superposer à la couche d'origine.

 
Реter Konow:

En un coup d'œil : sur la couleur du calque initial, nous superposons la première couleur ARGB (a1,r1,g1,b1) en utilisant la méthode décrite dans l'article. Ensuite, par-dessus la première couleur, nous appliquons la seconde, en effectuant des calculs ARGB selon la même formule. Cette fois-ci, la couleur du bas sera la première, que nous appliquons sur la couleur de la couche initiale.

Je me trompe peut-être, Nikolaï, mais pourquoi cela ne fonctionnerait-il pas ?

ZY. Je n'ai pas encore expérimenté, mais la première option peut ne pas fonctionner parce que la transparence finale des deux couches supérieures est calculée de manière incorrecte. Dans ce cas, vous devez mélanger la couche intermédiaire avec la couche supérieure et, après avoir obtenu leur couleur commune, la superposer à la couche d'origine.

Ce n'est pas une tâche facile.
Mais celui qui parvient à la résoudre seul peut être considéré à juste titre comme un gourou de la couleur.
Cet article est loin d'être académique précisément en raison de l'absence de cette formule.
 
Nikolai Semko:
Il s'agit en fait d'un défi, qui n'est pas facile à relever.
Mais celui qui parvient à le relever seul peut être considéré à juste titre comme un gourou de la couleur.

Comment ? L'avez-vous expérimenté vous-même ? Probablement la couleur supérieure comme filtre à utiliser, calculez chaque composante (rgb) de la couche inférieure proportionnellement au niveau de la composante correspondante de la couche supérieure et à la transparence (on détermine la quantité de ce qui passera de la couche inférieure à la couche supérieure), puis recalculez les niveaux des composantes de la couche supérieure en fonction de l'opacité (on détermine la quantité de ce qui reste de la couche supérieure). À la fin, calculer la moyenne de chaque composante des couches inférieure et supérieure (pas les couches inférieure et supérieure d'origine, mais celles qui ont été recalculées, comme écrit). Je n'ai pas essayé.

Ou alors, il suffit d'additionner les composantes proportionnellement à la transparence.

Il faudra que j'expérimente... tâche intéressante.

 
Dmitry Fedoseev:

Comment ? L'avez-vous expérimenté vous-même ?

J'ai résolu ce problème il y a quatre ans, mais avec beaucoup de remue-méninges.
Je publierai la solution si je constate qu'il y a beaucoup d'activité cérébrale et que personne ne trouve la solution.
 

Uffff... Tout s'est avéré beaucoup plus simple, il n'est pas nécessaire de filtrer avant d'empiler. Les composants sont simplement ajoutés proportionnellement à la transparence et à l'opacité :

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 - la couche supérieure est opaque, 0 - totalement transparente.

lr, lg, lb - composants de la couche inférieure.

ur, ug, ub - composants de la couche supérieure.

Ici dans le terminal, fond noir, carré rouge opaque, dessus bleu avec 50% de transparence puis jaune avec 50% de transparence.

Voici la même chose dans photoshop :


 
Dmitry Fedoseev:

Uffff... Tout s'est avéré beaucoup plus simple, il n'est pas nécessaire de filtrer avant d'empiler. Les composants sont simplement ajoutés proportionnellement à la transparence et à l'opacité :

Alpha : 255 - la couche supérieure est opaque, 0 - totalement transparente.

lr, lg, lb - composants de la couche inférieure.

ur, ug, ub - composants du calque supérieur.

Lorsque j'aurai mon ordinateur, j'essaierai de mélanger deux images transparentes à l'aide de cette formule et je verrai ce qui se passe. :))
 
Nikolai Semko:
Je vais aller sur mon ordinateur, je vais essayer de mélanger deux images transparentes en utilisant cette formule et voir ce qui se passe. :))

Comment mélanger deux images transparentes ? La première est superposée sur le fond, puis la seconde est superposée sur le résultat.

En général, vous pouvez aussi plier deux images transparentes d'une certaine manière, puis les superposer à l'arrière-plan, mais ce n'est pas le sujet aujourd'hui.

***

Ce qui serait particulièrement intéressant, c'est d'apprendre toutes les méthodes de superposition des calques comme dans Photoshop.

 
Dmitry Fedoseev:

Uffff... Tout s'est avéré beaucoup plus simple, il n'est pas nécessaire de filtrer avant d'empiler. Les composants sont simplement ajoutés proportionnellement à la transparence et à l'opacité :

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 - la couche supérieure est opaque, 0 - totalement transparente.

lr, lg, lb - composants de la couche inférieure.

ur, ug, ub - composants de la couche supérieure.

Ici dans le terminal, fond noir, carré rouge opaque, sur celui-ci bleu avec 50% de transparence puis jaune avec 50% de transparence.

Voici la même chose dans photoshop :

pas que...

le fait est qu'il y a Alpha1 et Alpha2.

Il faut donc calculer non seulement les couleurs de mélange de la nouvelle formation, mais aussi la transparence de la nouvelle formation.

Vous avez essentiellement répété la formule de l'auteur de l'article mélangeant la couleur transparente avec l'arrière-plan :

result=backgraund*(1-alpha)+foreground

et vous l'avez fait :

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

Votre variante est correcte, mais l'auteur de l'article a fait une erreur dans une formule simple, et il est amusant que Peter le remercie pour cette formule :))))

Après tout, on peut voir à l'œil nu que le débordement d'uchar se produit facilement dans la formule de l'auteur. Il est étrange que personne n'ait vu cette erreur grossière depuis 4 ans.

 

c'est ici que s'applique l'algorithme de mélange d'autres couleurs transparentes :


 
Pourquoi mélanger deux couches transparentes et les appliquer ensuite ? Appliquez d'abord une couche, puis l'autre.