J'aimerais comprendre comment est calculée une couleur d'un élément HTML lorsque la propriété opacity lui est appliquée.
Prenons cet exemple :
J'ai d'abord utilisé la formule du "simple alpha compositing"
https://www.w3.org/TR/compositing-1/#simplealphacompositing
co = Cs x as + Cb x ab x (1 - as)
ao = as + ab x (1 - as)
J'applique cette formule dans mon exemple,
Cs et as sont la couleur et l'alpha du div2,
Cb et ab sont la couleur et l'alpha du div1.
co = ( 0 , 77/255 , 100/255 ) * 0.8 + ( 155/255 , 66/255 , 200/255 ) * 0.5 * ( 1 - 0.8 )
co = ( 0.06 , 0.267 , 0.392 )
ao = 0.8 + 0.5 * ( 1 - 0.8 )
ao = 0.9
le résultat, co, est une valeur prémultipliée.
Pour trouver la couleur associée , il faut diviser co par ao. On note Co (majuscule), Co = co/ao.
Mais je vais appliquer la propriété "opacity" sur la valeur prémultipliée, co et sur l'alpha ao.
co * opacity = ( 0.06 , 0.267 , 0.392 ) * 0.6
ao * opacity = 0.9 * 0.6
co * opacity = ( 0.036 , 0.1602 , 0.2352 )
ao * opacity = 0.54
Maintenant j'extraie la couleur en divisant ( 0.036 , 0.1602 , 0.2352 ) par 0.54.
ce qui donne ( 0.036/0.54 , 0.1602/0.54 , 0.2352/0.54) = ( 0.07 , 0.27 , 0.43 ).
Cette couleur , ( 0.07 , 0.27 , 0.43 ) , je la compose avec la couleur de fond, (celle de l'élément <body> qui est blanc ( 1,1,1).
( 0.07 , 0.27 , 0.43 ) * 0.54 + ( 1 , 1 , 1 ) * 1 * ( 1 - 0.54 ) =
(0.49 , 0.6 , 0.232 )
Ce résultat correspond à la couleur obtenue :
Alors voilà ma question :
La façon dont j'ai calculée la couleur obtenue je l'ai obtenue après plusieurs essais, je n'ai pas trouvé de site qui donne clairement le mode de calcul.
Notamment, pourquoi l'opacité est appliquée sur la valeur prémultipliée ?
Et où trouver les explications détaillées du calcul de couleur .
J'ai posé la question sur w3c : https://github.com/w3c/csswg-drafts/issues/7718
mais pas de réponse claire.
Le site stackoverflow est pas mal, mais la compréhension de l'anglais ajoute une dimension au problème !
Bon je m'étais complétement embrouillé...
La solution est bien plus simple :
Quand un élément contient une couleur rgba(r,g,b,a) et la propriété opacity,
la couleur résultant est donnée par la formule :
(r , g , b , a * opacity )
Modifié par letochagone (14 Sep 2022 - 22:24)
Prenons cet exemple :
#div1 {
opacity: 0.6;
background-color: rgba( 155 , 66 , 200 , 0.5 );
width:200px;
height: 200px;
}
#div2 {
background-color: rgba( 0, 77 , 100 , 0.8 );
width: 200px;
height: 200px;
}
<div id="div1" >
<div id= "div2"></div>
</div>
J'ai d'abord utilisé la formule du "simple alpha compositing"
https://www.w3.org/TR/compositing-1/#simplealphacompositing
co = Cs x as + Cb x ab x (1 - as)
ao = as + ab x (1 - as)
J'applique cette formule dans mon exemple,
Cs et as sont la couleur et l'alpha du div2,
Cb et ab sont la couleur et l'alpha du div1.
co = ( 0 , 77/255 , 100/255 ) * 0.8 + ( 155/255 , 66/255 , 200/255 ) * 0.5 * ( 1 - 0.8 )
co = ( 0.06 , 0.267 , 0.392 )
ao = 0.8 + 0.5 * ( 1 - 0.8 )
ao = 0.9
le résultat, co, est une valeur prémultipliée.
Pour trouver la couleur associée , il faut diviser co par ao. On note Co (majuscule), Co = co/ao.
Mais je vais appliquer la propriété "opacity" sur la valeur prémultipliée, co et sur l'alpha ao.
co * opacity = ( 0.06 , 0.267 , 0.392 ) * 0.6
ao * opacity = 0.9 * 0.6
co * opacity = ( 0.036 , 0.1602 , 0.2352 )
ao * opacity = 0.54
Maintenant j'extraie la couleur en divisant ( 0.036 , 0.1602 , 0.2352 ) par 0.54.
ce qui donne ( 0.036/0.54 , 0.1602/0.54 , 0.2352/0.54) = ( 0.07 , 0.27 , 0.43 ).
Cette couleur , ( 0.07 , 0.27 , 0.43 ) , je la compose avec la couleur de fond, (celle de l'élément <body> qui est blanc ( 1,1,1).
( 0.07 , 0.27 , 0.43 ) * 0.54 + ( 1 , 1 , 1 ) * 1 * ( 1 - 0.54 ) =
(0.49 , 0.6 , 0.232 )
Ce résultat correspond à la couleur obtenue :
Alors voilà ma question :
La façon dont j'ai calculée la couleur obtenue je l'ai obtenue après plusieurs essais, je n'ai pas trouvé de site qui donne clairement le mode de calcul.
Notamment, pourquoi l'opacité est appliquée sur la valeur prémultipliée ?
Et où trouver les explications détaillées du calcul de couleur .
J'ai posé la question sur w3c : https://github.com/w3c/csswg-drafts/issues/7718
mais pas de réponse claire.
Le site stackoverflow est pas mal, mais la compréhension de l'anglais ajoute une dimension au problème !
Bon je m'étais complétement embrouillé...
La solution est bien plus simple :
Quand un élément contient une couleur rgba(r,g,b,a) et la propriété opacity,
la couleur résultant est donnée par la formule :
(r , g , b , a * opacity )
Modifié par letochagone (14 Sep 2022 - 22:24)