Comment calculer, teinte, saturation, luminosité couleur

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Comment calculer, teinte, saturation, luminosité couleur

Message par Backup »

je viens de corriger mon code , ça tourne

pareil que Photoshop :)
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

Re: Comment calculer, teinte, saturation, luminosité couleur

Message par Fig »

Bien joué le traitement du float en string, pour l'arrondi :wink:
Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche.
Version de PB : 6.00LTS - 64 bits
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Comment calculer, teinte, saturation, luminosité couleur

Message par Micoute »

Bien joué Dobro, mais il subsiste malgré une petite erreur, quoique tu es sur la bonne voie

Tu reprends to code et tu essayes ça:

Code : Tout sélectionner

For couleur.i =451259 To 451270
  
  TSL.s= Rgb_TSL(couleur.i)
  
  Debug "Couleur="+Str(couleur.i)+ " ==>   Rouge="+StringField(TSL.s,4,",")+","+"Vert="+StringField(TSL.s,5,",")+","+"Bleu="+StringField(TSL.s,6,",")
  
  Debug""
  Debug  "Teinte="+StringField(TSL.s,1,",")
  Debug  "Lumiere="+StringField(TSL.s,2,",")
  Debug  "Saturation="+StringField(TSL.s,3,",")
  
  Debug " ******************* "
Next
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Lord Nelson
Messages : 355
Inscription : dim. 01/déc./2013 15:29

Re: Comment calculer, teinte, saturation, luminosité couleur

Message par Lord Nelson »

Bonjour tous le monde :)

Merci de vos réponse à tous, c'est très gentil de votre part :)

Dobro, tu me met dans l’embarra tu sais, tu dis que deux couleurs peuvent avoir la même teinte et saturation
Avec ou sans la même luminosité ?

J'ai l'impression que va falloir que je m'y fasse :(
Car ayant tester tout vos code, j'ai toujours le même problème :cry:

J'ai tester en partant de 451259 jusqu'à 451265 et mauvaise surprises, certaine couleurs on quand même la même teinte et saturation et même luminosité 8O
Par contre n'ont pas les même valeur de R, V et B se qui est parfaitement normale.

Bon, ça dois être à cause de l’arrondis, on à pas le choix j'ai l'impression, le problème viens donc de la source, pourquoi cet arrondis ?
Il est vrais que j'ai demandé entre 0 à 255 mais je crois bien que j'ai fais fausse route non ?

Vos codes sont très certainement juste, c'est l'arrondis le problème et non vos codes.
J'ai crus comprendre que la véritable échelle pour une teinte est de 0 à 360° ?

Pour la saturation et la luminosité c'est pareil ou ça va de 0 à 100% comme j'ai crue le voir ?
Je m’excuses car je suis embarrasser de la tournure que les choses prennent :oops:

Je n'ose pas vous en demander d'avantage, vous avez déjà beaucoup fais pour moi :oops:

En faite, je cherchais le moyen de crée une belle palette de couleurs comme le propose par exemple paint ou PureBasic ou autre programme.
Donc j'étais partie de ceci avec se que j'avais:

Si la luminosité de la couleurs était 120 (120 oui, pourquoi 120 ?...)
Je place dans un tableau à deux dimension qui à 256 élément (de 0 à 255) dans chaque la couleur suivant la teinte et la saturation de la couleur

Si par exemple la couleur à une teinte de 145 et une saturation de 173, je met alors cet élément dans le tableau en 145, 173
Ainsi je me crée un tableau de couleurs qui vont être trier suivant leur teinte et leur saturation (Je ne sais pas si je suis clair)

Ensuite je crée une image au dimension du tableau (256 x 256) en parcourant se tableau et en dessinant les pixel de couleur du tableau (Je suis toujours clair ?)
Ainsi à la sortie j'ai une jolie palette de couleurs !

Mais...

Ceci ne fonctionnais pas, j'avais des ligne noir et un tas de pixel noir au début de la palette !
Mais normalement je m'attendais à avoir 256 * 256 couleurs complétement différente les unes des autres dans un jolie dégrader de couleur !

