PureBasic

Forums PureBasic
Nous sommes le Jeu 20/Juin/2013 10:04

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 10 messages ] 
Auteur Message
 Sujet du message: Changer la teinte d'une couleur
MessagePosté: Dim 27/Mar/2011 22:07 
Hors ligne
Avatar de l’utilisateur

Inscription: Mer 28/Jan/2004 20:58
Messages: 4311
Localisation: Clermont ferrand OU Olsztyn
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:
; 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)]


Haut
 Profil  
 
 Sujet du message: Re: Changer la teinte d'une couleur
MessagePosté: Dim 27/Mar/2011 23:21 
Hors ligne
Avatar de l’utilisateur

Inscription: Mar 06/Avr/2004 10:35
Messages: 1493
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.


Haut
 Profil  
 
 Sujet du message: Re: Changer la teinte d'une couleur
MessagePosté: Mar 29/Mar/2011 14:35 
Hors ligne

Inscription: Mer 11/Nov/2009 18:17
Messages: 1251
Localisation: Poitiers (Vienne)
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


Haut
 Profil  
 
 Sujet du message: Re: Changer la teinte d'une couleur
MessagePosté: Mar 29/Mar/2011 17:40 
Hors ligne
Avatar de l’utilisateur

Inscription: Mer 28/Jan/2004 20:58
Messages: 4311
Localisation: Clermont ferrand OU Olsztyn
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)]


Haut
 Profil  
 
 Sujet du message: Re: Changer la teinte d'une couleur
MessagePosté: Mar 29/Mar/2011 19:37 
Hors ligne
Avatar de l’utilisateur

Inscription: Mer 28/Jan/2004 20:58
Messages: 4311
Localisation: Clermont ferrand OU Olsztyn
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)]


Haut
 Profil  
 
 Sujet du message: Re: Changer la teinte d'une couleur
MessagePosté: Ven 01/Avr/2011 13:27 
Hors ligne

Inscription: Mer 11/Nov/2009 18:17
Messages: 1251
Localisation: Poitiers (Vienne)
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


Haut
 Profil  
 
 Sujet du message: Re: Changer la teinte d'une couleur
MessagePosté: Mer 20/Avr/2011 22:15 
Hors ligne
Avatar de l’utilisateur

Inscription: Mer 28/Jan/2004 20:58
Messages: 4311
Localisation: Clermont ferrand OU Olsztyn
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)]


Haut
 Profil  
 
 Sujet du message: Re: Changer la teinte d'une couleur
MessagePosté: Jeu 21/Avr/2011 0:03 
Hors ligne
Avatar de l’utilisateur

Inscription: Lun 26/Avr/2004 0:40
Messages: 13086
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 :)

_________________
Image


Haut
 Profil  
 
 Sujet du message: Re: Changer la teinte d'une couleur
MessagePosté: Jeu 21/Avr/2011 18:56 
Hors ligne
Avatar de l’utilisateur

Inscription: Mer 28/Jan/2004 20:58
Messages: 4311
Localisation: Clermont ferrand OU Olsztyn
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)]


Haut
 Profil  
 
 Sujet du message: Re: Changer la teinte d'une couleur
MessagePosté: Ven 22/Avr/2011 14:02 
Hors ligne

Inscription: Mer 11/Nov/2009 18:17
Messages: 1251
Localisation: Poitiers (Vienne)
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


Haut
 Profil  
 
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 10 messages ] 

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages

Rechercher:
Aller à:  

 


Powered by phpBB © 2008 phpBB Group | Traduction par: phpBB-fr.com
subSilver+ theme by Canver Software, sponsor Sanal Modifiye