如何将叠加透明度应用于RGBA图像

时间:2010-08-04 07:24:04

标签: c++ image-processing transparency overlay alpha

这是我的困境:我必须使用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图像,已经包含somet图像,frame-> bytes是“overlay / subtitle”图像...这里有我的问题:带有一些彩色叠加/字幕图像目的地太多了...所以它不像字幕图像被覆盖我想要获得的效果但你可以看到整个颜色范围(例如:我有一个红色/绿色叠加图像,增加了alpha和我我希望叠加图像看起来像一个“苍白”的红色/绿色叠加层,下面有图像,但是通过上面的方法,我在下面的图像上得到了很多彩色像素。你有更好的方法吗?

谢谢, fritzone

1 个答案:

答案 0 :(得分: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);