Как применить прозрачность наложения к изображению RGBA - PullRequest
0 голосов
/ 04 августа 2010

Вот моя дилемма: у меня есть изображения RGBA RAW: главное изображение (первое) и дорожка субтитров (второе), и я хочу наложить их таким образом, основываясь на альфа-канале второго изображения: это ноль, затем взять пиксели из второго изображения, если это 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 является изображением "overlay / subtitle" ... И вот мой вопрос: с некоторыми красочными изображениями overlay / subtitle место назначения слишком красочное ... поэтому не похоже, чтобы изображение субтитров было наложено, какой эффект я хочу получить, но вы можете видеть целый ряд цветов (например: у меня есть наложение красного / зеленого цвета с возрастающей альфой, и я бы как наложение изображения, чтобы выглядеть как «бледное» красно-зеленое наложение с изображением под ним, однако с подходом выше я получаю много красочных пикселей на изображении ниже). У вас есть несколько лучший подход к этому?

Спасибо, fritzone

1 Ответ

6 голосов
/ 04 августа 2010

Уравнение для альфа-смешивания сложнее, чем просто побитовое или. Предположим, что модель линейного отклика для 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);
...