Page 1 sur 1

Changer la teinte d'une couleur

Publié : dim. 27/mars/2011 22:07
par Le Soldat Inconnu
Voici une fonction qui permet de modifier la teinte d'une couleur.

Le paramètre level est un facteur allant de -1 à 1 pour faire évoluer la teinte de la couleur.

Level = 0 donne aucun changement
Level = 1 ne donne aucun changement également car vous avez fait le tour des teintes
Level = -1 ne donne aucun changement également car vous avez fait le tour des teintes
Level = 0.3333333 transforme du rouge en vert
Level = 0.6666666 transforme du rouge en bleu
etc ...

Après, il suffit d'appliquer ma fonction a chaque pixel d'une image pour en changer la teinte.

Amusez-vous bien

Code : Tout sélectionner

; Auteur : Le Soldat Inconnu
; Version de PB : 4.50
;
; Explication du programme :
; Changer la teinte d'une couleur

Procedure ColorTint2(Color, Level.d) ; Change color tint (-1 <= Level <= 1)
	Protected Rouge, Vert, Bleu, Alpha, a.d, Nuance_Blanc, Nuance_Noir, b.d, i, ii
  
	If Level > 0.5
		Level -1
	ElseIf Level < -0.5
		Level + 1
	EndIf
	If Level > 1
		Level = 1
	ElseIf Level < -1
		Level = -1
	EndIf
	
  Rouge = Color & $FF
  Vert = Color >> 8 & $FF
  Bleu = Color >> 16 & $FF
	Alpha = Color >> 24
	
	; Recherche de la teinte
	If Bleu >= Vert And Bleu >= Rouge And Bleu > 0
    a = 255 / Bleu
    Nuance_Noir = 255 - Bleu
    Bleu = 255
    Vert = a * Vert
    Rouge = a * Rouge
	ElseIf Vert >= Bleu And Vert >= Rouge And Vert > 0
    a = 255 / Vert
    Nuance_Noir = 255 - Vert
    Bleu = a * Bleu
    Vert = 255
    Rouge = a * Rouge
	ElseIf Rouge >= Vert And Rouge >= Bleu And Rouge > 0
    a = 255 / Rouge
    Nuance_Noir = 255 - Rouge
    Bleu = a * Bleu
    Vert = a * Vert
    Rouge = 255
	Else
    Nuance_Noir = 255
    Bleu = 255
    Vert = 255
    Rouge = 255
	EndIf
  
  If Bleu < Vert And Bleu < Rouge
    a = 1 - (Bleu / 255)
    Nuance_Blanc = 255 - Bleu
    Vert = (Vert - Bleu) / a
    Rouge = (Rouge - Bleu) / a
    Bleu = 0
	ElseIf Vert < Bleu And Vert < Rouge
    a = 1 - (Vert / 255)
    Nuance_Blanc = 255 - Vert
    Bleu = (Bleu - Vert) / a
    Rouge = (Rouge - Vert) / a
    Vert = 0
	ElseIf Rouge < Bleu And Rouge < Vert
    a = 1 - (Rouge / 255)
    Nuance_Blanc = 255 - Rouge
    Bleu = (Bleu - Rouge) / a
    Vert = (Vert - Rouge) / a
    Rouge = 0
	Else
    Nuance_Blanc = 255
	EndIf
	
	ii = Level * 1530
	If ii > 0
		For i = 1 To ii
			If Rouge = 255 And Vert <> 255 And Bleu = 0
				Vert + 1
			ElseIf Vert = 255 And Rouge <> 0 And Bleu = 0
				Rouge - 1
			ElseIf Vert = 255 And Bleu <> 255 And Rouge = 0
				Bleu + 1
			ElseIf Bleu = 255 And Vert <> 0 And Rouge = 0
				Vert - 1
			ElseIf Bleu = 255 And Rouge <> 255 And Vert = 0
				Rouge + 1
			ElseIf Rouge = 255 And Bleu <> 0 And Vert = 0
				Bleu - 1
			EndIf
		Next
	Else
		ii = -ii
		For i = 1 To ii
			If Bleu = 255 And Vert <> 255 And Rouge = 0
				Vert + 1
			ElseIf Vert = 255 And Bleu <> 0 And Rouge = 0
				Bleu - 1
			ElseIf Vert = 255 And Rouge <> 255 And Bleu = 0
				Rouge + 1
			ElseIf Rouge = 255 And Vert <> 0 And Bleu = 0
				Vert - 1
			ElseIf Rouge = 255 And Bleu <> 255 And Vert = 0
				Bleu + 1
			ElseIf Bleu = 255 And Rouge <> 0 And Vert = 0
				Rouge - 1
			EndIf
		Next
	EndIf
	
  a = 1 - Nuance_Blanc / 255
  b = (255 - Nuance_Noir) / 255
  Rouge = (Rouge + (255 - Rouge) * a) * b
  If Rouge < 0
    Rouge = 0
	ElseIf Rouge > 255
    Rouge = 255
	EndIf
  Vert = (Vert + (255 - Vert) * a) * b
  If Vert < 0
    Vert = 0
	ElseIf Vert > 255
    Vert = 255
	EndIf
  Bleu = (Bleu + (255 - Bleu) * a) * b
  If Bleu < 0
    Bleu = 0
	ElseIf Bleu > 255
    Bleu = 255
	EndIf
	
	ProcedureReturn (Rouge | Vert <<8 | Bleu << 16 | Alpha << 24)
