2009-04-14 5 views
49

Piszę próbnik kolorów, który pobiera pikselowe wartości RGB z dowolnego miejsca na ekranie. Chcę również mieć możliwość określenia, że ​​wybrany przeze mnie kolor ma już wartość alfa. Zastanawiam się, jak mogę obliczyć kolor wynikowy.Jak obliczyć kolor RGB, określając wartość mieszania alfa?

Na przykład:

Uzyskany kolor piksela wynosi 240.247.249, ale wiem, że oryginalny kolor miał 10% krycia i był na wierzchu białym tle (255,255,255). Jakie są obliczenia, aby obliczyć oryginalne wartości RGB?

Odpowiedz

80

standardowego równania Mieszanie:

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

przypadku out, new i old są kolorów RGB i alpha jest liczba rzeczywista w przedziale [0,1].

Tak, masz (na czerwono):

240 = 0.1 * newR + 0.9 * 255 

Rozwiązywanie dla newR, otrzymujemy:

newR = (240 - 0.9 * 255)/0.1 

który ocenia na 105. Powtórz dla pozostałych składników i gotowe .

+1

? czy twoje równanie nie jest takie samo jak moje? –

+0

Tak, ja równania są takie same, ale napisane nieco inaczej. – unwind

+2

Wow! Odsunąłem włosy na 2 godziny, próbując odwrócić to równanie, porównując wartości w Photoshopie! Dziękuję za spowolnienie utraty włosów! Jak znalazłeś lub wymyśliłeś to równanie? – talentedmrjones

31

Zastanawiam się, skąd znasz jego alfę, a nie jej r, g, b ... O ile tryb mieszania nie jest w każdym przypadku normalny, nie będziesz w stanie obliczyć oryginalnej wartości. I nawet jeśli wszystko jest idealne, będziesz w stanie tylko przybliżać, ponieważ niektóre zaokrąglenia prawdopodobnie miały miejsce już podczas przechodzenia od oryginalnego do wyniku. Poza tym najprawdopodobniej będziesz musiał zaokrąglać, gdy wrócisz z wyniku do oryginalnego.

Jeśli tryb mieszania jest normalne, to nie jest zbyt trudne :-)

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. 

w którym zmętnienie jest (alpha/100).

+0

Niestety, to należy wspomnieć, że tryb mieszania wynosił normalna. Wybrałem kolor ze strony internetowej, która miała obraz z zestawem krycia, więc wiedziałem, że to nie tylko rgb. Dzięki i tak. –

3

Poniższy pseudokod rozwiązuje 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)); 
    } 

Należy zauważyć, że wejście i kolor backgroud ma wartość wyrażoną w [0..255]