Changer la luminosité d'une couleur
Publié : mer. 20/avr./2011 22:22
Salut,
je continue de refaire ma librairie Effect en prenant en compte les nouvelles méthodes que j'ai découverte pour gérer les couleurs.
Après la modification de teinte http://www.purebasic.fr/french/viewtopi ... =6&t=11674
Voici une modification plus basique, le changement de la luminosité.
Le principe reste sensiblement le même que pour la modification de la teinte (voir le sujet dont le lien est ci dessus)
la première étape consiste à décomposer la couleur en 3 points :
- Nuance de blanc
- Nuance de noir
- Teinte
Ensuite, je modifie la nuance de noir et de blanc en fonction de la luminosité
Puis j’applique les nouvelles nuances de noir et de blanc à la teinte pour créer la nouvelle couleur.
Toute proposition d’optimisation est la bienvenue 
je continue de refaire ma librairie Effect en prenant en compte les nouvelles méthodes que j'ai découverte pour gérer les couleurs.
Après la modification de teinte http://www.purebasic.fr/french/viewtopi ... =6&t=11674
Voici une modification plus basique, le changement de la luminosité.
Le principe reste sensiblement le même que pour la modification de la teinte (voir le sujet dont le lien est ci dessus)
la première étape consiste à décomposer la couleur en 3 points :
- Nuance de blanc
- Nuance de noir
- Teinte
Ensuite, je modifie la nuance de noir et de blanc en fonction de la luminosité
Puis j’applique les nouvelles nuances de noir et de blanc à la teinte pour créer la nouvelle couleur.
Code : Tout sélectionner
; Auteur : Le Soldat Inconnu
; Version de PB : 4.50
;
; Explication du programme :
; Changer la satuation d'une couleur
Procedure ColorLuminosity2(Color, Luminosity.d) ; Change color luminisoty ( -1 <= Luminosity <= 1, Luminosity = -1 give black color, Luminosity = 1 give white color)
Protected Rouge, Vert, Bleu, Gris, Rouge_Origine, Bleu_Origine, Vert_Origine, Alpha, a.d, Nuance_Blanc, Nuance_Noir, b.d, i, ii, Level.d
If Luminosity > 1
Luminosity = 1
ElseIf Luminosity < -1
Luminosity = -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
ElseIf (Rouge > 0 And Bleu = 0 And Vert = 0) Or (Rouge = 0 And Bleu > 0 And Vert = 0) Or (Rouge = 0 And Bleu = 0 And Vert > 0)
Nuance_Blanc = 255
Else
Nuance_Blanc = 0
EndIf
If Luminosity < 0
Nuance_Noir - (255 - Nuance_Noir) * Luminosity
ElseIf Nuance_Noir <> 0 Or Nuance_Blanc <> 0
Level = Nuance_Noir /(Nuance_Noir + Nuance_Blanc)
If Luminosity < Level
Nuance_Noir *(1 - Luminosity / Level)
Else
Nuance_Noir = 0
Nuance_Blanc *(1 - (Luminosity - Level) /(1 - Level))
EndIf
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 = 40000
CompilerElse
#NbIterationTestVitesse = 4000000
CompilerEndIf
; Création de la fenêtre et de la GadgetList
If OpenWindow(0, 0, 0, 501, 320, "ColorLuminosity", #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(250, 0, 1, 300, $FF000000)
For i = 0 To 500
Teinte.f = (i - 250) / 250
y = 10
Couleur = $FF00C000
Couleur2 = ColorLuminosity2(Couleur, Teinte)
Line(i, y, 1, 20, Couleur2)
y + 30
Couleur = $FF0000FF
Couleur2 = ColorLuminosity2(Couleur, Teinte)
Line(i, y, 1, 20, Couleur2)
y + 30
Couleur = $FFAF0000
Couleur2 = ColorLuminosity2(Couleur, Teinte)
Line(i, y, 1, 20, Couleur2)
y + 30
Couleur = $FFC0A137
Couleur2 = ColorLuminosity2(Couleur, Teinte)
Line(i, y, 1, 20, Couleur2)
y + 30
Couleur = $FFD6FFAD
Couleur2 = ColorLuminosity2(Couleur, Teinte)
Line(i, y, 1, 20, Couleur2)
y + 30
Couleur = $FFFFFDEC
Couleur2 = ColorLuminosity2(Couleur, Teinte)
Line(i, y, 1, 20, Couleur2)
y + 30
Couleur = $FFFFFFFF
Couleur2 = ColorLuminosity2(Couleur, Teinte)
Line(i, y, 1, 20, Couleur2)
y + 30
Couleur = $FF163205
Couleur2 = ColorLuminosity2(Couleur, Teinte)
Line(i, y, 1, 20, Couleur2)
y + 30
Couleur = $FF000000
Couleur2 = ColorLuminosity2(Couleur, Teinte)
Line(i, y, 1, 20, Couleur2)
y + 30
Couleur = $FF808080
Couleur2 = ColorLuminosity2(Couleur, Teinte)
Line(i, y, 1, 20, Couleur2)
y + 30
Next
Couleur = $FFC0A137
Temps = ElapsedMilliseconds()
For i = 1 To #NbIterationTestVitesse
Couleur2 = ColorLuminosity2(Couleur, -0.5)
Couleur2 = ColorLuminosity2(Couleur, 0.2)
Couleur2 = ColorLuminosity2(Couleur, 0.8)
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 / 3, 2) + "µ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
