手动将RGBA像素与RGB像素进行alpha混合



我正在尝试对RGBA图像(前景图像)和RGB图像(背景图像)进行alpha混合操作。然而,在这样做的时候,我认为我可能做了错误的alpha混合操作或做错了。例如,我的RGB图像的像素是(127127127)的灰色。我的RGBA图像的像素将是(0,0255)。在我进行混合操作后,最终的颜色将是(1270255)。然而,我认为这更像是一种添加剂混合物,与我正在进行的操作不同。

关于我的值是如何设置的,看看这个

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)

关于我的计算是如何设置的,看看这个

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

对于没有alpha的像素,我希望值为(0,0255),然后对于有alpha的图像,我希望它混合在一起。在上面的操作结束时,它将为(127127255)。我应该检查每个像素是否都有alpha,如果有,那么进行混合,或者有其他方法吗?

典型的"Over"混合按以下方式进行:

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

然后对蓝色和绿色通道重复。对每个像素执行此操作。

您似乎错过了背景(currentPixelColor)的(1-Alpha)乘数

最新更新