【问题标题】:How to apply overlay transparency to RGBA image如何将叠加透明度应用于 RGBA 图像
【发布时间】:2010-08-04 07:24:03
【问题描述】:

这是我的困境:我必须使用 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的红色/绿色覆盖图像,我会就像叠加图像看起来像一个“苍白”的红色/绿色叠加层,下面有图像,但是通过上面的方法,我在下面的图像上得到了很多彩色像素)。您对此有更好的方法吗?

谢谢, 弗里松

【问题讨论】:

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


    【解决方案1】:

    进行 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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-21
      • 2023-03-02
      • 1970-01-01
      • 1970-01-01
      • 2020-10-17
      • 1970-01-01
      • 2015-03-18
      相关资源
      最近更新 更多