Algo de dégradé de couleurs

Algo de dégradé de couleurs - Algo - Programmation

Marsh Posté le 26-09-2002 à 10:42:48    

Salut,
 
je cherche un algo qui permettrai de faire un dégradé de couleurs un peu à la manière de Yahoo messenger.
On choisit plusieurs couleurs, et l'ago calcul les couleurs intermédiaires de facon à créer un beau nuancé de couleurs.
 
 :benetton:  
 


---------------
La mort... c'est un peu comme la connerie. Le mort, lui, il ne sait pas qu'il est mort... ce sont les autres qui sont tristes. Le con, c'est pareil... (Le Chat)
Reply

Marsh Posté le 26-09-2002 à 10:42:48   

Reply

Marsh Posté le 26-09-2002 à 10:46:12    

Ca depends du mode de gestion des couleurs, de l'utilisation ou non d'une palette, etc... Tu peux préciser ?

Reply

Marsh Posté le 26-09-2002 à 10:50:08    

bo je me prends pas la tete, la palette c celle de windows.
En fait c pour un composant Delphi, on cherche à en changer la couleur. Donc on fonctionne en RGB ou HLS (on s'en fiche, on converti).


---------------
La mort... c'est un peu comme la connerie. Le mort, lui, il ne sait pas qu'il est mort... ce sont les autres qui sont tristes. Le con, c'est pareil... (Le Chat)
Reply

Marsh Posté le 26-09-2002 à 11:00:58    

Bon, donc rgb sans palette.  
Un algo simple, c'est  
 
Séparer les composantes R, G et B pour les couleurs départ et arrivée (Rd, Gd, Bd et Ra, Ga, Ba on va dire).
Ensuite, tu décide combien de couleurs tu veux dans ton dégradé (iteration)
 

Code :
  1. boucle = 0
  2. while boucle < iteration:
  3.   R = Rd + ((Ra - Rd)/iteration)*boucle
  4.   G = Gd + ((Ga - Gd)/iteration)*boucle
  5.   B = Bd + ((Ba - Bd)/iteration)*boucle
  6.   couleur = (R, G, B)
  7.   boucle = boucle +1


 
pas testé, mais y'a pas de raison que ca marche pas.

Reply

Marsh Posté le 26-09-2002 à 11:02:33    

ok je vais voir ce que ca donne.
et je te tiens au courant.
 ;)


---------------
La mort... c'est un peu comme la connerie. Le mort, lui, il ne sait pas qu'il est mort... ce sont les autres qui sont tristes. Le con, c'est pareil... (Le Chat)
Reply

Marsh Posté le 26-09-2002 à 11:03:29    

Olyv a écrit a écrit :

