小编典典

手动Alpha混合RGBA像素和RGB像素

algorithm

我正在尝试对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,如果是,则进行融合,还是有另一种方法可以做到?


阅读 351

收藏
2020-07-28

共1个答案

小编典典

典型的“过度”混合是通过以下方式完成的:

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

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

2020-07-28