我正在尝试对RGB图像(背景图像)进行RGBA图像(前景图像)的alpha混合操作。但是,在这样做的同时,我认为我可能执行了错误的alpha混合操作或执行了错误的操作。例如,我的RGB图像的像素为(127、127、127)的灰色。我的RGBA图像像素为(0,0,255)。完成混合操作后,最终的颜色将是(127,0,255)。但是,我认为这与我正在做的操作更多的是一种添加剂混合,并且有所不同。
有关如何设置我的值,请看一下
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,0,255),然后对于具有alpha的图像,我希望其混合。在上述操作结束时,它将为(127,127 255)。我应该检查每个像素是否都有alpha,如果是,则进行融合,还是有另一种方法可以做到?
典型的“过度”混合是通过以下方式完成的:
outputRed = (foregroundRed * foregroundAlpha) + (backgroundRed * (1.0 - foregroundAlpha));
然后重复蓝色和绿色通道。为每个像素执行此操作。