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?

52
demandé sur unwind 2009-04-14 13:41:44

3 réponses

l'équation de mélange standard est:

out = alpha * new + (1 - alpha) * old

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.

84
répondu unwind 2009-04-14 09:53:50

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) .

31
répondu Peter Perháč 2011-09-19 10:07:58

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]

4
répondu Daniel Peñalba 2016-03-18 16:48:35