2009-04-14 4 views
49

Ich schreibe einen Farbwähler, der die Pixel-RGB-Werte von überall erhält, wo Sie auf den Bildschirm zeigen. Ich möchte auch angeben können, dass die ausgewählte Farbe bereits einen Alpha-Wert hat. Ich frage mich nur, wie ich die resultierende Farbe berechnen kann.Wie berechnet man eine RGB-Farbe durch Angabe einer Alpha-Mischmenge?

Zum Beispiel:

Die resultierende Pixelfarbe ist 240.247.249, aber ich weiß, dass die ursprüngliche Farbe, um eine 10% Opazität und war auf einen weißen (255,255,255) Hintergrund. Wie berechnet man die ursprünglichen RGB-Werte?

Antwort

80

Die Standardmischgleichung lautet:

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

Wo out, new und old RGB-Farben sind, und alpha ist eine Gleitkomma-Zahl im Bereich [0,1].

Also, Sie haben (für rot):

240 = 0.1 * newR + 0.9 * 255 

für newR lösen, erhalten wir:

newR = (240 - 0.9 * 255)/0.1 

, die für die anderen Komponenten zu 105 Repeat auswertet, und Sie sind fertig .

+1

? ist deine Gleichung nicht die gleiche wie meine? –

+0

Ja, ich die Gleichungen sind die gleichen, aber etwas anders geschrieben. – unwind

+2

Wow! Ich habe zwei Stunden lang meine Haare gezogen und versucht, diese Gleichung durch Vergleichen der Werte in Photoshop nachzubilden! Danke, dass du meinen Haarausfall verlangsamt hast! Wie hast du diese Gleichung gefunden oder gefunden? – talentedmrjones

31

Ich frage mich nur, woher Sie wissen, seine alpha und nicht seine r, g, b ... Wenn die verwendete Mischmodus in jedem Fall Normal ist, werden Sie nicht in der Lage sein, den ursprünglichen Wert zu berechnen. Und selbst wenn alles ideal ist, können Sie sich nur annähern, da einige Rundungen wahrscheinlich schon beim Übergang vom Original zum Ergebnis stattgefunden haben. Außerdem müssen Sie wahrscheinlich beim Zurückgehen vom Ergebnis zum Original runden.

Wenn der Mischmodus normal ist, dann ist es nicht zu schwierig :-)

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. 

, in der Opazität (alpha/100) ist.

+0

Sorry, ich erwähnt habe, sollte, dass der Mischmodus war normal. Ich wählte die Farbe von einer Webseite aus, die ein Bild mit einem Deckkraft-Set hatte, also wusste ich, dass es nicht nur rgb war. Danke trotzdem. –

3

Der folgende Pseudo-Code löst Ihr Problem:

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)); 
    } 

Beachten Sie, dass Eingangsfarbe und backgroud hat drückten Werte in [0..255]

Verwandte Themen