Comment calculer, teinte, saturation, luminosité couleur

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Lord Nelson
Messages : 355
Inscription : dim. 01/déc./2013 15:29

Comment calculer, teinte, saturation, luminosité couleur

Message par Lord Nelson »

Bonjour,

Je viens vers vous, car je recherche désespérément des fonctions pour calculer réellement :

La teinte d'une couleur
La saturation d'une couleur
La Luminosité d'une couleur

Il y a tellement de façon de faire j'ai pu remarquer, sur paint par exemple qui n'est certes pas une référence je vous l'accorde volontiers, va de 0 à 240
Sur PureBasic, c'est de 0 à 100, sur d'autre, de 0 à 255, alors excusez-moi du peu si je suis perdus !

Je voudrais calculer sur une échelle allant de 0 à 255 si tenté que cette échelle soit bien la bonne !
Quelle est donc la véritable échelle ?!

Je suis inexpérimenté pour ne pas dire que je suis nul en math donc inutile de me
sortir des opérations et formules incompréhensibles :wink:

J'ai bien tenté de regarder sur le wiki pour voir s'il avait la solution à mon problème
mais rien que de voir toutes ces formules ma rendus la nausée :?

Puis-je vous demander humblement votre aide svp.
poshu
Messages : 1138
Inscription : sam. 31/juil./2004 22:32

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

Message par poshu »

Bon, j'ai pas testé (parce que j'ai pas de référence), mais ça doit ressembler à quelque chose comme ça d'après wikipedia:

Code : Tout sélectionner

Procedure Hue(RGB)
	Protected result, R, G, B
	If RGB < = $FFFFFF Or RGB > = 0
		R = Red(RGB)
		G = Green(RGB)
		B = Blue(RGB)
		result = ATan2(Sqr(3)*(G-B),2*R-G-B)
	EndIf
	
	ProcedureReturn result
EndProcedure
poshu
Messages : 1138
Inscription : sam. 31/juil./2004 22:32

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

Message par poshu »

J'avais pas vu que tu voulais aussi l'intensité et la saturation, du coup, j'ai pompé le code d'ici, mais j'en ai fait des fonctions séparées (donc y'a un peu de redondance)

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, nSum = nImin+nImax, nDifference, Intensity.f, Saturation.f, Hue.f
	If RGB < = $FFFFFF Or RGB > = 0
		R = Red(RGB)
		G = Green(RGB)
		B = Blue(RGB)
		
		nImax = Max(r,b)
		nImax = Max(nImax,g)
		nImin = Min(r,b)
		nImin = Min(nImin,g)
		nSum = nImin+nImax
		nDifference =nImax-nImin
		
		Intensity = nSum/2
		
		If(Intensity<128)
			Saturation=255*(nDifference/nSum)
		Else
			Saturation=255*(nDifference/(510-nSum))
		EndIf
		
		If Saturation<>0
			If(nImax = r)    
				Hue=60*(g-b)/nDifference
			ElseIf nImax = g
				Hue=60*(b-r)/nDifference+120
			ElseIf nImax = b
				Hue=60*(r-g)/nDifference+240
			EndIf
			If Hue<0
				Hue= 60*(b-r)/nDifference+120
			EndIf
		EndIf
	EndIf
	
	ProcedureReturn Hue
EndProcedure

Procedure.f Intensity(RGB)
	Protected R, G, B, nImax,  nImin, nSum = nImin+nImax, Intensity.f
	
	If RGB < = $FFFFFF Or RGB >  0
		R = Red(RGB)
		G = Green(RGB)
		B = Blue(RGB)
		
		nImax = Max(r,b)
		nImax = Max(nImax,g)
		nImin = Min(r,b)
		nImin = Min(nImin,g)
		nSum = nImin+nImax
		
		Intensity = nSum/2
		
	EndIf
	
	ProcedureReturn Intensity
EndProcedure

Procedure.f Saturation(RGB)
	Protected R, G, B, nImax, nImin, nSum = nImin+nImax, nDifference, Intensity.f, Saturation.f
	If RGB < = $FFFFFF Or RGB >  0
		R = Red(RGB)
		G = Green(RGB)
		B = Blue(RGB)
		
		nImax = Max(r,b)
		nImax = Max(nImax,g)
		nImin = Min(r,b)
		nImin = Min(nImin,g)
		nSum = nImin+nImax
		nDifference =nImax-nImin
		
		Intensity = nSum/2
		
		If(Intensity<128)
			Saturation=255*(nDifference/nSum)
		Else
			Saturation=255*(nDifference/(510-nSum))
		EndIf
	EndIf
	
	ProcedureReturn Saturation
