Fer*_*eak 0 c++ transparency overlay alpha image-processing
这是我的困境:我必须使用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
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,pFrameRGB是目标RGBA图像,已经包含somet图像,frame-> bytes是"overlay/subtitle"图像...这里有我的问题:有一些彩色叠加/字幕图像,目的地也是多彩...所以它不像字幕图像被覆盖我想要获得的效果,但你可以看到整个颜色范围(例如:我有一个红色/绿色的叠加图像,增加了alpha,我想要叠加图像看起来像一个"苍白"的红色/绿色覆盖图,下面有图像,但是通过上面的方法,我在下面的图像上得到了很多彩色像素).你有更好的方法吗?
谢谢,fritzone
进行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);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2015 次 |
最近记录: |