bo je me prends pas la tete, la palette c celle de windows.
En fait c pour un composant Delphi, on cherche à en changer la couleur. Donc on fonctionne en RGB ou HLS (on s'en fiche, on converti).




 
Las soluce la plus simple que je vois c de considérer tes couleurs comme des points dans un espace tridimetionnel et de calculer l'équation des droites reliant chaque couleur et parés en les parcourant ça te fait ton dégradé.


---------------
Le Tyran
Reply

Marsh Posté le 26-09-2002 à 11:29:31    

Attention, y fo ponderer ces coubres sinon l'espace des couleurs n'est pas correcte ...

Reply

Marsh Posté le 26-09-2002 à 11:31:05    

Joel F a écrit a écrit :

Attention, y fo ponderer ces coubres sinon l'espace des couleurs n'est pas correcte ...




 
 :heink:


---------------
Le Tyran
Reply

Marsh Posté le 26-09-2002 à 11:31:56    

LetoII a écrit a écrit :

 
 
Las soluce la plus simple que je vois c de considérer tes couleurs comme des points dans un espace tridimetionnel et de calculer l'équation des droites reliant chaque couleur et parés en les parcourant ça te fait ton dégradé.




 
Pour être plus pompeux : l'espace des couleurs est un espace vectoriel orthonormé de dimension 3  :D

Reply

Marsh Posté le 26-09-2002 à 11:33:00    

LetoII a écrit a écrit :

 
 
 :heink:  




 
oui mosieur.
cf  cour d'infographie de cette année, si tu vexu que ton espace des couleurs RGB soit correct topologiquement tu dois mettre des coeff sur les coordonnées lorsque tu calculs des normes/distances dans cette espace.

Reply

Marsh Posté le 26-09-2002 à 11:33:00   

Reply

Marsh Posté le 26-09-2002 à 11:33:48    

Citation :

 
Joel F a écrit :
--------------------------------------------------------------------------------
Attention, y fo ponderer ces coubres sinon l'espace des couleurs n'est pas correcte ...  
 
--------------------------------------------------------------------------------
 
 
 
:heink:  


 
j'allais le dire


---------------
La mort... c'est un peu comme la connerie. Le mort, lui, il ne sait pas qu'il est mort... ce sont les autres qui sont tristes. Le con, c'est pareil... (Le Chat)
Reply

Marsh Posté le 26-09-2002 à 11:33:50    

_Mac_ a écrit a écrit :

 
 
Pour être plus pompeux : l'espace des couleurs est un espace vectoriel orthonormé de dimension 3  :D  




 
 :non:  
 
C pas un espace vetoriel.


---------------
Le Tyran
Reply

Marsh Posté le 26-09-2002 à 11:34:41    

Joel F a écrit a écrit :

 
 
oui mosieur.
cf  cour d'infographie de cette année, si tu vexu que ton espace des couleurs RGB soit correct topologiquement tu dois mettre des coeff sur les coordonnées lorsque tu calculs des normes/distances dans cette espace.
 




 
Putain arréte de lire les cours avant qu'on les ai! :D


Message édité par LetoII le 26-09-2002 à 11:34:50

---------------
Le Tyran
Reply

Marsh Posté le 26-09-2002 à 11:36:52    

LetoII a écrit a écrit :

 
 
 :non:  
 
C pas un espace vetoriel.




 
Et pourquoi ce serait pas un espace vectoriel ?

Reply

Marsh Posté le 26-09-2002 à 11:37:00    

Ce que je me tu a vous dire ...
pr que l'espace RGB soit vectoriel fo ponderr ses coordonnées :
 
http://mitpress2.mit.edu/e-journal [...] inazi.html

Reply

Marsh Posté le 26-09-2002 à 11:37:58    

_Mac_ a écrit a écrit :

 
 
Et pourquoi ce serait pas un espace vectoriel ?




1. l'espace RGB est borné 0 < (r,g,b) < 255
2. Trouve moi une norme ...
3. les détails cocasses sur les opérations de type +,* ...

Reply

Marsh Posté le 26-09-2002 à 11:38:48    

_Mac_ a écrit a écrit :

 
 
Et pourquoi ce serait pas un espace vectoriel ?




 
Trouve moi un corp sur lequel serait fondé l'espace des couleur RGB et là tu poura dire quec un espace vectoriel :D
 
 
Edit: Grillé


Message édité par LetoII le 26-09-2002 à 11:39:07

---------------
Le Tyran
Reply

Marsh Posté le 26-09-2002 à 11:43:17    

Joel F a écrit a écrit :

Ce que je me tu a vous dire ...
pr que l'espace RGB soit vectoriel fo ponderr ses coordonnées :
 
http://mitpress2.mit.edu/e-journal [...] inazi.html




 
Je vois pas en quoi pondérer les coordonnées va transformer l'espace RGB en espace vectoriel ; tu vas peut-être les pondérer pour transformer ta base en base normé, mais c'est tout... Dans tous les cas, vu que c'est un cube (dixit Eskinazi), on a une base orthogonale. Après, tu peux sir que c'est normé en choisissant une base qui va bien.

Reply

Marsh Posté le 26-09-2002 à 13:02:38    

au temps pour moi, égarement pre-digestif ...
 
Néanmoins, si tu fais
 
A(255,255,255) + B(255,255,255) ben tu sort de l'espace ...

Reply

Marsh Posté le 26-09-2002 à 14:03:33    

Une info supplémentaire : notre oeil n'est pas sensible de la manière dans toutes les nuances de couleurs. Si tu veux un beau dégradé entre du noir et du bleu 100 % (i.e. RGB(0, 0, 255)), ce n'est pas une droit mais une courbe de Bézier entre ces 2 points du cube des couleurs qu'il te faut, pour, ici, augmenter le nombre de nuances disponibles près du noir par rapport à la "moyenne".

Reply

Marsh Posté le 26-09-2002 à 14:56:16    

Joel F a écrit a écrit :

au temps pour moi, égarement pre-digestif ...
 
Néanmoins, si tu fais
 
A(255,255,255) + B(255,255,255) ben tu sort de l'espace ...




 
Ben non, tu sors pas de l'espace, tu sors simplement des capacités d'affichage de la machine... C'est pareil : un espace vectoriel est défini sur un corps (R ou C), et du coup, tu peux imaginer une couleur valant (12.34454, -2.3452342, 90). Le calcul se fait sur l'espace vectoriel, et après tu réajuste par rapport aux capacités de la machine, donc codage de chaque couleur sur 8 bits ; la translation sur le segment [0, 255] se fait en dernier. Voila.

Reply

Marsh Posté le 26-09-2002 à 14:57:59    

_Mac_ a écrit a écrit :

 
 
Ben non, tu sors pas de l'espace, tu sors simplement des capacités d'affichage de la machine... C'est pareil : un espace vectoriel est défini sur un corps (R ou C), et du coup, tu peux imaginer une couleur valant (12.34454, -2.3452342, 90). Le calcul se fait sur l'espace vectoriel, et après tu réajuste par rapport aux capacités de la machine, donc codage de chaque couleur sur 8 bits ; la translation sur le segment [0, 255] se fait en dernier. Voila.




 
Oui donc l'ensemble des couleurs affichable n'es pas un EV


---------------
Le Tyran
Reply

Marsh Posté le 26-09-2002 à 15:44:14    

je sais pas ou vous partez, mais le 255 pour dû aux 8 bits par composantes veux dire que le 1.0 (100% de la composante) est 255.
 
et quand les cartes 3D font des multiplications de textures, on une appli fait des traitements graphiques, elles font pas 255*255=65025, mais 255 (=1.0) * 255 (=1.0) = 255 (1.0).
 
idem une image RVB en 16 bpp 5:6:5 qui est serait à (31:63:31) serait à interpréter en 24 bpp en (255:255:255) ou encore en RVB 30 bpp (10:10:10) en (1023:1023:1023), mais ça fait toujours R 100% V 100% B 100%.
 
ensuite je sais pas si on peut dire que c'est un espace vectoriel (et je m'en fous, quoique), mais on parle bien de repère, quand on passe d'un repère RGB à un repère YUV via un matricage.... (ce que font les magnétoscopes, ou une 3dfx avec ses formats de textures propriétaires).
 