EndProcedure
Encore une fois: j'ai pas de référence pour tester é_è
Dernière modification par poshu le mer. 12/févr./2014 20:56, 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 poshu,

Je te remercie beaucoup de ton aide :)
Je vais de se pas vérifier si cella fonctionne :D

Edit: Je crois que cella ne fonctionne pas très bien :?
Exemple:

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 Teinte(RGB)
  Protected R, G, B, nImax, nImin, nSum = nImin+nImax, nDifference, Intensity.f, Saturation.f, Hue.f
  If RGB < = $FFFFFF Or RGB >  0
    R = Red(RGB)
    G = Green(RGB)
    B = Blue(RGB)
    
    nImax = Max(r,b)
    nImax = Max(nImax,g)
    nImin = Min(r,b)
    nImin = Min(nImin,g)
    nSum = nImin+nImax
    nDifference =nImax-nImin
    
    Intensity = nSum/2
    
    If(Intensity<128)
      Saturation=255*(nDifference/nSum)
    Else
      Saturation=255*(nDifference/(510-nSum))
      If Saturation<>0
        If(nImax = r)   
          Hue=60*(g-b)/nDifference
        ElseIf nImax = g
          Hue=60*(b-r)/nDifference+120
        ElseIf nImax = b
          Hue=60*(r-g)/nDifference+240
        EndIf
        
        If Hue<0
          Hue= 60*(b-r)/nDifference+120
        EndIf
      EndIf
    EndIf
  EndIf
  
  ProcedureReturn Hue
EndProcedure

Procedure.f Saturation(RGB)
  Protected R, G, B, nImax, nImin, nSum = nImin+nImax, nDifference, Intensity.f, Saturation.f
  If RGB < = $FFFFFF Or RGB >  0
    R = Red(RGB)
    G = Green(RGB)
    B = Blue(RGB)
    
    nImax = Max(r,b)
    nImax = Max(nImax,g)
    nImin = Min(r,b)
    nImin = Min(nImin,g)
    nSum = nImin+nImax
    nDifference =nImax-nImin
    
    Intensity = nSum/2
    
    If(Intensity<128)
      Saturation=255*(nDifference/nSum)
    Else
      Saturation=255*(nDifference/(510-nSum))
    EndIf
  EndIf
  
  ProcedureReturn Saturation
EndProcedure

Procedure.f Luminosite(RGB)
  Protected R, G, B, nImax,  nImin, nSum = nImin+nImax, Intensity.f
  
  If RGB < = $FFFFFF Or RGB >  0
    R = Red(RGB)
    G = Green(RGB)
    B = Blue(RGB)
    
    nImax = Max(r,b)
    nImax = Max(nImax,g)
    nImin = Min(r,b)
    nImin = Min(nImin,g)
    nSum = nImin+nImax
    
    Intensity = nSum/2
    
  EndIf
  
  ProcedureReturn Intensity
EndProcedure

Debug Teinte(451259)
Debug Saturation(451259)
Debug Luminosite(451259)
Debug "---------"
Debug Teinte(451258)
Debug Saturation(451258)
Debug Luminosite(451258)
Debug "---------"
Debug Teinte(451257)
Debug Saturation(451257)
Debug Luminosite(451257)
Normalement les résultats devrais être différent non ?
Ils sont tous pareils là :?
poshu
Messages : 1138
Inscription : sam. 31/juil./2004 22:32

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

Message par poshu »

J'en ai pas la moindre idée... Tu peux me donner des références?