EndProcedure

CompilerIf #PB_Compiler_Debugger
	#NbIterationTestVitesse = 720
CompilerElse
	#NbIterationTestVitesse = 72000
CompilerEndIf

; Création de la fenêtre et de la GadgetList
If OpenWindow(0, 0, 0, 501, 320, "ColorTint", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget) = 0
  End
EndIf

CreateImage(0, 501, 300, 32 | #PB_Image_Transparent)

StartDrawing(ImageOutput(0))
	DrawingMode(#PB_2DDrawing_AlphaBlend)
	
	Line(100, 0, 1, 300, $FF000000)
	
	For i = 0 To 500
		
		Teinte.f = (i - 100) / 500
		
		y = 10
		
		Couleur = $FF00FF00
		Couleur2 = ColorTint2(Couleur, Teinte)
		Line(i, y, 1, 20, Couleur2)
		y + 30
		
		Couleur = $FF0000FF
		Couleur2 = ColorTint2(Couleur, Teinte)
		Line(i, y, 1, 20, Couleur2)
		y + 30
		
		Couleur = $FFFF0000
		Couleur2 = ColorTint2(Couleur, Teinte)
		Line(i, y, 1, 20, Couleur2)
		y + 30
		
		Couleur = $FFC0A137
		Couleur2 = ColorTint2(Couleur, Teinte)
		Line(i, y, 1, 20, Couleur2)
		y + 30
		
		Couleur = $FFD6FFAD
		Couleur2 = ColorTint2(Couleur, Teinte)
		Line(i, y, 1, 20, Couleur2)
		y + 30
		
		Couleur = $FFFFFDEC
		Couleur2 = ColorTint2(Couleur, Teinte)
		Line(i, y, 1, 20, Couleur2)
		y + 30
		
		Couleur = $FFFFFFFF
		Couleur2 = ColorTint2(Couleur, Teinte)
		Line(i, y, 1, 20, Couleur2)
		y + 30
		
		Couleur = $FF163205
		Couleur2 = ColorTint2(Couleur, Teinte)
		Line(i, y, 1, 20, Couleur2)
		y + 30
		
		Couleur = $FF000000
		Couleur2 = ColorTint2(Couleur, Teinte)
		Line(i, y, 1, 20, Couleur2)
		y + 30
		
	Next
	
	Couleur = $FFC0A137
	Temps = ElapsedMilliseconds()
	For i = 1 To #NbIterationTestVitesse
		Couleur2 = ColorTint2(Couleur, 0.5)
	Next
	Temps = ElapsedMilliseconds() - Temps
	
StopDrawing()


ImageGadget(0, 0, 0, 501, 300, ImageID(0))
TextGadget(1, 0, 300, 501, 20, "Temps de calcul = " + StrD(Temps * 1000 / #NbIterationTestVitesse, 1) + "µs")

Repeat
  Event = WaitWindowEvent()
  
  Select Event
		Case #PB_Event_Menu
      Select EventMenu() ; Menus
          
			EndSelect
      
		Case #PB_Event_Gadget
      Select EventGadget() ; Gadgets
          
			EndSelect
	EndSelect
  
Until Event = #PB_Event_CloseWindow

Re: Changer la teinte d'une couleur

Publié : dim. 27/mars/2011 23:21
par Jacobus
Super! la fonction qui tombe à pic.
Dès que j'ai le temps je teste sur une photo...

Re: Changer la teinte d'une couleur

Publié : mar. 29/mars/2011 14:35
par dayvid
Ouoi, c'est d'enfer ce code :D
trop bien, merci beaucoup Le Soldat Inconnu

Re: Changer la teinte d'une couleur

Publié : mar. 29/mars/2011 17:40
par Le Soldat Inconnu
J'ai remis à jour ma librairie Effect sur mon site, cette fonction est dedans.

Re: Changer la teinte d'une couleur

Publié : mar. 29/mars/2011 19:37
par Le Soldat Inconnu
Code modifié, il y avait une erreur. Ça ne fonctionnait pas avec la couleur blanche :lol:

Re: Changer la teinte d'une couleur

Publié : ven. 01/avr./2011 13:27
par dayvid
Salut

C'est vraiment étonnant ce code :)
tu pense que se serais possible de faire un petit tuto pour savoir l'utiliser :P

Re: Changer la teinte d'une couleur

Publié : mer. 20/avr./2011 22:15
par Le Soldat Inconnu
Mise à jour du code ci-dessus. J'ai uniquement apporté des optimisations.

Si l'un d'entre vous trouve des solutions pour optimiser encore plus, je suis preneur :D


Pour une explication concrète de la méthode utilisée pour changer la teinte, je vais utiliser mon sélecteur de couleur.
Image

Donc grâce à cette image, je vais pouvoir expliquer le code. Je pars donc de la couleur sélectionnée avec le curseur rond dans le nuancier.

la première étape consiste à décomposer la couleur en 3 points :
- Nuance de blanc (position en X du curseur sur l'image)
- Nuance de noir (position en Y du curseur sur l'image)
- Teinte (couleur en haut à droite du nuancier)
Une teinte se compose forcément de rouge et de bleu, ou de vert et de bleu, ou de rouge et vert, mais jamais de rouge, de vert et de bleu à la fois. Il y a forcément dans la couleur une composante nulle (donc rouge = 0 ou vert = 0 ou bleu = 0)

Ensuite, je change la teinte.

Pour faire évoluer la teinte, c'est le principe d'un arc en ciel.
Si je part du rouge RGB(255, 0, 0)
j'ajoute du vert progressivement jusqu'à RGB(255, 255, 0)
je diminue le rouge jusqu'à RGB(0, 255, 0)
j'ajoute du bleu progressivement jusqu'à RGB(0, 255, 255)
je diminue le vert jusqu'à RGB(0, 0, 255)
j'ajoute du rouge progressivement jusqu'à RGB(255, 0, 255)
je diminue le bleu jusqu'à RGB(255, 0, 0)
et j'ai fait la palette de couleur de l'arc en ciel

Donc connaissant le principe d'un arc-en-ciel, je retrouve ma teinte dans l'arc-en-ciel et je me déplace sur l'arc en ciel en fonction de la valeur de "level"

Puis je ré-applique la nuance de blanc et la nuance de noir à la teinte pour retrouver la nouvelle couleur

Re: Changer la teinte d'une couleur

Publié : jeu. 21/avr./2011 0:03
par Backup
au passage , il y a un petit bug dans ton selecteur de couleur
c'est pas bien mechant.. mais...

lorsque tu sélectionne une couleur, tu confirme avec le bouton vert au
dessus de la crois rouge

et bien si tu clique sans bouger le pointeur , on ne sort pas du selecteur ...
il faut legerement bouger le pointeur, pour que la selection soit prise en compte... :?

a part ça , j'aime bien ce selecteur :)

Re: Changer la teinte d'une couleur

Publié : jeu. 21/avr./2011 18:56
par Le Soldat Inconnu
Ah ? je vais regarder :)

Re: Changer la teinte d'une couleur

Publié : ven. 22/avr./2011 14:02
par dayvid
Merci LSI pour ton explication simple :)