2011-03-01 3 views
0

J'ai une couleur RGBA commeObtenez des couleurs de pixel après mélange alpha

255, 0, 0, 100

Comment puis-je obtenir le RVB si elle a été mise sur un fond blanc? par ex. ce rouge deviendrait plus léger et être plus comme

255, 100, 100

Et la même chose si elle ont été mis sur un fond noir.

Est-ce que cela a un sens?

De préférence C++

+2

Vérifiez l'article wiki. C'est très utile: http://en.wikipedia.org/wiki/Alpha_compositing#Description –

+0

Ça a l'air très utile –

+0

Quelqu'un a posté une autre réponse avant que ça fonctionne comme un charme ... je ne sais pas où ça s'est passé .... –

Répondre

3

À titre d'exemple à mon commentaire:

struct Color 
{ 
    int R; 
    int G; 
    int B; 
    int A; 
}; 

Color Blend(Color c1, Color c2) 
{ 
    Color result; 
    double a1 = c1.A/255.0; 
    double a2 = c2.A/255.0; 

    result.R = (int) (a1 * c1.R + a2 * (1 - a1) * c2.R); 
    result.G = (int) (a1 * c1.G + a2 * (1 - a1) * c2.G); 
    result.B = (int) (a1 * c1.B + a2 * (1 - a1) * c2.B); 
    result.A = (int) (255 * (a1 + a2 * (1 - a1))); 
    return result; 
} 


void Example() 
{ 
    Color c1; 
    c1.R = 255; 
    c1.G = 0; 
    c1.B = 0; 
    c1.A = 100; 

    Color c2; 
    c2.R = 255; 
    c2.G = 255; 
    c2.B = 255; 

    Color blended = Blend(c1, c2); 
    int x = 50; 
    int y = 100; 

    // Pretend function that draws a pixel at (x, y) with rgb values 
    DrawPixel(x, y, blended.R, blended.G, blended.B); 
} 
+0

Tester une autre réponse en ce moment ... allez-y bientôt ... –

+0

La page Ben liée à est également très utile. Vous devrez faire attention au type de mélange que vous voulez et à la façon dont vous mélangez puisque certains ne sont pas associatifs (Mélange (a, b)! = Mélange (b, a)). –

+0

Pourquoi utilisez-vous les caractères ne sont-ils pas ints? Aussi, comment dois-je l'utiliser exactement? Dois-je déclarer un mycol de couleur et définir le .r .g etc ... –

-1

Cela dépend de la fonction de mélange. Neuf fonctions de mélange différentes, avec une formule pour chacune d'elles, sont décrites dans la documentation glBlendFunc

+0

Le terme «alpha blending» signifie une fonction de mélange particulière - en OpenGL, ce serait (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA). Tout le reste est "blending", mais pas "alpha blending". –

+0

@Stefan: Il existe encore différentes fonctions, selon que vous utilisez alpha alpha prémultiplié. –

+0

True, la formule dans le cas alpha prémultiplié est différente. –

Questions connexes