Car je croyais qu'il avais 256 teinte (De 0 à 255), 256 saturation et 256 luminosité de couleurs différente mais en vain !
J'ai bien des choses à apprendre !

Même dans les palette de couleurs en dégrader que propose certain logiciel, et bien il y à des couleurs en double voir plus !
Je ne comprenais pas pourquoi !

J'ai peut être compris dorénavant :lol:
PS: Désoler pour la placard :oops:
poshu
Messages : 1138
Inscription : sam. 31/juil./2004 22:32

Re: Comment calculer, teinte, saturation, luminosité couleur

Message par poshu »

Lord Nelson a écrit : poshu en faite si tu est d'accord avec moi, deux couleurs ne peuvent jamais avoir la même teinte et saturation pour la même luminosité ok ?
Si la luminosité est différente là ok, tu me suis ?
Poshu a écrit :Avec ça, j'obtiens les mêmes valeurs que photoshop CS6, aka Hue en ° compris entre 0 et 360, Saturation et Intensity en % comprises entre 0 et 100%, le tout arrondi à la valeur la plus proche
Mon code est conforme à CS6. Enlève l'arrondi et tu as des valeurs différentes, c'est de toutes façons assez logique:
RGB = 256 * 256 * 256 = 16 777 216 possibilités
HSL (arrondie comme dans CS6) = 360 * 100 * 100 = 3 600 000 possibilités, forcément, va y avoir des doublons...
CQFD
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Comment calculer, teinte, saturation, luminosité couleur

Message par Backup »

Micoute a écrit :Bien joué Dobro, mais il subsiste malgré une petite erreur, quoique tu es sur la bonne voie

Tu reprends to code et tu essayes ça:

Code : Tout sélectionner

For couleur.i =451259 To 451270
  
  TSL.s= Rgb_TSL(couleur.i)
  
  Debug "Couleur="+Str(couleur.i)+ " ==>   Rouge="+StringField(TSL.s,4,",")+","+"Vert="+StringField(TSL.s,5,",")+","+"Bleu="+StringField(TSL.s,6,",")
  
  Debug""
  Debug  "Teinte="+StringField(TSL.s,1,",")
  Debug  "Lumiere="+StringField(TSL.s,2,",")
  Debug  "Saturation="+StringField(TSL.s,3,",")
  
  Debug " ******************* "
Next


normale
si tu regarde attentivement la sortie de ma procedure
ex :
[17 :38 :22] T.f=68.1818161011
[17 :38 :22] Couleur=451268 ==> Rouge=196,Vert=226,Bleu=6
[17 :38 :22]
[17 :38 :22] Teinte=68
[17 :38 :22] Lumiere=97
[17 :38 :22] Saturation=89
[17 :38 :22] *******************
[17 :38 :22] T.f=67.9090881348
[17 :38 :22] Couleur=451269 ==> Rouge=197,Vert=226,Bleu=6
[17 :38 :22]
[17 :38 :22] Teinte=68
[17 :38 :22] Lumiere=97
[17 :38 :22] Saturation=89
[17 :38 :22] *******************

la teinte (temperature) ressort 68 car il y a arrondit !!

la température non arrondit montre bien une différence ;)
T.f=68.1818161011
T.f=67.9090881348

c'est meme la raison pour laquel j'ai laissé la variable T.f affichée ...
donc le code fonctionne ! :)




Lord Nelson a écrit :s gentil de votre part :)

Dobro, tu me met dans l’embarra tu sais, tu dis que deux couleurs peuvent avoir la même teinte et saturation
Avec ou sans la même luminosité ?
non, je dis que 2 couleurs peuvent avoir la meme Saturation et la meme Luminosité !

J'ai crus comprendre que la véritable échelle pour une teinte est de 0 à 360° ?

Pour la saturation et la luminosité c'est pareil ou ça va de 0 à 100% comme j'ai crue le voir ?
La couleur d'une source lumineuse est comparée à celle d'un corps noir théorique chauffé entre 2 000 et 10 000 K, qui aurait dans le domaine de la lumière visible un spectre d'émission similaire à la couleur considérée.
comme on la représente en pourcentage, elle peut aller de 0 a 100% (tout depends de la représentation )
si elle est représenté sur un Cercle, ça peut etre de 0 a 360°

