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

标签 algorithm image-processing image-manipulation alphablending alpha-transparency

我正在尝试对 RGBA 图像(前景图像)和 RGB 图像(背景图像)进行 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));

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

关于algorithm - 手动将 RGBA 像素与 RGB 像素进行 alpha 混合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9014729/

相关文章:

opencv - 如何运行基本的OpenCL人脸检测代码

python - 关于 Josephus_problem

java - 通过减法排列数字

c# - 在图像中查找图像(对象检测)

iPhone:模糊 UIImage

php - 需要想法只显示一些像素并将剩余像素变灰

XSLT:获取或匹配 base64 编码数据的哈希值

c - 将线段延伸特定距离

java - 组合算法

c - 代码片段中的划分