Comment calculer une couleur RVB en spécifiant un montant de mélange alpha?
j'écris un capteur de couleur qui obtient les valeurs pixel RVB de l'endroit où vous pointez sur l'écran. Je veux aussi avoir la possibilité d'indiquer que la couleur j'ai choisi a déjà une valeur alpha. Je me demande comment je peux calculer la couleur obtenue.
par exemple:
la couleur de pixel résultante est 240,247,249 mais je sais que la couleur originale avait une opacité de 10% et était sur un fond blanc (255,255,255). Quel est le calcul pour calculer les valeurs RVB originales?
3 réponses
l'équation de mélange standard est:
out = alpha * new + (1 - alpha) * old
où out
, new
et old
sont des couleurs RGB, et alpha
est un nombre de virgule flottante dans la gamme [0,1].
donc, vous avez (pour rouge):
240 = 0.1 * newR + 0.9 * 255
résoudre pour newR
, nous obtenons:
newR = (240 - 0.9 * 255) / 0.1
qui évalue à 105. Répétez pour les autres composants, et c'est fini.
je me demande juste pourquoi vous connaissez son alpha et pas son r,g,B... À moins que le mode de mélange utilisé soit dans tous les cas Normal, vous ne serez pas en mesure de calculer la valeur originale. Et même si tout est idéal, vous ne pourrez qu'approximer, car certains arrondissements ont probablement déjà eu lieu lors du passage de l'original au résultat. En outre, vous aurez probablement à arrondir lors de revenir du résultat à l'original.
si le mode de mélange est Normal, alors ce n'est pas trop difficile: -)
opacity*original + (1-opacity)*background = resulting pixel
original R = (resulting R - ((1-opacity)*background R)) / opacity.
original G = (resulting G - ((1-opacity)*background G)) / opacity.
original B = (resulting B - ((1-opacity)*background B)) / opacity.
dans laquelle l'opacité est (alpha/100)
.
le pseudo-code suivant résout votre problème:
CalculateSolidColorFromTransparentColor(Color color, Color background)
{
alpha = color.A / 255;
oneminusalpha = 1 - alpha;
newR = ((color.R * alpha) + (oneminusalpha * background.R));
newG = ((color.G * alpha) + (oneminusalpha * background.G));
newB = ((color.B * alpha) + (oneminusalpha * background.B));
}
noter que la couleur d'entrée et le groupe arrière ont des valeurs exprimées en [0..255]