Changer la teinte d'une couleur

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Changer la teinte d'une couleur

Message 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
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Re: Changer la teinte d'une couleur

Message par Jacobus »

Super! la fonction qui tombe à pic.
Dès que j'ai le temps je teste sur une photo...
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
dayvid
Messages : 1242
Inscription : mer. 11/nov./2009 18:17
Localisation : Poitiers (Vienne)

Re: Changer la teinte d'une couleur

Message par dayvid »

Ouoi, c'est d'enfer ce code :D
trop bien, merci beaucoup Le Soldat Inconnu
La vie, C'est comme, Une boitte, De startis, On en voie, De toutes, Les couleurs !

Mon forum http://purebasic.forumphp3.com/index.php
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: Changer la teinte d'une couleur

Message par Le Soldat Inconnu »

J'ai remis à jour ma librairie Effect sur mon site, cette fonction est dedans.
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: Changer la teinte d'une couleur

Message par Le Soldat Inconnu »

Code modifié, il y avait une erreur. Ça ne fonctionnait pas avec la couleur blanche :lol:
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
dayvid
Messages : 1242
Inscription : mer. 11/nov./2009 18:17
Localisation : Poitiers (Vienne)

Re: Changer la teinte d'une couleur

Message 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
La vie, C'est comme, Une boitte, De startis, On en voie, De toutes, Les couleurs !

Mon forum http://purebasic.forumphp3.com/index.php
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: Changer la teinte d'une couleur

Message 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
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Changer la teinte d'une couleur

Message 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 :)
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: Changer la teinte d'une couleur

Message par Le Soldat Inconnu »

Ah ? je vais regarder :)
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
dayvid
Messages : 1242
Inscription : mer. 11/nov./2009 18:17
Localisation : Poitiers (Vienne)

Re: Changer la teinte d'une couleur

Message par dayvid »

Merci LSI pour ton explication simple :)
La vie, C'est comme, Une boitte, De startis, On en voie, De toutes, Les couleurs !

Mon forum http://purebasic.forumphp3.com/index.php
Répondre