que after algorithm image-processing image-manipulation alphablending alpha-transparency

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