Si la luminosité de la couleurs était 120 (120 oui, pourquoi 120 ?...)
Je place dans un tableau à deux dimension qui à 256 élément (de 0 à 255) dans chaque la couleur suivant la teinte et la saturation de la couleur
tu part faux , c'est pas une échelle de 0 a 255 , c'est une échelle allant de 255x255x255 =16581375 (16 millions de couleurs possible )
Si par exemple la couleur à une teinte de 145 et une saturation de 173, je met alors cet élément dans le tableau en 145, 173
Ainsi je me crée un tableau de couleurs qui vont être trier suivant leur teinte et leur saturation (Je ne sais pas si je suis clair)

oui, a condition d'avoir 255 cases Lumiere pouvant accueillir toute les possibilité de couleur T=145,S=173 (et les 255 L )
Ensuite je crée une image au dimension du tableau (256 x 256) en parcourant se tableau et en dessinant les pixel de couleur du tableau (Je suis toujours clair ?)
Ainsi à la sortie j'ai une jolie palette de couleurs !
il te manque les 255 lumieres !
la couleur T=125 S=150 devra etre presente sous toute ses formes de lumiere exemple des 5 premieres

T=125 S=150 L=0
T=125 S=150 L=1
T=125 S=150 L=2
T=125 S=150 L=3
T=125 S=150 L=4

ici le L=Lumiere (TLS )
T= teinte
S=Saturation
[/quote]
Dernière modification par Backup le jeu. 13/févr./2014 18:05, modifié 2 fois.
Lord Nelson
Messages : 355
Inscription : dim. 01/déc./2013 15:29

Re: Comment calculer, teinte, saturation, luminosité couleur

Message par Lord Nelson »

Et pour ça t'as une objection Dobro ? :lol:

Code : Tout sélectionner

TSL.s= Rgb_TSL(RGB(255, 255, 255))
 
  Debug "Couleur="+Str(couleur.i)+ " ==>   Rouge="+StringField(TSL.s,4,",")+","+"Vert="+StringField(TSL.s,5,",")+","+"Bleu="+StringField(TSL.s,6,",")
 
  Debug""
  Debug  "Teinte="+StringField(TSL.s,1,",")
  Debug  "Lumiere="+StringField(TSL.s,2,",")
  Debug  "Saturation="+StringField(TSL.s,3,",")
 
  Debug " ******************* "
Sa donne:
T.f=NaN
Couleur=0 ==> Rouge=255,Vert=255,Bleu=255

Teinte=NaN
Lumiere=0
Saturation=100
*******************
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Comment calculer, teinte, saturation, luminosité couleur

Message par Micoute »

la température non arrondit montre bien une différence
Entièrement d'accord ! Précaution non négligeable !

Bravo Dobro et merci encore
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Comment calculer, teinte, saturation, luminosité couleur

Message par Backup »

Lord Nelson a écrit :Et pour ça t'as une objection Dobro ? :lol:

Code : Tout sélectionner

TSL.s= Rgb_TSL(RGB(255, 255, 255))
 
  Debug "Couleur="+Str(couleur.i)+ " ==>   Rouge="+StringField(TSL.s,4,",")+","+"Vert="+StringField(TSL.s,5,",")+","+"Bleu="+StringField(TSL.s,6,",")
 
  Debug""
  Debug  "Teinte="+StringField(TSL.s,1,",")
  Debug  "Lumiere="+StringField(TSL.s,2,",")
  Debug  "Saturation="+StringField(TSL.s,3,",")
 
  Debug " ******************* "
Sa donne:
T.f=NaN
Couleur=0 ==> Rouge=255,Vert=255,Bleu=255

Teinte=NaN
Lumiere=0
Saturation=100
*******************



aucun probleme !!

Photoshop fait de meme regarde :

Image :mrgreen:


ps: Je viens de corriger mon code , pour qu'il renvoi 0 et non pas "Nan"
et j'avais une inversion entre le S et le L :oops:
Lord Nelson
Messages : 355
Inscription : dim. 01/déc./2013 15:29