en tout cas pour la réponse lorill est le plus proche, et le mieux c'est de calculer les coefficients directeurs à l'éxtérieur de la boucle, du style:
 
coefs dR,dV,dB;
 
dR=(R1-R0)/nbr_itérations
dV=(V1-V0)/nbr_itérations
dB=(B1-B0)/nbr_itérations
 
tant que nbr_itérations > 0
  Rsortie=R0
  Vsortie=V0
  Bsortie=B0
  R0+=dR
  V0+=dR
  B0+=dR
  nbr_itérations--
fin tant que
 
ensuite attention à la précision de calcul, dans cet exemple fo une précision fractionnaire, et comme fo jamais mélanger le flottant et l'entier pour les perfs, vo mieux bosser en virgule fixe....
 

Code :
  1. long dR,dV,dB;
  2. dR=((R1-R0)<<16)/nbr_itérations;
  3. dV=((V1-V0)<<16)/nbr_itérations;
  4. dB=((B1-B0)<<16)/nbr_itérations;
  5. while( nbr_itérations > 0 )
  6. {
  7.   Rsortie=(R0>>16);
  8.   Vsortie=(V0>>16);
  9.   Bsortie=(B0>>16);
  10.   R0+=dR;
  11.   V0+=dV;
  12.   B0+=dB;
  13.   nbr_itérations--;
  14. }

Reply

Marsh Posté le 26-09-2002 à 16:32:49    

LetoII a écrit a écrit :

 
 
Oui donc l'ensemble des couleurs affichable n'es pas un EV




 
Effectivement, dans la mesure où un sous-ensemble d'espace vectoriel n'est pas forcément un espace vectoriel. Mais mathématiquement, pour le calcul, on peut toujours se ramener à un espace vectoriel, voire même à un espace affine, surtout que tu as été le premier à aborder le sujet en parlant d'équation de droite  :p

Reply

Marsh Posté le 26-09-2002 à 16:35:06    

_Mac_ a écrit a écrit :

 
 
Effectivement, dans la mesure où un sous-ensemble d'espace vectoriel n'est pas forcément un espace vectoriel. Mais mathématiquement, pour le calcul, on peut toujours se ramener à un espace vectoriel, voire même à un espace affine, surtout que tu as été le premier à aborder le sujet en parlant d'équation de droite  :p  




 
 