Genre pour la hue/saturation/intensity pour quelques couleurs, que je regarde un peu ce que je suis sensé chercher (parce que j'ai google hue et c'est ce qu'on m'a sorti; mais comme je sais pas ce que c'est censé être...)?

Note : y'avait bien une faute dans mon calcul de hue (petit endif mal placé ^^; ), c'est corrigé au dessus.
poshu
Messages : 1138
Inscription : sam. 31/juil./2004 22:32

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

Message par poshu »

Bon, j'ai fait des tests en utilisant photoshop (mais je sais pas si c'est ces résultats que tu veux ou d'autres...)

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
Avec ça, j'obtiens les mêmes valeurs que photoshop CS6, aka Hue en ° compris entre 0 et 360, Saturation et Brightness en % comprises entre 0 et 100%, le tout arrondi à la valeur la plus proche
Dernière modification par poshu le ven. 14/févr./2014 9:59, modifié 1 fois.
Avatar de l’utilisateur
TazNormand
Messages : 1297
Inscription : ven. 27/oct./2006 12:19
Localisation : Calvados (14)

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

Message par TazNormand »

Salut
A une époque lointaine j'avais codé des fonctions de conversion RGB vers HSL, voir ce post

Et le code correspondant, mais pas remis au gout du jour (pas en PB 5.21)

Code : Tout sélectionner

; Procédure pour conversion RGB<->HSL
;
; ©.2011 TazNormand

; En TSL (HSL en anglais), la teinte est un angle de 0 à 360°
; La saturation une valeur de 0 à 100%, de même pour la luminosité 0 à 100%

; Variables
Global.f Hue,Sat,Light
Global.l Rouge,Vert,Bleu,Alph

; Déclarations
Declare RGB2HSL(ColR.i,ColG.i,ColB.i)
Declare HSL2RGB(VHue.f,VSat.f,VLit.f)
Declare.f Hue2RGB(Val1.f,Val2.f,Val_H.f)
Declare.f Mini2(val_1.f,val_2.f)
Declare.f Mini3(val_1.f,val_2.f,val_3.f)
Declare.f Maxi2(val_1.f,val_2.f)
Declare.f Maxi3(val_1.f,val_2.f,val_3.f)

; Procédures
Procedure RGB2HSL(ColR.i,ColG.i,ColB.i)
	var_R.f=(ColR/255)
	var_G.f=(ColG/255)
	var_B.f=(ColB/255)
	
	var_Min.f=Mini3(var_R,var_G,var_B)
	var_Max.f=Maxi3(var_R,var_G,var_B)
	del_Max.f=var_Max - var_Min
	
	Light=((var_Max + var_Min) / 2)*100
	
	If del_Max=0
		Hue=0
		Sat=0
	Else
		If Light<=0.5
			Sat=(del_Max / (var_Max + var_Min))*100
		Else
			Sat=(del_Max / (2 - (var_Max + var_Min)))*100
		EndIf
		
		del_R.f=(((var_Max - var_R) / 6) + (del_Max / 2)) / del_Max    
		del_G.f=(((var_Max - var_G) / 6) + (del_Max / 2)) / del_Max    
		del_B.f=(((var_Max - var_B) / 6) + (del_Max / 2)) / del_Max    
			
		If var_R=var_Max            
			Hue=del_B - del_G      
			Hue=((60 * ((var_g - var_b) / del_max)) + 360); % 360      
			;Else      
		ElseIf var_G=var_Max    
			Hue=(1 / 3) + del_R - del_B      
			Hue=(60 * ((var_b - var_r) / del_Max)+120)      
		ElseIf var_B=var_Max      
			Hue=(2 / 3) + del_G - del_R
			Hue=360*Hue
		EndIf        
		;EndIf  
			
		If Hue<0      
			Hue+360      
		EndIf    
		
		If Hue>360      
			Hue-360      
		EndIf  
	EndIf   
EndProcedure

Procedure HSL2RGB(VHue.f,VSat.f,VLit.f)
	vHue/360
	VSat/100
	VLit/100
	If VSat=0
		Rouge=VLit * 255
		Vert= VLit * 255
		Bleu= VLit * 255
	Else
		If VLit<0.5
			tmp_2.f=VLit * (1 + VSat)
		Else
			tmp_2.f=(VLit + VSat) - (VSat * VLit)
		EndIf
		
		tmp_1.f=(2 * VLit) - tmp_2
		
		Rouge=Int(255 * Hue2RGB(tmp_1,tmp_2,VHue + (1 / 3)))
		Vert =Int(255 * Hue2RGB(tmp_1,tmp_2,VHue))
		Bleu =Int(255 * Hue2RGB(tmp_1,tmp_2,VHue - (1 / 3)))
	EndIf  
EndProcedure

Procedure.f Hue2RGB(Val1.f,Val2.f,Val_H.f)
	If Val_H<0
		Val_H+1
	EndIf
	If Val_H>1
		Val_H-1
	EndIf
	If (6 * Val_H)<1
		tmp.f=(Val1 + (Val2 - Val1) * 6 * Val_H)
		ProcedureReturn tmp
	EndIf
	If (2 * Val_H)<1
		tmp.f=Val2
		ProcedureReturn tmp  
	EndIf
	If (3 * Val_H)<2
		tmp.f=(Val1 + (Val2 - Val1) * ((2 / 3) - Val_H) * 6)
		ProcedureReturn tmp  
	EndIf
	
	ProcedureReturn Val1  
EndProcedure

Procedure.f Mini3(val_1.f,val_2.f,val_3.f)
	tmp_1.f=Mini2(val_1,val_2)
	min_3.f=Mini2(tmp_1,val_3)
	
	ProcedureReturn min_3
EndProcedure

Procedure.f Maxi3(val_1.f,val_2.f,val_3.f)
	tmp_1.f=Maxi2(val_1,val_2)
	max_3.f=Maxi2(tmp_1,val_3)
	
	ProcedureReturn max_3
EndProcedure

; Minimum entre 2 valeurs
Procedure.f Mini2(val_1.f,val_2.f)
	If val_1<=val_2
		minimum2.f=val_1
	Else
		minimum2.f=val_2
	EndIf
	ProcedureReturn minimum2
EndProcedure

; Maximum entre 2 valeurs
Procedure.f Maxi2(val_1.f,val_2.f)
	If val_1<=val_2
		maximum2.f=val_2
	Else
		maximum2.f=val_1
	EndIf
	ProcedureReturn maximum2
EndProcedure

#ScrW = 640
#ScrH = 480
#ScrD = 32

If InitSprite() = 0 Or InitKeyboard() = 0 
	MessageRequester( "Erreur" , "Initialisations impossibles", 0)
	End
ElseIf OpenScreen( #ScrW , #ScrH , #ScrD , "HSL Plasma" ) = 0
	MessageRequester( "Erreur" , "Ouverture écran impossible" , 0 )
	End
EndIf
H.f=180
S.f=50
L.f=50
Repeat
	ExamineKeyboard()
	StartDrawing(ScreenOutput())    
			DrawText(0,00,"E pour Hue-,   R pour Hue+",RGB(255,255,255))
			DrawText(0,20,"D pour Sat-,   F pour Sat+",RGB(255,255,255))
			DrawText(0,40,"C pour Light-, V pour Light+",RGB(255,255,255))
			DrawText(0,60,"Escape pour sortir",RGB(255,0,0))
			
			DrawText(300,00,"Hue : "+Str(H)+"°    ",RGB(255,255,255))
			DrawText(300,20,"Sat : "+Str(S)+"%    ",RGB(255,255,255))
			DrawText(300,40,"Lit : "+Str(L)+"%    ",RGB(255,255,255))
			
			DrawText(400,00,"Rouge : "+Str(Rouge)+"    ",RGB(255,255,255))
			DrawText(400,20,"Vert  : "+Str(Vert)+"    ",RGB(255,255,255))
			DrawText(400,40,"Bleu  : "+Str(Bleu)+"    ",RGB(255,255,255))
			
			If KeyboardPushed(#PB_Key_E)
				H-1
				If H<0:H=359:EndIf
			EndIf
			If KeyboardPushed(#PB_Key_R)
				H+1
				If H>360:H=0:EndIf
			EndIf
			If KeyboardPushed(#PB_Key_D)
				S-1
				If S<0:S=0:EndIf
			EndIf
			If KeyboardPushed(#PB_Key_F)
				S+1
				If S>100:S=100:EndIf
			EndIf
			If KeyboardPushed(#PB_Key_C)
				L-1
				If L<0:L=0:EndIf
			EndIf
			If KeyboardPushed(#PB_Key_V)
				L+1
				If L>100:L=100:EndIf
			EndIf
			
			hsltransform=HSL2RGB(H,S,L)      
			Box(100,100,200,200,RGB(Rouge,Vert,Bleu))  
	StopDrawing()
	FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
Image
Image
Lord Nelson
Messages : 355
Inscription : dim. 01/déc./2013 15:29

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

Message par Lord Nelson »

Je vous remercie pour votre précieuse aide :)

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 ?

Exemple que tu peux tester avec ton programme:
451259 (Couleur brut), donne:

Teinte = 71
Saturation = 97
Luminosité = 89

451260 (Couleur brut), donne:

Teinte = 71
Saturation = 97
Luminosité = 89

451261 (Couleur brut), donne:

Teinte = 71
Saturation = 97
Luminosité = 89
Il y a je pense problème non ?

Les 3 couleurs qui sont très proche les unes des autres devrais pourtant avoir certains résultats différents, au moins une non ?
Là tous les résultats sont identiques !

En conclusion, même deux couleurs voisine ne peuvent pas avoir les mêmes résultats
de teinte et saturation si la luminosité est identique aux deux.

Donc je crains fort que t'es procédures sois faussent si je ne me trompe :oops:
Maintenant je peut complètement me tromper hein car j'y connais pas grand choses en couleurs :oops:

TazNormand merci pour ton programme mais je ne parviens pas à le faire fonctionner chez moi :(
Si seulement il y avais une vérritable façon de faire...

Fred ne pourrait-il pas rajouter des fonctions pour calculer ceci ?!
Encore merci de votre aide :)
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

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

Message par falsam »

Bonjour Lord Nelson.

N'ayant pas de grandes connaissances dans ce domaine, je ne te répondrais pas. :) Par contre je te propose le lien ci-dessous et peut être que tu pourrais nous coder ces deux formules miracles (Teinte, Saturation et luminosité) à partir d'une couleur RGB ou RGBA.

http://www.easyrgb.com/index.php?X=MATH

En 2011 j'avais déja essayé de faire quelque chose sur la saturation.
http://www.purebasic.fr/french/viewtopi ... 70#p134670
Dernière modification par falsam le jeu. 13/févr./2014 10:35, modifié 2 fois.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
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 »

poshu a écrit :Bon, j'ai fait des tests en utilisant photoshop (mais je sais pas si c'est ces résultats que tu veux ou d'autres...)

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
Bonjour Poshu, moi j'aurais plutôt fait comme ça :

Code : Tout sélectionner

ProcedureDLL Minimum(R, V, B) 
  Protected resultat = r 
  If v < resultat
    resultat = v
  EndIf 
  If b < resultat
    resultat = b
  EndIf 
  ProcedureReturn resultat 
EndProcedure 

ProcedureDLL Maximum(R, V, B) 
  Protected resultat = r 
  If v > resultat
    resultat = v
  EndIf 
  If b > resultat
    resultat = b
  EndIf 
  ProcedureReturn resultat 
EndProcedure
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 !
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

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

Message par GallyHC »

Bonjour,

falsam> ton lien est vachement intéressent dans tout les cas, je le note bien ;)

Cordialement,
GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
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 »

Bonjour falsam, je me joins à GallyHC que je salue également pour te faire le même compliment.
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 »

...
Dernière modification par Backup le mar. 19/août/2014 9:48, modifié 1 fois.
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

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

Message par Fig »

D'une façon ou d'une autre, la formule donnée par wikipédia ne correspond pas à celle utilisée par photoshop.

Image
Image
Image

Code : Tout sélectionner

Procedure Max(R, G, B)
    resultat = R
    If G > R
        resultat = G
    EndIf
    If B > resultat
        Resultat=B
    EndIf
    ProcedureReturn resultat
EndProcedure

Procedure Min(R, G, B)
    resultat = R
    If G < R
        resultat = G
    EndIf
    If B < resultat
        Resultat=B
    EndIf
    ProcedureReturn resultat
EndProcedure 

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

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

Procedure 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(r,g,b)
        nImin = Min(r,g,b)
        If nImax=0:ProcedureReturn 0:EndIf
        resultat.f=(1 - nImin / nImax)
        ProcedureReturn resultat*100
    EndIf
EndProcedure
Debug "Pour :"+Str(451259)
Debug "Hue: "+Str(Hue(451259))
Debug "Sat: "+Str(saturation(451259))
Debug "Int: "+Str(Intensity(451259))
Debug " "
Debug "Pour :"+Str(451260)
Debug "Hue: "+Str(Hue(451260))
Debug "Sat: "+Str(saturation(451260))
Debug "Int: "+Str(Intensity(451260))
Il y avait un souci d'arrondi...
Pour :451259
Hue: 71
Sat: 97
Int: 88

Pour :451260
Hue: 70
Sat: 97
Int: 88
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
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:48, modifié 5 fois.
Répondre