Re: Comment calculer, teinte, saturation, luminosité couleur

Message par Lord Nelson »

Ah bha là sa change tout !
Merci Dobro :D

Merci également à tous pour votre aide !
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Comment calculer, teinte, saturation, luminosité couleur

Message par Backup »

...
Dernière modification par Backup le mar. 19/août/2014 9:50, modifié 1 fois.
poshu
Messages : 1138
Inscription : sam. 31/juil./2004 22:32

Re: Comment calculer, teinte, saturation, luminosité couleur

Message par poshu »

Au risque d'être encore ignoré...

Calcul de HBS depuis RGB et l'inverse, sans bruteforce... Bon, la technique est pas top, mais c'est bricolé en 10 minutes et j'avais pas de meilleure idée; je pense qu'avec un peu de connaissance en trigonométrie on doit pouvoir faire beaucoup plus efficace, mais j'ai laissé tout mon savoir mathématique sur ma copie de bac :lol:

Code : Tout sélectionner

Procedure Max(A,B)
   If A > B
      ProcedureReturn A
   Else
      ProcedureReturn B
   EndIf
EndProcedure

Procedure Min(A,B)
   If A < B
      ProcedureReturn A
   Else
      ProcedureReturn B
   EndIf
EndProcedure

Procedure.f Hue(RGB)
   Protected R, G, B, nImax, nImin, Hue.f
   If RGB < = $FFFFFF Or RGB > = 0
      R = Red(RGB)
      G = Green(RGB)
      B = Blue(RGB)
      
      nImax = Max(Max(r,b),g)
      nImin = Min(Min(r,b),g)
      
      If(nImax = r)   
         Hue=60*(g-b)/(nImax-nImin)
      ElseIf nImax = g
         Hue=60*(b-r)/(nImax-nImin)+120
      ElseIf nImax = b
         Hue=60*(r-g)/(nImax-nImin)+240
      EndIf
      
      If Hue<0
         Hue = 360 + Hue
      EndIf
   EndIf
   
   ProcedureReturn Hue
EndProcedure

Procedure.f Brightness(RGB)
   Protected R, G, B, nImax, Brightness.f
   
   If RGB < = $FFFFFF Or RGB > = 0
      R = Red(RGB)
      G = Green(RGB)
      B = Blue(RGB)
      
      nImax = Max(Max(r,b),g)
      
      Brightness = nImax/255
      
   EndIf
   
   ProcedureReturn Brightness * 100
EndProcedure

Procedure.f Saturation(RGB)
   Protected R, G, B, nImax, nImin, Saturation.f
   If RGB < = $FFFFFF Or RGB > = 0
      R = Red(RGB)
      G = Green(RGB)
      B = Blue(RGB)
      
      nImax = Max(Max(r,b),g)
      nImin = Min(Min(r,b),g)
      
      Saturation = 1 - nImin / nImax
      
   EndIf
   
   ProcedureReturn Saturation * 100
EndProcedure

