PDA

Voir la version complète : Mélange de couleurs


thoduv
11/09/2006, 19h43
Salut à tous !

Bon voilà j'essaie de réaliser une fonction qui mélange deux couleurs avec un coeff donné.
Exemple, je lui donne noir et blanc, 50% et ca me sort du gris.

Et donc ... j'y arrive pas ! :cry:

Voilà mon code actuel qui marche à moitié (et encore), j'utilise une profondeur de 16 bits (gba/ds) :
/* blend_colors: mélange deux couleurs selont un coeff
bg = couleur d'arrière-plan
fg = couleur de premier-plan
bv = coeff (de 0 à 31) du mélange: 0 -> bg, 31 -> fg
*/
static inline u16 blend_colors(u16 bg, u16 fg, u8 bv)
{
u8 r, g, b;
u8 bg_r = bg & 31, bg_g = (bg >> 5) & 31, bg_b = (bg >> 10) & 31, fg_r = fg & 31, fg_g = (fg >> 5) & 31, fg_b = (fg >> 10) & 31;
if(bv == 0) return bg;
if(bv == 31) return fg;
r = ( ((bg_r < fg_r) ? bg_r : fg_r) - (bg_r - fg_r) * bv / 31 );
g = ( ((bg_g < fg_g) ? bg_g : fg_g) - (bg_g - fg_g) * bv / 31 );
b = ( ((bg_b < fg_b) ? bg_b : fg_b) - (bg_b - fg_b) * bv / 31 );
return r | (g << 5) | (b << 10);
}

Si vous savez comment faire, n'hésitez pas à m'expliquer l'algorithme ou a me passer un bout de code !

Merci d'avance ! :D

birslip
11/09/2006, 20h54
J'avais fait une petite fonction dans le genre je ne sais plus trop quand :rolleyes:


#define RGB(r, g, b) ((1 << 15) + (r) + ((g)<<5) + ((b)<<10))

u16 MixColors(u8 alpha, u8 r, u8 g, u8 b, u8 r1, u8 g1, u8 b1) {
return RGB(((r*(255-alpha)>>8) + (r1*alpha>>8))>>3,((g*(255-alpha)>>8) + (g1*alpha>>8))>>3,((b*(255-alpha)>>8) + (b1*alpha>>8))>>3);
}


Les couleurs vont de 0 à 255 et l'indice de transparence (alpha) aussi ;)
J'espère que c'est ça que tu voulais ^^

thoduv
11/09/2006, 21h28
Ok, merci beaucoup à vous deux (Yopyop m'a répondu en MP). :)
Voilà le code :
static inline u16 blend_colors(u16 bg, u16 fg, u8 alpha)
{
u8 r, g, b;
r = (((bg & 31) * (31 - alpha)) + ((fg & 31) * alpha)) / 31;
if(r > 31) r = 31;
g = ((((bg >> 5) & 31) * (31 - alpha)) + (((fg >> 5) & 31) * alpha)) / 31;
if(g > 31) g = 31;
b = ((((bg >> 10) & 31) * (31 - alpha)) + (((fg >> 10) & 31) * alpha)) / 31;
if(b > 31) b = 31;
return r | (g << 5) | (b << 10);
}