2010-08-04 4 views
0

Voici mon dilemme: J'ai des images RAW RGBA: une image maître (la première) et une piste de sous-titre (la seconde), et je veux les superposer d'une manière basée sur le canal alpha de la deuxième image: Si c'est zéro, alors prenez les pixels de la deuxième image, si c'est 0xFF, prenez les pixels de la première image, sinon créez une superposition de la deuxième image sur la première. Voici le code utilisé pour cela:Comment appliquer la transparence de superposition à l'image RGBA

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 
} 

Dans le code ci-dessus est la pFrameRGB l'image cible RGBA, contenant déjà SOMET l'image là, DE CADRE> octets est l'image « superposition/sous-titre » ... Et vient ici ma question: avec certaines superposition colorées/images de sous-titres la destination est trop colorée ... donc ce n'est pas comme si l'image de sous-titrage est superposée quel effet je veux obtenir mais vous pouvez voir toute une gamme de couleurs (par exemple:/image de superposition verte avec un alpha croissant et je voudrais que l'image de superposition ressemble à une superposition rouge/verte "pâle" avec l'image ci-dessous, mais avec l'approche ci-dessus je reçois beaucoup de pixels colorés sur l'image ci-dessous). Avez-vous une approche un peu meilleure à cela?

Merci, fritzone

+0

Quelle bibliothèque? Quelle langue? – Oded

Répondre

6

Une équation pour faire le mélange alpha est plus complexe qu'un simple ou binaire. Supposons qu'un modèle de réponse linéaire pour RGB soit une implémentation relativement courante:

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); 
+0

Merci, ça fonctionne parfaitement. – fritzone

+0

cela m'a vraiment aidé grâce – craigrs84

Questions connexes