0

这是我的困境:我必须 RGBA RAW 图像:主图像(第一个)和一个字幕轨道(第二个),我想以基于第二个图像的 alpha 通道的方式覆盖它们:如果它为零,然后从第二个图像中获取像素,如果它是 0xFF 从第一个图像中获取像素,否则在第一个图像上创建第二个图像的覆盖。这是用于此的代码:

if(frame->bytes[pc + 3] == 0xFF) /* this is NO transparency in the overlay image, meaning: take over the overlay 100% */
{
    pFrameRGB->data[0][pc] = frame->bytes[pc];    // Red
    pFrameRGB->data[0][pc+1] = frame->bytes[pc+1];// Green 
    pFrameRGB->data[0][pc+2] = frame->bytes[pc+2];// Blue 
}
else
if(frame->bytes[pc + 3] != 0) /* this is full transparency in the overlay image, meaning: take over the image 100% */
{
    pFrameRGB->data[0][pc] |= frame->bytes[pc];    // Red
    pFrameRGB->data[0][pc+1] |= frame->bytes[pc+1];// Green 
    pFrameRGB->data[0][pc+2] |= frame->bytes[pc+2];// Blue
    pFrameRGB->data[0][pc+3] = frame->bytes[pc+3]; // Alpha 
}

在上面的代码中,pFrameRGB 是目标 RGBA 图像,那里已经包含了一些图像,frame->bytes 是“覆盖/字幕”图像......我的问题来了:使用一些彩色覆盖/字幕图像,目的地也是色彩丰富......所以它不像字幕图像被覆盖了我想要获得的效果但是你可以看到整个颜色范围(例如:我有一个带有增加 alpha 的红色/绿色覆盖图像,我想要覆盖图像看起来像一个“苍白”的红色/绿色叠加层,下面有图像,但是通过上面的方法,我在下面的图像上得到了很多彩色像素)。您对此有更好的方法吗?

谢谢,弗里松

4

1 回答 1

6

进行 Alpha 混合的方程式比位或更复杂。假设 RGB 的线性响应模型,一个非常常见的实现是:

dst_R = (src_R*src_A + dst_R*(255 - src_A)) / 255;
dst_G = (src_G*src_A + dst_G*(255 - src_A)) / 255;
dst_B = (src_B*src_A + dst_B*(255 - src_A)) / 255;
dst_A = min(src_A + dst_A, 255);
于 2010-08-04T07:38:59.507 回答