Procedure HSBToRGB(Hue.f,Brightness.f,Saturation.f)
   Protected R,G,B
   
   Protected TopColor = Round(Brightness*255/100,#PB_Round_Nearest)
   
   Protected MinColor = Round((Saturation/100 -1)*-1*TopColor,#PB_Round_Nearest)
   
   Select Hue
      Case 61 To 180
         G = TopColor
         Hue = Round((Hue -120) * (TopColor - MinColor) / 60,#PB_Round_Nearest)
         
         If Hue > 0
            R = MinColor
            B = hue + R
         Else
            B = MinColor
            R = (hue - B) * -1
         EndIf
         
      Case 181 To 300
         B = TopColor
         Hue = Round((Hue -240) * (TopColor - MinColor) / 60,#PB_Round_Nearest)
         
         If Hue > 0
            G = MinColor
            R = hue + G
         Else
            R = MinColor
            G = (hue - R) * -1
         EndIf
         
      Default
         R = TopColor
         If hue > 301
            Hue - 360
         EndIf
         Hue = Round(Hue * (TopColor - MinColor) / 60,#PB_Round_Nearest)
         If hue > 0
            B = MinColor
            G  = hue + B
         Else
            G = MinColor
            B = (Hue - G) *-1
         EndIf
   EndSelect
   
   ProcedureReturn RGB(R,G,B)
 EndProcedure
Dernière modification par poshu le ven. 14/févr./2014 9:42, modifié 1 fois.
Lord Nelson
Messages : 355
Inscription : dim. 01/déc./2013 15:29

Re: Comment calculer, teinte, saturation, luminosité couleur

Message par Lord Nelson »

Bonjour,

Dobro ton code renvoie pas les même valeur de couleurs pourquoi ?
La sortie RGB n'est pas la même que l'entrée, t'as une idée pourquoi ?

De plus le résultat est beaucoup trop long :(
Imagine une boucle de 256 * 256 * 256, tu imagine toi le temps que ça va mètre 8O

En tout qu'a merci beaucoup pour ce code :)
Déjà ton code RBG_TSL est très performant alors 1000 merci à toi.

@poshu Bonjour,

Non bien sur que non je ne t’ignore pas, loin de là d'ailleurs :)
T'es codes sont aussi très bon et c'est un plaisir de vous avoirs vous tous pour débattre de se sujet très intéressant :wink:

Encore merci.

PS: Ton code TSLToRGB marche très bien :D
Dobro, qu'a tu à dire pour ta défense ? :lol:

C'est toujours très agréable de voir un tas de personne nous aider et s’affronter si je puis dire ainsi pour trouver les meilleurs solutions possible.
Dernière modification par Lord Nelson le ven. 14/févr./2014 9:59, modifié 1 fois.
poshu
Messages : 1138
Inscription : sam. 31/juil./2004 22:32

Re: Comment calculer, teinte, saturation, luminosité couleur

Message par poshu »

Lord Nelson a écrit :Bonjour,

Dobro ton code renvoie pas les même valeur de couleurs pourquoi ?
La sortie RGB n'est pas la même que l'entrée, t'as une idée pourquoi ?

De plus le résultat est beaucoup trop long :(
Imagine une boucle de 256 * 256 * 256, tu imagine toi le temps que ça va mètre 8O

En tout qu'a merci beaucoup pour ce code :)
Déjà ton code RBG_TSL est très performant alors 1000 merci à toi.
Mais, par curiosité, tu lis ce que j'écris? Juste pour savoir si je suis un pot de fleur ou pas :
  • • Avec 3 600 000 possibilités pour du HBL arrondi contre 16 777 216 pour du RGB, forcément tu peux pas retrouver précisément la même couleur. Si tu veux retrouver la même couleur, faut pas arrondir (voir mon code qui n’arrondit pas, deux posts au dessus)
  • • Sans tester des millions de combinaisons pour retrouver ton RGB, y'a aussi mon code, toujours deux posts au dessus...
Dernière modification par poshu le ven. 14/févr./2014 10:03, modifié 1 fois.
Lord Nelson
Messages : 355
Inscription : dim. 01/déc./2013 15:29

Re: Comment calculer, teinte, saturation, luminosité couleur

Message par Lord Nelson »

On viens de se croiser mon cher @poshu :lol:
Non tu n'est en rien un pot de fleur, c'est surement moi qui est mal lue ou pas bien compris, je suis parfois un peut tête en l'air :oops:
Mais, par curiosité, tu lis ce que j'écris? Juste pour savoir si je suis un pot de fleur ou pas :

• Avec 3 600 000 possibilités pour du HBL arrondi contre 16 777 216 pour du RGB, forcément tu peux pas retrouver précisément la même couleur. Si tu veux retrouver la même couleur, faut pas arrondir (voir mon code qui n’arrondit pas, deux posts au dessus)

• Sans tester des millions de combinaisons pour retrouver ton RGB, y'a aussi mon code, toujours deux posts au dessus...
Bha oui évidement que tu as raison et je l'es bien compris qu'il ne fallait pas arrondir :)
Oui ton code est mieux pour le TSL vers RGB mais chuuuuuuut le dit pas à Dobro qui a passé des heurs à chercher sur internet la solution, il pourrais se fâcher...
Répondre