Par ce que j'avais l'image du cube de couleur dans la tête et que ça me semblait la façon la plus simple d'en parler.


---------------
Le Tyran
Reply

Marsh Posté le 26-09-2002 à 17:23:51    

en tout cas je sais ki a une theorie + adaptée a ces prob que les EV ...

Reply

Marsh Posté le 26-09-2002 à 18:23:15    

LetoII a écrit a écrit :

 
 
Las soluce la plus simple que je vois c de considérer tes couleurs comme des points dans un espace tridimetionnel et de calculer l'équation des droites reliant chaque couleur et parés en les parcourant ça te fait ton dégradé.




Oui donc sans aller dans l'espace :D tu décde du nombre de couleurs intermediaires -> n et pis
 
de la couleur a à la couleur b, si tu veux 5 couleurs
 
ben :  
 * ri = (((rb-ra)/(5+1))*i)+ra pour i=1..n
idem avec g et idem avec b...


---------------
Le site de l'année :D (XHTML 1.0 strict) : http://darkoli.free.fr/index.html
Reply

Marsh Posté le 26-09-2002 à 18:25:05    

Joel F a écrit a écrit :

au temps pour moi, égarement pre-digestif ...
 
Néanmoins, si tu fais
 
A(255,255,255) + B(255,255,255) ben tu sort de l'espace ...




 
mais (255+255)&255 C'est bon, tu restes dans l'espace [:cupra]


---------------
Le site de l'année :D (XHTML 1.0 strict) : http://darkoli.free.fr/index.html
Reply

Marsh Posté le 19-10-2007 à 20:50:51    

bjone a écrit :

je sais pas ou vous partez, mais le 255 pour dû aux 8 bits par composantes veux dire que le 1.0 (100% de la composante) est 255.
 
et quand les cartes 3D font des multiplications de textures, on une appli fait des traitements graphiques, elles font pas 255*255=65025, mais 255 (=1.0) * 255 (=1.0) = 255 (1.0).
 
idem une image RVB en 16 bpp 5:6:5 qui est serait à (31:63:31) serait à interpréter en 24 bpp en (255:255:255) ou encore en RVB 30 bpp (10:10:10) en (1023:1023:1023), mais ça fait toujours R 100% V 100% B 100%.
 
ensuite je sais pas si on peut dire que c'est un espace vectoriel (et je m'en fous, quoique), mais on parle bien de repère, quand on passe d'un repère RGB à un repère YUV via un matricage.... (ce que font les magnétoscopes, ou une 3dfx avec ses formats de textures propriétaires).
 
en tout cas pour la réponse lorill est le plus proche, et le mieux c'est de calculer les coefficients directeurs à l'éxtérieur de la boucle, du style:
 
coefs dR,dV,dB;
 
dR=(R1-R0)/nbr_itérations
dV=(V1-V0)/nbr_itérations
dB=(B1-B0)/nbr_itérations
 
tant que nbr_itérations > 0
  Rsortie=R0
  Vsortie=V0
  Bsortie=B0
  R0+=dR
  V0+=dR
  B0+=dR
  nbr_itérations--
fin tant que
 
ensuite attention à la précision de calcul, dans cet exemple fo une précision fractionnaire, et comme fo jamais mélanger le flottant et l'entier pour les perfs, vo mieux bosser en virgule fixe....
 

Code :
  1. long dR,dV,dB;
  2. dR=((R1-R0)<<16)/nbr_itérations;
  3. dV=((V1-V0)<<16)/nbr_itérations;
  4. dB=((B1-B0)<<16)/nbr_itérations;
  5. while( nbr_itérations > 0 )
  6. {
  7.   Rsortie=(R0>>16);
  8.   Vsortie=(V0>>16);
  9.   Bsortie=(B0>>16);
  10.   R0+=dR;
  11.   V0+=dV;
  12.   B0+=dB;
  13.   nbr_itérations--;
  14. }



 
Bonjour,
 
J'essaie actuellement d'implémenter cet algo en C# mais il y a une erreur dans le code en effet les variables Rsortie, Vsortie et Bsortie ne sont pas utilisée.
Peux-tu corriger ton algo ?
 
De plus à quoi correspond l'orépateur >> ?
 
Merci

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed