17

Próbuję wykonać operację mieszania alfa obrazu RGBA (obraz pierwszego planu) na obrazie RGB (obraz w tle). Jednak robiąc to, myślę, że mogę wykonać niewłaściwą operację mieszania alfa lub zrobić to źle. Na przykład piksel mojego obrazu RGB ma szarawy kolor (127, 127, 127). Piksel mojego obrazu RGBA dla piksela będzie wynosił (0, 0, 255). Po wykonaniu operacji mieszania ostateczny kolor będzie (127, 0, 255). Jednak myślałem, że to bardziej mieszanka dodatków i różni się od operacji, którą wykonuję.Ręczne mieszanie alfa piksela RGBA z pikselem RGB

Na jak moje wartości są ustawione, przyjrzeć się tej

incPixelColor[0] = 0; (red) 
incPixelColor[1] = 0; (green) 
incPixelColor[2] = 255; (blue) 
incPixelColor[3] = 255; (alpha) 

currentPixelColor[0] = 127; (red) 
currentPixelColor[1] = 127; (green) 
currentPixelColor[2] = 127; (blue) 

na jak moje obliczenia są ustawione, przyjrzeć się tej

float incAlpha = (currentPixelColor[3]/255.0f); 

float red = ((float)incPixelColor[0]/255.0f * incAlpha) + ((float)currentPixelColor[0]/255.0f); 
float green = ((float)incPixelColor[1]/255.0f * incAlpha) + ((float)currentPixelColor[1]/255.0f); 
float blue = ((float)incPixelColor[2]/255.0f * incAlpha) + ((float)currentPixelColor[2]/255.0f); 


currentPixelColor[0] = min(red * 255, 255.0f); 
currentPixelColor[1] = min(green * 255, 255.0f); 
currentPixelColor[2] = min(blue * 255, 255.0f); 

pikseli bez kanału alfa, chciałbym na przykład dla wartości (0, 0, 255), a następnie dla obrazów z alfą chciałbym, aby się wtopiła. Pod koniec powyższej operacji będzie to (127, 127, 255). Czy powinienem sprawdzić, czy istnieje alfa dla każdego piksela, a jeśli tak, to czy jest to mieszanka, czy jest inny sposób na zrobienie tego?

+0

Robisz addytywne mieszanie. Rozważmy liniowe mieszanie w następujący sposób: y = (x0 * w) + (x1 * (1-w)) –

+1

To dużo 255 skalowania w przód iw tył. Nie powinno być konieczne, jeśli twoje operacje utrzymują normalizację. – fche

Odpowiedz

22

Typowa „Over” mieszanki odbywa się w następujący sposób:

outputRed = (foregroundRed * foregroundAlpha) + (backgroundRed * (1.0 - foregroundAlpha)); 

A potem powtarzać dla niebieskich i zielonych kanałów. Zrób to dla każdego piksela.

+0

Być może się mylę, ale czy to już nie jest to, co już robię? – mmurphy

+0

Nie, co robisz jest outputRed = (foreRed * foreAlpha) + backgroundRed. Musisz pomnożyć backgroundRed przez (1.0 - foreAlpha). – user1118321

+0

Przepraszam, że tak późno, ale co się stanie z kanałem alfa wyjściowym alfa, jeśli piksele docelowe i źródłowe są przezroczyste? –

2

Wydaje się, że przegapiłem (1-alfa) mnożnik dla tła (currentPixelColor)

Powiązane problemy