11
votes

formule pour la valeur alpha lors du mélange de deux couleurs transparentes

Permet de supposer un alpha de 1 signifie complètement opaque et 0 signifie complètement transparent. disons que j'ai deux images noires qui ont une transparence de 50% (alpha = 0,5).

S'ils sont déposés les uns sur les autres, la transparence résultante est de 0,75, non? P>

si elles auraient un alpha de 0,25, le résultat serait d'environ 0,5, non? p>

S'ils auraient un alpha de 0,9, le résultat serait d'environ 0,97, non? P>

Comment pouvez-vous obtenir à ces chiffres? p>

En d'autres termes, je cherche une fonction qui obtient la valeur alpha résultante de deux autres valeur alpha. P>

float alpha = f(float alphaBelow, float alphaAbove)
{
     //TODO implement
}


2 commentaires

De manière classique, la couleur est opaque lorsque Alpha = 1 et totalement transparent lorsqu'il est alpha = 0. de sorte que l'alpha résultant de la pose de 50% sur 50% devrait être de 25%, et non 75%.


@KennyTM, OK, je vais éditer mon message pour travailler avec des flotteurs de 0 à 1


3 Réponses :


7
votes
float blend(float alphaBelow, float alphaAbove)
{
    return alphaBelow + alphaAbove - alphaBelow * alphaAbove;
}
This function assumes both parameters are 0..1, where 0 is fully transparent and 1 is fully opaque.

1 commentaires

Merci, c'est presque comme si mon résultat souhaité. C'est juste que lorsque je comparais le résultat avec deux images les unes sur les autres dans Photoshop, la version Photoshop semble avoir une faible valeur alpha plus élevée.



4
votes

Photoshop fait le calcul suivant:

float blend(float alphaBelow, float alphaAbove)
{
    return min(1,alphaBelow+(1-alphaBelow)*alphaAbove);
}


1 commentaires

Le min est redondant si les deux entrées sont dans la plage 0..1.



8
votes

Cette réponse est mathématiquement la même chose que La réponse de Jason , mais c'est la formule réelle que vous le trouverez dans le matériel de référence.

float blend(float alphaBelow, float alphaAbove) 
{ 
    return alphaBelow + (1.0 - alphaBelow) * alphaAbove; 
} 


0 commentaires