algorithm - after - Mezclar manualmente un píxel RGBA con un píxel RGB
alpha channel after effects (3)
Estoy intentando realizar una operación de mezcla alfa de una imagen RGBA (imagen en primer plano), en una imagen RGB (imagen de fondo). Sin embargo, mientras lo hago, creo que puedo estar haciendo la operación de mezcla alfa equivocada o haciéndolo mal. Por ejemplo, el píxel de mi imagen RGB es un color grisáceo de (127, 127, 127). El píxel de mi imagen RGBA para el píxel será (0, 0, 255). Después de realizar mi operación de fusión, el color final será (127, 0, 255). Sin embargo, pensé que era más una mezcla aditiva y diferente a la operación que estoy haciendo.
Para ver cómo se establecen mis valores, mira esto
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)
Para ver cómo se establece mi cálculo, mira esto
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);
Para los píxeles sin alfa, me gustaría que el valor fuera (0, 0, 255) y luego para las imágenes con alfa que quisiera que se mezclara. Al final de la operación anterior, será (127, 127 , 255). ¿Debo verificar si hay alfa para cada píxel y, de ser así, hacer la fusión o hay otra forma de hacerlo?
Parece que has perdido el multiplicador (1-Alpha) para el fondo (currentPixelColor)
Una mezcla típica de "Over" se realiza de la siguiente manera:
outputRed = (foregroundRed * foregroundAlpha) + (backgroundRed * (1.0 - foregroundAlpha));
Y luego repitiendo para los canales azul y verde. Haga esto para cada píxel.
alpha_blend_sse :)
;example usage
;mov eax, 0xabcdef
;mov edx, 0xAAAAAADD
;call alph_blend_see
; In/ EAX = background color (ZRBG) 32bit (Z mean zero, always is zero)
; In/ EDX = foreground color (RBGA) 32bit
; Out/ EAX = new color
alph_blend_sse:
xor r14, r14
xor r12, r12
xor r13, r13
movzx r15, dl ; av: alpha number (0x00--->0xFF)
movzx ecx, dl
not ecx ; faster than 255 - dl
mov r14b, cl ; rem
shr edx, 8
and edx, 0x00FFFFFF
mov r12d, edx
mov r13d, eax ; RBGA ---> ZRGB
mov rax, 0x0000FF
movq xmm3, rax
; s: eax
; d: edx
;=============================red = ((s >> 16) * rem + (d >> 16) * av) >> 8;
movq xmm0, r12
psrld xmm0, 0x10
movq xmm1, r14
pmuludq xmm1, xmm0
movq xmm0, r13
psrld xmm0, 0x10
movq xmm2, r15
pmuludq xmm2, xmm0
addps xmm2, xmm1
psrld xmm2, 0x8
movq rax, xmm2
mov r9b, al
shl r9d, 8
;=============================green = (((s >> 8) & 0x0000ff) * rem + ((d >> 8) & 0x0000ff) * av) >> 8;
movq xmm0, r12
psrld xmm0, 0x8
andps xmm0, xmm3
movq xmm1, r14
pmuludq xmm1, xmm0
movq xmm0, r13
psrld xmm0, 0x8
andps xmm0, xmm3
movq xmm2, r15
pmuludq xmm2, xmm0
addps xmm2, xmm1
psrld xmm2, 0x8
movq rax, xmm2
mov r9b, al
shl r9d, 8
;=============================blue = ((s & 0x0000ff) * rem + (d & 0x0000ff) * av) >> 8;
movq xmm0, r12
andps xmm0, xmm3
movq xmm1, r14
andps xmm1, xmm3
pmuludq xmm1, xmm0
movq xmm0, r13
andps xmm0, xmm3
movq xmm2, r15
andps xmm2, xmm3
pmuludq xmm2, xmm0
addps xmm2, xmm1
psrld xmm2, 0x8
movq rax, xmm2
mov r9b, al
mov eax, r9d
ret