【问题标题】:Manually alpha blending an RGBA pixel with an RGB pixel手动将 RGBA 像素与 RGB 像素混合
【发布时间】:2012-01-26 06:43:16
【问题描述】:

我正在尝试将 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,如果有,那么进行混合还是有其他方法可以做到这一点?

【问题讨论】:

  • 您正在进行添加剂混合。考虑这样的线性混合:y = (x0 * w) + (x1 * (1-w))
  • 255 来回缩放很多。如果您的操作保持正常化,则应该没有必要。

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


【解决方案1】:

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

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

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

【讨论】:

  • 也许我错了,但这不是我已经在做的吗?
  • 不,你正在做的是 outputRed = (foreRed * foreAlpha) + backgroundRed。您需要将 backgroundRed 乘以 (1.0 - foreAlpha)。
  • 抱歉,这么晚了,但是如果目标像素和源像素都是透明的,那么 alpha 输出 alpha 通道会发生什么情况?
  • 它最终也是透明的。因此,如果您有一个覆盖率为 0%(alpha)的源像素,它不应该对输出有贡献。如果您将其覆盖在覆盖率为 0% 的像素上,则背景也不应该对输出做出贡献。所以结果将是 RGBA = (0,0,0,0)。可以这么说,它将是“透明的黑色”。如果您将结果叠加在不透明的东西上,您将看到您叠加的任何内容。
  • 这是假设foregroundAlpha在0-255范围还是0-1范围内?
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-11
    • 2021-12-17
    • 2015-01-08
    • 1970-01-01
    • 2012-03-28
    • 1970-01-01
    • 1970-01-01
    • 2021-08-08
    相关资源
    最近更新 更多