Как применить прозрачность наложения к изображению RGBA

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

Спасибо fritzone


person Ferenc Deak    schedule 04.08.2010    source источник


Ответы (1)


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